#pragma once #include "Container.hpp" #include namespace gui { struct Page { std::string name; std::shared_ptr panel; }; using page_loader_func = std::function(const std::string& name)>; class Menu : public Container { protected: std::unordered_map pages; std::stack pageStack; Page current; std::unordered_map>> 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& panel); void removePage(const std::string& name); std::shared_ptr 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>& 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(); }; }