From f46e4a7989efc2b95cca6d8834b7d6222718338f Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 28 Jul 2024 22:15:18 +0300 Subject: [PATCH] add trackbar 'sub-consumer' for value label refresh when 'change-on-release' --- res/layouts/pages/settings_display.xml.lua | 7 +++--- res/layouts/pages/settings_graphics.xml.lua | 7 +++--- res/layouts/templates/track_setting.xml | 3 ++- src/data/dynamic_fwd.hpp | 3 +++ src/graphics/ui/elements/TrackBar.cpp | 7 ++++++ src/graphics/ui/elements/TrackBar.hpp | 7 ++++-- src/graphics/ui/gui_xml.cpp | 22 +++++++++---------- src/logic/scripting/scripting_functional.cpp | 23 ++++++++++++++++++++ src/logic/scripting/scripting_functional.hpp | 6 +++++ 9 files changed, 65 insertions(+), 20 deletions(-) diff --git a/res/layouts/pages/settings_display.xml.lua b/res/layouts/pages/settings_display.xml.lua index e861deb3..6e64a7d6 100644 --- a/res/layouts/pages/settings_display.xml.lua +++ b/res/layouts/pages/settings_display.xml.lua @@ -1,7 +1,8 @@ -function create_setting(id, name, step, postfix, tooltip) +function create_setting(id, name, step, postfix, tooltip, changeonrelease) local info = core.get_setting_info(id) postfix = postfix or "" tooltip = tooltip or "" + changeonrelease = changeonrelease or "" document.root:add(gui.template("track_setting", { id=id, name=gui.str(name, "settings"), @@ -10,13 +11,13 @@ function create_setting(id, name, step, postfix, tooltip) max=info.max, step=step, postfix=postfix, - tooltip=tooltip + tooltip=tooltip, + changeonrelease=changeonrelease })) update_setting(core.get_setting(id), id, name, postfix) end function update_setting(x, id, name, postfix) - core.set_setting(id, x) -- updating label document[id..".L"].text = string.format( "%s: %s%s", diff --git a/res/layouts/pages/settings_graphics.xml.lua b/res/layouts/pages/settings_graphics.xml.lua index de00c87b..8a479a1c 100644 --- a/res/layouts/pages/settings_graphics.xml.lua +++ b/res/layouts/pages/settings_graphics.xml.lua @@ -1,7 +1,8 @@ -function create_setting(id, name, step, postfix, tooltip) +function create_setting(id, name, step, postfix, tooltip, changeonrelease) local info = core.get_setting_info(id) postfix = postfix or "" tooltip = tooltip or "" + changeonrelease = changeonrelease or "" document.root:add(gui.template("track_setting", { id=id, name=gui.str(name, "settings"), @@ -10,13 +11,13 @@ function create_setting(id, name, step, postfix, tooltip) max=info.max, step=step, postfix=postfix, - tooltip=tooltip + tooltip=tooltip, + changeonrelease=changeonrelease })) update_setting(core.get_setting(id), id, name, postfix) end function update_setting(x, id, name, postfix) - core.set_setting(id, x) -- updating label document[id..".L"].text = string.format( "%s: %s%s", diff --git a/res/layouts/templates/track_setting.xml b/res/layouts/templates/track_setting.xml index 82ee81c1..519ba334 100644 --- a/res/layouts/templates/track_setting.xml +++ b/res/layouts/templates/track_setting.xml @@ -2,5 +2,6 @@ + consumer='function(x) core.set_setting("%{id}", x) end' change-on-release='%{changeonrelease}' + sub-consumer='function(x) update_setting(x, "%{id}", "%{name}", "%{postfix}") end'/> diff --git a/src/data/dynamic_fwd.hpp b/src/data/dynamic_fwd.hpp index 1a398edd..6faff946 100644 --- a/src/data/dynamic_fwd.hpp +++ b/src/data/dynamic_fwd.hpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace dynamic { class Map; @@ -27,6 +28,8 @@ namespace dynamic { bool, integer_t >; + + using to_string_func = std::function; } #endif // DATA_DYNAMIC_FWD_HPP_ diff --git a/src/graphics/ui/elements/TrackBar.cpp b/src/graphics/ui/elements/TrackBar.cpp index 816b4ae8..ab90b763 100644 --- a/src/graphics/ui/elements/TrackBar.cpp +++ b/src/graphics/ui/elements/TrackBar.cpp @@ -50,6 +50,10 @@ void TrackBar::setConsumer(doubleconsumer consumer) { this->consumer = std::move(consumer); } +void TrackBar::setSubConsumer(doubleconsumer consumer) { + this->subconsumer = std::move(consumer); +} + void TrackBar::mouseMove(GUI*, int x, int) { glm::vec2 pos = calcPos(); value = x - trackWidth/2; @@ -63,6 +67,9 @@ void TrackBar::mouseMove(GUI*, int x, int) { if (consumer && !changeOnRelease) { consumer(value); } + if (subconsumer) { + subconsumer(value); + } } void TrackBar::mouseRelease(GUI*, int, int) { diff --git a/src/graphics/ui/elements/TrackBar.hpp b/src/graphics/ui/elements/TrackBar.hpp index 9a9fcad1..6e055e61 100644 --- a/src/graphics/ui/elements/TrackBar.hpp +++ b/src/graphics/ui/elements/TrackBar.hpp @@ -2,6 +2,7 @@ #define GRAPHICS_UI_ELEMENTS_TRACKBAR_HPP_ #include "UINode.hpp" +#include "../../../data/dynamic_fwd.hpp" namespace gui { class TrackBar : public UINode { @@ -9,6 +10,7 @@ namespace gui { glm::vec4 trackColor {1.0f, 1.0f, 1.0f, 0.4f}; doublesupplier supplier = nullptr; doubleconsumer consumer = nullptr; + doubleconsumer subconsumer = nullptr; double min; double max; double value; @@ -23,8 +25,9 @@ namespace gui { int trackWidth=12); virtual void draw(const DrawContext* pctx, Assets* assets) override; - virtual void setSupplier(doublesupplier supplier); - virtual void setConsumer(doubleconsumer consumer); + virtual void setSupplier(doublesupplier); + virtual void setConsumer(doubleconsumer); + virtual void setSubConsumer(doubleconsumer); virtual void mouseMove(GUI*, int x, int y) override; virtual void mouseRelease(GUI*, int x, int y) override; diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index e4e8310b..297ee4ac 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -392,26 +392,26 @@ static std::shared_ptr readImage(UiXmlReader& reader, const xml::xmlelem } static std::shared_ptr readTrackBar(UiXmlReader& reader, const xml::xmlelement& element) { - float min = element->attr("min", "0.0").asFloat(); - float max = element->attr("max", "1.0").asFloat(); + const auto& env = reader.getEnvironment(); + const auto& file = reader.getFilename(); + float minv = element->attr("min", "0.0").asFloat(); + float maxv = element->attr("max", "1.0").asFloat(); float def = element->attr("value", "0.0").asFloat(); float step = element->attr("step", "1.0").asFloat(); int trackWidth = element->attr("track-width", "12").asInt(); - auto bar = std::make_shared(min, max, def, step, trackWidth); + auto bar = std::make_shared(minv, maxv, def, step, trackWidth); _readUINode(reader, element, *bar); if (element->has("consumer")) { bar->setConsumer(scripting::create_number_consumer( - reader.getEnvironment(), - element->attr("consumer").getText(), - reader.getFilename() - )); + env, element->attr("consumer").getText(), file)); + } + if (element->has("sub-consumer")) { + bar->setSubConsumer(scripting::create_number_consumer( + env, element->attr("sub-consumer").getText(), file)); } if (element->has("supplier")) { bar->setSupplier(scripting::create_number_supplier( - reader.getEnvironment(), - element->attr("supplier").getText(), - reader.getFilename() - )); + env, element->attr("supplier").getText(), file)); } if (element->has("track-color")) { bar->setTrackColor(element->attr("track-color").asColor()); diff --git a/src/logic/scripting/scripting_functional.cpp b/src/logic/scripting/scripting_functional.cpp index b758f336..b3ad82af 100644 --- a/src/logic/scripting/scripting_functional.cpp +++ b/src/logic/scripting/scripting_functional.cpp @@ -2,6 +2,7 @@ #include "lua/lua_engine.hpp" #include "../../debug/Logger.hpp" +#include "../../coders/json.hpp" #include "../../util/stringutil.hpp" using namespace scripting; @@ -177,3 +178,25 @@ vec2supplier scripting::create_vec2_supplier( return glm::vec2(0, 0); }; } + +dynamic::to_string_func scripting::create_tostring( + const scriptenv& env, + const std::string& src, + const std::string& file +) { + auto L = lua::get_main_thread(); + try { + lua::loadbuffer(L, *env, src, file); + lua::call(L, 0, 1); + auto func = lua::create_lambda(L); + return [func](const dynamic::Value& value) { + auto result = func({value}); + return json::stringify(result, true, " "); + }; + } catch (const lua::luaerror& err) { + logger.error() << err.what(); + return [](const auto& value) { + return json::stringify(value, true, " "); + }; + } +} diff --git a/src/logic/scripting/scripting_functional.hpp b/src/logic/scripting/scripting_functional.hpp index 9b1cc715..01141262 100644 --- a/src/logic/scripting/scripting_functional.hpp +++ b/src/logic/scripting/scripting_functional.hpp @@ -72,6 +72,12 @@ namespace scripting { const std::string& src, const std::string& file="" ); + + dynamic::to_string_func create_tostring( + const scriptenv& env, + const std::string& src, + const std::string& file="" + ); } #endif // LOGIC_SCRIPTING_SCRIPTING_FUNCTIONAL_HPP_