59 lines
1.9 KiB
C++
59 lines
1.9 KiB
C++
#pragma once
|
|
|
|
#include "Container.hpp"
|
|
|
|
#include <stack>
|
|
|
|
namespace gui {
|
|
struct Page {
|
|
std::string name;
|
|
std::shared_ptr<UINode> panel;
|
|
};
|
|
|
|
using page_loader_func = std::function<std::shared_ptr<UINode>(const std::string& name)>;
|
|
|
|
class Menu : public Container {
|
|
protected:
|
|
std::unordered_map<std::string, Page> pages;
|
|
std::stack<Page> pageStack;
|
|
Page current;
|
|
std::unordered_map<std::string, supplier<std::shared_ptr<UINode>>> pageSuppliers;
|
|
page_loader_func pagesLoader = nullptr;
|
|
public:
|
|
Menu();
|
|
|
|
/// @brief Check menu have page or page supplier
|
|
/// @param name page name
|
|
bool has(const std::string& name);
|
|
|
|
/// @brief Set current page to specified one.
|
|
/// @param name page or page supplier name
|
|
/// @param history previous page will not be saved in history if false
|
|
void setPage(const std::string &name, bool history=true);
|
|
void setPage(Page page, bool history=true);
|
|
void addPage(const std::string& name, const std::shared_ptr<UINode>& panel);
|
|
void removePage(const std::string& name);
|
|
std::shared_ptr<UINode> fetchPage(const std::string& name);
|
|
|
|
/// @brief Add page supplier used if page is not found
|
|
/// @param name page name
|
|
/// @param pageSupplier page supplier function
|
|
void addSupplier(const std::string& name, const supplier<std::shared_ptr<UINode>>& pageSupplier);
|
|
|
|
/// @brief Page loader is called if accessed page is not found
|
|
void setPageLoader(page_loader_func loader);
|
|
|
|
/// @brief Set page to previous saved in history
|
|
void back();
|
|
|
|
/// @brief Clear pages history
|
|
void clearHistory();
|
|
|
|
/// @brief Clear history and remove and set page to null
|
|
void reset();
|
|
|
|
/// @brief Get current page
|
|
Page& getCurrent();
|
|
};
|
|
}
|