mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-08 20:41:49 +00:00
fix temporary pages
This commit is contained in:
parent
48aad8d974
commit
435a8299b7
3 changed files with 31 additions and 21 deletions
|
|
@ -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<UINode>& panel) {
|
||||
pages[name] = Page {name, panel};
|
||||
void Menu::addPage(
|
||||
const std::string& name, const std::shared_ptr<UINode>& 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<std::shared_ptr<U
|
|||
pageSuppliers[name] = pageSupplier;
|
||||
}
|
||||
|
||||
std::shared_ptr<UINode> 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);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ namespace gui {
|
|||
struct Page {
|
||||
std::string name;
|
||||
std::shared_ptr<UINode> panel;
|
||||
bool temporal = false;
|
||||
};
|
||||
|
||||
using page_loader_func = std::function<std::shared_ptr<UINode>(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<UINode>& panel);
|
||||
void addPage(
|
||||
const std::string& name,
|
||||
const std::shared_ptr<UINode>& panel,
|
||||
bool temporal = false
|
||||
);
|
||||
void removePage(const std::string& name);
|
||||
std::shared_ptr<UINode> 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<std::shared_ptr<UINode>>& pageSupplier);
|
||||
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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue