From 435a8299b75e36577416a22cf5e295e5512bdb8e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 5 Jan 2025 23:41:00 +0300 Subject: [PATCH] fix temporary pages --- src/graphics/ui/elements/Menu.cpp | 26 ++++++++++++++------------ src/graphics/ui/elements/Menu.hpp | 14 +++++++++++--- src/graphics/ui/gui_util.cpp | 12 ++++++------ 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/graphics/ui/elements/Menu.cpp b/src/graphics/ui/elements/Menu.cpp index 49cf1908..898f8797 100644 --- a/src/graphics/ui/elements/Menu.cpp +++ b/src/graphics/ui/elements/Menu.cpp @@ -13,8 +13,10 @@ bool Menu::has(const std::string& name) { pageSuppliers.find(name) != pageSuppliers.end(); } -void Menu::addPage(const std::string& name, const std::shared_ptr& panel) { - pages[name] = Page {name, panel}; +void Menu::addPage( + const std::string& name, const std::shared_ptr& panel, bool temporal +) { + pages[name] = Page {name, panel, temporal}; } void Menu::removePage(const std::string& name) { @@ -25,26 +27,26 @@ void Menu::addSupplier(const std::string& name, const supplier Menu::fetchPage(const std::string& name) { +Page Menu::fetchPage(const std::string& name) { auto found = pages.find(name); if (found == pages.end()) { auto supplier = pageSuppliers.find(name); if (supplier == pageSuppliers.end()) { if (pagesLoader) { - return pagesLoader(name); + return {name, pagesLoader(name), false}; } - return nullptr; + return {}; } else { - return supplier->second(); + return {name, supplier->second(), false}; // supplied pages caching is not implemented } } else { - return found->second.panel; + return found->second; } } void Menu::setPage(const std::string &name, bool history) { - Page page {name, fetchPage(name)}; + Page page = fetchPage(name); if (page.panel == nullptr) { throw std::runtime_error("no page found"); } @@ -54,7 +56,7 @@ void Menu::setPage(const std::string &name, bool history) { void Menu::setPage(Page page, bool history) { if (current.panel) { Container::remove(current.panel); - if (history) { + if (history && !current.temporal) { pageStack.push(current); } } @@ -68,10 +70,10 @@ void Menu::back() { return; Page page = pageStack.top(); pageStack.pop(); - + auto updated = fetchPage(page.name); - if (updated) { - page.panel = updated; + if (updated.panel) { + page.panel = updated.panel; } setPage(page, false); diff --git a/src/graphics/ui/elements/Menu.hpp b/src/graphics/ui/elements/Menu.hpp index 4d30f373..b9cb213b 100644 --- a/src/graphics/ui/elements/Menu.hpp +++ b/src/graphics/ui/elements/Menu.hpp @@ -8,6 +8,7 @@ namespace gui { struct Page { std::string name; std::shared_ptr panel; + bool temporal = false; }; using page_loader_func = std::function(const std::string& name)>; @@ -31,14 +32,21 @@ namespace gui { /// @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 addPage( + const std::string& name, + const std::shared_ptr& panel, + bool temporal = false + ); void removePage(const std::string& name); - std::shared_ptr fetchPage(const std::string& name); + Page 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); + 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); diff --git a/src/graphics/ui/gui_util.cpp b/src/graphics/ui/gui_util.cpp index a94c3a94..1c442f55 100644 --- a/src/graphics/ui/gui_util.cpp +++ b/src/graphics/ui/gui_util.cpp @@ -36,12 +36,12 @@ void guiutil::alert( auto menu = engine.getGUI()->getMenu(); runnable on_hidden_final = [on_hidden, menu, &engine]() { + menu->removePage(""); if (on_hidden) { on_hidden(); } else { menu->back(); } - menu->removePage(""); }; auto label = std::make_shared