content menu moved to xml (no icons yet)

This commit is contained in:
MihailRis
2024-04-18 22:15:23 +03:00
parent 49d57b307b
commit 64820020f8
14 changed files with 91 additions and 172 deletions
+8 -1
View File
@@ -268,11 +268,14 @@ void Menu::addSupplier(std::string name, supplier<std::shared_ptr<UINode>> pageS
pageSuppliers[name] = pageSupplier;
}
std::shared_ptr<UINode> Menu::fetchPage(std::string name) {
std::shared_ptr<UINode> 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 nullptr;
} else {
return supplier->second();
@@ -318,6 +321,10 @@ void Menu::back() {
setPage(page, false);
}
void Menu::setPageLoader(page_loader_func loader) {
pagesLoader = loader;
}
Page& Menu::getCurrent() {
return current;
}
+7 -1
View File
@@ -94,12 +94,15 @@ namespace gui {
}
};
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();
@@ -113,13 +116,16 @@ namespace gui {
void setPage(std::string name, bool history=true);
void setPage(Page page, bool history=true);
void addPage(std::string name, std::shared_ptr<UINode> panel);
std::shared_ptr<UINode> fetchPage(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(std::string name, 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();
+11 -9
View File
@@ -102,18 +102,20 @@ static void _readUINode(UiXmlReader& reader, xml::xmlelement element, UINode& no
}
if (element->has("onclick")) {
auto callback = scripting::create_runnable(
reader.getEnvironment().getId(),
element->attr("onclick").getText(),
reader.getFilename()
);
node.listenAction([callback](GUI*) {
callback();
});
std::string text = element->attr("onclick").getText();
if (!text.empty()) {
auto callback = scripting::create_runnable(
reader.getEnvironment().getId(),
text,
reader.getFilename()
);
node.listenAction([callback](GUI*) {
callback();
});
}
}
}
static void _readContainer(UiXmlReader& reader, xml::xmlelement element, Container& container) {
_readUINode(reader, element, container);