From 96576bc6cab35485c8874270f02ff2130bc5f143 Mon Sep 17 00:00:00 2001 From: nullifiedcat Date: Mon, 30 Jul 2018 10:23:31 +0300 Subject: [PATCH] UI updates --- data/menu/menu.xml | 18 +-- data/menu/nullified-ui.xml | 146 ++++++++++++++++++ external/libglez | 2 +- .../visual/menu/menu/object/input/Slider.hpp | 4 + .../visual/menu/menu/object/input/Spinner.hpp | 5 + .../menu/menu/special/SettingsManagerList.hpp | 13 +- .../menu/menu/special/VariableListEntry.hpp | 2 + include/visual/menu/menu/wm/WMWindow.hpp | 2 + src/visual/menu/menu/Menu.cpp | 27 +++- src/visual/menu/menu/ObjectFactory.cpp | 16 +- .../menu/objects/container/ScrollableList.cpp | 20 ++- .../menu/menu/objects/input/Checkbox.cpp | 7 +- .../menu/menu/objects/input/ColorSelector.cpp | 7 +- .../menu/menu/objects/input/InputKey.cpp | 7 +- src/visual/menu/menu/objects/input/Select.cpp | 4 + .../menu/menu/objects/input/StringInput.cpp | 8 +- .../menu/menu/special/SettingsManagerList.cpp | 30 +++- .../menu/menu/special/VariableListEntry.cpp | 10 ++ src/visual/menu/menu/wm/Task.cpp | 4 +- src/visual/menu/menu/wm/WMWindow.cpp | 9 +- src/visual/menu/menu/wm/WindowHeader.cpp | 4 +- 21 files changed, 304 insertions(+), 41 deletions(-) create mode 100644 data/menu/nullified-ui.xml diff --git a/data/menu/menu.xml b/data/menu/menu.xml index 7dc68363..864b08a2 100644 --- a/data/menu/menu.xml +++ b/data/menu/menu.xml @@ -2,20 +2,10 @@ - + - - 300+ - - - - - - - - - - - \ No newline at end of file + + + diff --git a/data/menu/nullified-ui.xml b/data/menu/nullified-ui.xml new file mode 100644 index 00000000..4d75fdb0 --- /dev/null +++ b/data/menu/nullified-ui.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/external/libglez b/external/libglez index 6edbc9e4..1e03d384 160000 --- a/external/libglez +++ b/external/libglez @@ -1 +1 @@ -Subproject commit 6edbc9e4a2025cdae22ff134e0be57fb8bd1e232 +Subproject commit 1e03d3843fec67f313b285ec987ced90a17aba39 diff --git a/include/visual/menu/menu/object/input/Slider.hpp b/include/visual/menu/menu/object/input/Slider.hpp index 9c3f3cbf..beca33f2 100644 --- a/include/visual/menu/menu/object/input/Slider.hpp +++ b/include/visual/menu/menu/object/input/Slider.hpp @@ -110,6 +110,10 @@ public: { std::string str(target); opt = settings::Manager::instance().lookup(str); + if (opt) + { + zerokernel::special::SettingsManagerList::markVariable(target); + } } if constexpr (std::is_same::value) diff --git a/include/visual/menu/menu/object/input/Spinner.hpp b/include/visual/menu/menu/object/input/Spinner.hpp index acf8aaaa..2525e430 100644 --- a/include/visual/menu/menu/object/input/Spinner.hpp +++ b/include/visual/menu/menu/object/input/Spinner.hpp @@ -5,6 +5,7 @@ #pragma once #include +#include namespace zerokernel { @@ -67,6 +68,10 @@ public: { std::string str(target); opt = settings::Manager::instance().lookup(str); + if (opt) + { + zerokernel::special::SettingsManagerList::markVariable(target); + } } if constexpr (std::is_same::value) diff --git a/include/visual/menu/menu/special/SettingsManagerList.hpp b/include/visual/menu/menu/special/SettingsManagerList.hpp index c6dc8d08..832bef3a 100644 --- a/include/visual/menu/menu/special/SettingsManagerList.hpp +++ b/include/visual/menu/menu/special/SettingsManagerList.hpp @@ -20,6 +20,7 @@ public: { public: settings::IVariable *variable{ nullptr }; + std::string full_name{}; std::vector> nodes{}; TreeNode& operator[](const std::string& path); }; @@ -34,7 +35,17 @@ public: void addCollapsible(std::string name, size_t depth); - void addVariable(std::string name, size_t depth, settings::IVariable *variable); + void addVariable(std::string name, size_t depth, settings::IVariable *variable, bool registered); + + // + + static void markVariable(std::string name); + + static bool isVariableMarked(std::string name); + + static void resetMarks(); + + // TreeNode root{}; Container& list; diff --git a/include/visual/menu/menu/special/VariableListEntry.hpp b/include/visual/menu/menu/special/VariableListEntry.hpp index 127659c7..d610b42f 100644 --- a/include/visual/menu/menu/special/VariableListEntry.hpp +++ b/include/visual/menu/menu/special/VariableListEntry.hpp @@ -40,6 +40,8 @@ public: void setDepth(int depth) override; + void markPresentInUi(); + std::unique_ptr createCheckbox(settings::IVariable *variable); std::unique_ptr createSpinner(settings::IVariable *variable); diff --git a/include/visual/menu/menu/wm/WMWindow.hpp b/include/visual/menu/menu/wm/WMWindow.hpp index e2551ed2..bae00ff4 100644 --- a/include/visual/menu/menu/wm/WMWindow.hpp +++ b/include/visual/menu/menu/wm/WMWindow.hpp @@ -39,6 +39,8 @@ public: bool isHidden() override; + bool isFocused(); + // Functions void moveObjects(); diff --git a/src/visual/menu/menu/Menu.cpp b/src/visual/menu/menu/Menu.cpp index ee78defb..73703b53 100644 --- a/src/visual/menu/menu/Menu.cpp +++ b/src/visual/menu/menu/Menu.cpp @@ -18,6 +18,7 @@ #include #include #include +#include static void recursiveXmlResolveIncludes(const std::string& directory, tinyxml2::XMLElement *element) { @@ -40,14 +41,29 @@ static void recursiveXmlResolveIncludes(const std::string& directory, tinyxml2:: { printf("File loaded\n"); auto content = document.RootElement()->DeepClone(c->GetDocument()); - auto next = content; - element->InsertAfterChild(c, content); - element->DeleteChild(c); - c = content->ToElement(); - continue; + element->InsertAfterChild(c, content); + element->DeleteChild(c); + c = content->ToElement(); + continue; } } } + if (!strcmp("ElementGroup", c->Name())) + { + auto it = c->FirstChild(); + auto prev = c; + while (it) + { + auto next = it->NextSibling(); + element->InsertAfterChild(prev, it); + printf("GroupedElement: %s\n", it->ToElement()->Name()); + it = next; + } + auto n = c->NextSiblingElement(); + element->DeleteChild(c); + c = n; + continue; + } recursiveXmlResolveIncludes(directory, c); c = c->NextSiblingElement(); } @@ -169,6 +185,7 @@ void Menu::destroy() void Menu::reset() { + special::SettingsManagerList::resetMarks(); wm = std::make_unique(); wm->init(); ready = true; diff --git a/src/visual/menu/menu/ObjectFactory.cpp b/src/visual/menu/menu/ObjectFactory.cpp index 040870f3..5ad3165b 100644 --- a/src/visual/menu/menu/ObjectFactory.cpp +++ b/src/visual/menu/menu/ObjectFactory.cpp @@ -73,7 +73,7 @@ ObjectFactory::createObjectFromXml(const tinyxml2::XMLElement *element) if (EXIT_SUCCESS == strcmp("int", type)) result = std::make_unique>(); else if (EXIT_SUCCESS == strcmp("float", type)) - result = std::make_unique>(); + result = std::make_unique>(); } } else if (type == "StringInput") @@ -104,6 +104,8 @@ ObjectFactory::createAutoVariable(const tinyxml2::XMLElement *element) return nullptr; } + special::SettingsManagerList::markVariable(name); + std::unique_ptr control{ nullptr }; switch (var->getType()) @@ -134,7 +136,11 @@ ObjectFactory::createAutoVariable(const tinyxml2::XMLElement *element) if (!element->QueryIntAttribute("min", &min) && !element->QueryIntAttribute("max", &max)) { // Make a slider - control = std::make_unique>(*obj); + auto slider = std::make_unique>(*obj); + slider->min = min; + slider->max = max; + element->QueryIntAttribute("step", &slider->step); + control = std::move(slider); } else { @@ -156,7 +162,11 @@ ObjectFactory::createAutoVariable(const tinyxml2::XMLElement *element) if (!element->QueryFloatAttribute("min", &min) && !element->QueryFloatAttribute("max", &max)) { // Make a slider - control = std::make_unique>(*obj); + auto slider = std::make_unique>(*obj); + slider->min = min; + slider->max = max; + element->QueryFloatAttribute("step", &slider->step); + control = std::move(slider); } else { diff --git a/src/visual/menu/menu/objects/container/ScrollableList.cpp b/src/visual/menu/menu/objects/container/ScrollableList.cpp index 14a62f10..df1f2ead 100644 --- a/src/visual/menu/menu/objects/container/ScrollableList.cpp +++ b/src/visual/menu/menu/objects/container/ScrollableList.cpp @@ -57,7 +57,16 @@ void zerokernel::ScrollableList::scrollUp() { if (start_index == 0) return; - --start_index; + + auto delta = 1; + + if (SDL_GetModState() & KMOD_SHIFT) + delta = 4; + + if (delta > start_index) + delta = start_index; + + start_index -= delta; updateScroll(); } @@ -66,7 +75,14 @@ void zerokernel::ScrollableList::scrollDown() // FIXME /*if (end_index >= objects.size() - 1) return;*/ - ++start_index; + + auto delta = 1; + + if (SDL_GetModState() & KMOD_SHIFT) + delta = 4; + + start_index += delta; + updateScroll(); } diff --git a/src/visual/menu/menu/objects/input/Checkbox.cpp b/src/visual/menu/menu/objects/input/Checkbox.cpp index 69f3a310..1822185a 100644 --- a/src/visual/menu/menu/objects/input/Checkbox.cpp +++ b/src/visual/menu/menu/objects/input/Checkbox.cpp @@ -3,6 +3,7 @@ */ #include +#include static settings::RVariable checkbox_size{ "zk.style.checkbox.size", "12" }; static settings::RVariable color_border{ "zk.style.checkbox.color.border", "079797" }; @@ -61,6 +62,10 @@ void zerokernel::Checkbox::loadFromXml(const tinyxml2::XMLElement *data) { std::string str(target); auto opt = settings::Manager::instance().lookup(str); - option = dynamic_cast *>(opt); + if (opt) + { + option = dynamic_cast *>(opt); + zerokernel::special::SettingsManagerList::markVariable(target); + } } } diff --git a/src/visual/menu/menu/objects/input/ColorSelector.cpp b/src/visual/menu/menu/objects/input/ColorSelector.cpp index d3ffbfad..d27caa68 100644 --- a/src/visual/menu/menu/objects/input/ColorSelector.cpp +++ b/src/visual/menu/menu/objects/input/ColorSelector.cpp @@ -5,6 +5,7 @@ #include #include #include +#include static settings::RVariable default_width{ "zk.style.input.color.width", "36" }; static settings::RVariable default_height{ "zk.style.input.color.height", "14" }; @@ -59,7 +60,11 @@ void ColorSelector::loadFromXml(const tinyxml2::XMLElement *data) { std::string str(target); auto opt = settings::Manager::instance().lookup(str); - variable = dynamic_cast *>(opt); + if (opt) + { + variable = dynamic_cast *>(opt); + zerokernel::special::SettingsManagerList::markVariable(target); + } } } diff --git a/src/visual/menu/menu/objects/input/InputKey.cpp b/src/visual/menu/menu/objects/input/InputKey.cpp index 48b9efe6..b700556c 100644 --- a/src/visual/menu/menu/objects/input/InputKey.cpp +++ b/src/visual/menu/menu/objects/input/InputKey.cpp @@ -2,6 +2,7 @@ Created on 27.07.18. */ #include +#include static settings::RVariable default_width{ "zk.style.input.key.width", "60" }; static settings::RVariable default_height{ "zk.style.input.key.height", "14" }; @@ -102,7 +103,11 @@ void zerokernel::InputKey::loadFromXml(const tinyxml2::XMLElement *data) { std::string str(target); auto opt = settings::Manager::instance().lookup(str); - key = dynamic_cast *>(opt); + if (opt) + { + key = dynamic_cast *>(opt); + zerokernel::special::SettingsManagerList::markVariable(target); + } } } diff --git a/src/visual/menu/menu/objects/input/Select.cpp b/src/visual/menu/menu/objects/input/Select.cpp index 7dceffa8..1cee32fe 100644 --- a/src/visual/menu/menu/objects/input/Select.cpp +++ b/src/visual/menu/menu/objects/input/Select.cpp @@ -5,6 +5,7 @@ #include #include #include +#include static settings::RVariable color_border{ "zk.style.input.select.border", "079797" }; @@ -99,7 +100,10 @@ void zerokernel::Select::loadFromXml(const tinyxml2::XMLElement *data) printf("WARNING: Creating Select element: could not find settings '%s'\n", target); } else + { + zerokernel::special::SettingsManagerList::markVariable(target); variable = var; + } } auto child = data->FirstChildElement(nullptr); diff --git a/src/visual/menu/menu/objects/input/StringInput.cpp b/src/visual/menu/menu/objects/input/StringInput.cpp index 55198d3b..d71f3217 100644 --- a/src/visual/menu/menu/objects/input/StringInput.cpp +++ b/src/visual/menu/menu/objects/input/StringInput.cpp @@ -3,6 +3,7 @@ */ #include +#include static settings::RVariable default_width{ "zk.style.input.string.width", "60" }; static settings::RVariable default_height{ "zk.style.input.string.height", "14" }; @@ -44,7 +45,10 @@ void zerokernel::StringInput::loadFromXml(const tinyxml2::XMLElement *data) const char *target{ nullptr }; if (tinyxml2::XML_SUCCESS == data->QueryStringAttribute("target", &target)) { - std::string str(target); - option = settings::Manager::instance().lookup(str); + option = settings::Manager::instance().lookup(target); + if (option) + { + zerokernel::special::SettingsManagerList::markVariable(target); + } } } diff --git a/src/visual/menu/menu/special/SettingsManagerList.cpp b/src/visual/menu/menu/special/SettingsManagerList.cpp index 93dc439b..77509f64 100644 --- a/src/visual/menu/menu/special/SettingsManagerList.cpp +++ b/src/visual/menu/menu/special/SettingsManagerList.cpp @@ -7,6 +7,8 @@ #include #include #include +#include + zerokernel::special::SettingsManagerList::SettingsManagerList( zerokernel::Container &list): list(list) @@ -35,6 +37,7 @@ void zerokernel::special::SettingsManagerList::construct() { node = &((*node)[n]); } + node->full_name = v.first; node->variable = v.second; } @@ -50,8 +53,7 @@ void zerokernel::special::SettingsManagerList::recursiveWork(zerokernel::special { if (n.second.variable) { - addVariable(n.first, depth, n.second.variable); - printf("depth %u: settings %s\n", depth, n.first.c_str()); + addVariable(n.first, depth, n.second.variable, isVariableMarked(n.second.full_name)); } if (!n.second.nodes.empty()) @@ -99,12 +101,14 @@ zerokernel::special::SettingsManagerList::TreeNode::operator[]( } void zerokernel::special::SettingsManagerList::addVariable(std::string name, size_t depth, - settings::IVariable *variable) + settings::IVariable *variable, bool registered) { auto entry = std::make_unique(); entry->setText(name); entry->setVariable(variable); entry->setDepth(depth); + if (registered) + entry->markPresentInUi(); list.addObject(std::move(entry)); } @@ -114,4 +118,22 @@ void zerokernel::special::SettingsManagerList::addCollapsible(std::string name, entry->setText(name); entry->setDepth(depth); list.addObject(std::move(entry)); -} \ No newline at end of file +} + +static std::unordered_map marks{}; + +void zerokernel::special::SettingsManagerList::markVariable(std::string name) +{ + marks[name] = true; +} + +void zerokernel::special::SettingsManagerList::resetMarks() +{ + marks.clear(); +} + +bool +zerokernel::special::SettingsManagerList::isVariableMarked(std::string name) +{ + return marks.find(name) != marks.end(); +} diff --git a/src/visual/menu/menu/special/VariableListEntry.cpp b/src/visual/menu/menu/special/VariableListEntry.cpp index 060c46b7..d43ebd40 100644 --- a/src/visual/menu/menu/special/VariableListEntry.cpp +++ b/src/visual/menu/menu/special/VariableListEntry.cpp @@ -5,6 +5,11 @@ #include #include #include +#include +#include + + +static settings::RVariable marked_color{ "zk.color.variable-list.color.registered", "ffff00" }; /* Created on 26.07.18. @@ -198,3 +203,8 @@ void zerokernel::VariableListEntry::setDepth(int depth) label.move(depth * 5 + 4, 0); } + +void zerokernel::VariableListEntry::markPresentInUi() +{ + label.setColorText(&*marked_color); +} diff --git a/src/visual/menu/menu/wm/Task.cpp b/src/visual/menu/menu/wm/Task.cpp index 955452dd..d9346931 100644 --- a/src/visual/menu/menu/wm/Task.cpp +++ b/src/visual/menu/menu/wm/Task.cpp @@ -21,7 +21,7 @@ void zerokernel::Task::render() renderBackground(*color_hovered); renderBorder(*color_border); - if (window.focused) + if (window.isFocused()) { text.setColorText(&*color_focused); } @@ -44,7 +44,7 @@ bool zerokernel::Task::onLeftMouseClick() } else { - if (window.focused) + if (window.isFocused()) window.wmCloseWindow(); else window.requestFocus(); diff --git a/src/visual/menu/menu/wm/WMWindow.cpp b/src/visual/menu/menu/wm/WMWindow.cpp index 47ca75bb..d20ce418 100644 --- a/src/visual/menu/menu/wm/WMWindow.cpp +++ b/src/visual/menu/menu/wm/WMWindow.cpp @@ -43,7 +43,7 @@ void WMWindow::render() if (isHidden()) return; - if (focused) + if (isFocused()) renderBackground(*color_background); else renderBackground(*color_background_inactive); @@ -177,7 +177,12 @@ void WMWindow::reorderElements() bool WMWindow::isHidden() { - return BaseMenuObject::isHidden() || Menu::instance->isInGame(); + return BaseMenuObject::isHidden() || (Menu::instance->isInGame() && !should_render_in_game); +} + +bool WMWindow::isFocused() +{ + return focused && !Menu::instance->isInGame(); } } \ No newline at end of file diff --git a/src/visual/menu/menu/wm/WindowHeader.cpp b/src/visual/menu/menu/wm/WindowHeader.cpp index 4976f59c..1a572fba 100644 --- a/src/visual/menu/menu/wm/WindowHeader.cpp +++ b/src/visual/menu/menu/wm/WindowHeader.cpp @@ -54,9 +54,9 @@ bool zerokernel::WindowHeader::handleSdlEvent(SDL_Event *event) void zerokernel::WindowHeader::render() { - renderBackground(window.focused ? *color_background_focused : *color_background); + renderBackground(window.isFocused() ? *color_background_focused : *color_background); //glez::draw::line(bb.getBorderBox().left(), bb.getBorderBox().bottom() - 1, bb.getBorderBox().width, 0, window.focused ? *color_border_focused : *color_border, 1); - renderBorder(window.focused ? *color_border_focused : *color_border); + renderBorder(window.isFocused() ? *color_border_focused : *color_border); Container::render(); }