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_