From d04fb4f8867f00f3f37d1e0fc101e4ece80cf237 Mon Sep 17 00:00:00 2001 From: Ezhulka Date: Fri, 31 Jul 2026 21:05:57 +0300 Subject: [PATCH] xml and lua support --- src/graphics/ui/gui_xml.cpp | 43 +++++++++++++ src/logic/scripting/lua/libs/libgui.cpp | 86 +++++++++++++++++++++++++ 2 files changed, 129 insertions(+) diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index e91b4553f..38e90d43a 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -15,6 +15,7 @@ #include "elements/Menu.hpp" #include "elements/ModelViewer.hpp" #include "elements/Panel.hpp" +#include "elements/ProgressBar.hpp" #include "elements/SelectBox.hpp" #include "elements/SplitBox.hpp" #include "elements/TextBox.hpp" @@ -716,6 +717,47 @@ static std::shared_ptr read_track_bar( return bar; } +static std::shared_ptr read_progress_bar( + const UiXmlReader& reader, + const xml::xmlelement& element +) { + const auto& env = reader.getEnvironment(); + const auto& file = reader.getFilename(); + double minv = element.attr("min", "0.0").asFloat(); + double maxv = element.attr("max", "100.0").asFloat(); + double def = element.attr("value", "0.0").asFloat(); + int thickness = element.attr("bar-thickness", "-1").asInt(); + auto bar = std::make_shared( + reader.getGUI(), minv, maxv, def, thickness + ); + read_uinode(reader, element, *bar); + if (element.has("supplier")) { + bar->setSupplier(scripting::create_number_supplier(env, element.attr("supplier").getText(), file)); + } + if (element.has("bar-color")) { + bar->setBarColor(element.attr("bar-color").asColor()); + } + if (element.has("bg-color")) { + bar->setBgColor(element.attr("bg-color").asColor()); + } + if (element.has("text-format")) { + bar->setTextFormat(element.attr("text-format").getText()); + } + if (element.has("text-color")) { + bar->setTextColor(element.attr("text-color").asColor()); + } + if (element.has("smooth")) { + bar->setSmooth(element.attr("smooth").asBool()); + } + if (element.has("orientation")) { + auto& oname = element.attr("orientation").getText(); + if (oname == "vertical") { + bar->setOrientation(Orientation::VERTICAL); + } + } + return bar; +} + static std::shared_ptr read_input_bind_box( UiXmlReader& reader, const xml::xmlelement& element ) { @@ -901,6 +943,7 @@ UiXmlReader::UiXmlReader(gui::GUI& gui, const scriptenv& env) add("select", read_select); add("textbox", read_text_box); add("pagebox", read_page_box); + add("progressbar", read_progress_bar); add("splitbox", read_split_box); add("checkbox", read_check_box); add("trackbar", read_track_bar); diff --git a/src/logic/scripting/lua/libs/libgui.cpp b/src/logic/scripting/lua/libs/libgui.cpp index 057dc205e..6bbac4f6f 100644 --- a/src/logic/scripting/lua/libs/libgui.cpp +++ b/src/logic/scripting/lua/libs/libgui.cpp @@ -12,6 +12,7 @@ #include "graphics/ui/elements/InventoryView.hpp" #include "graphics/ui/elements/Menu.hpp" #include "graphics/ui/elements/Panel.hpp" +#include "graphics/ui/elements/ProgressBar.hpp" #include "graphics/ui/elements/TextBox.hpp" #include "graphics/ui/elements/TrackBar.hpp" #include "graphics/ui/elements/InlineFrame.hpp" @@ -263,15 +264,54 @@ static int p_is_checked(UINode* node, lua::State* L) { static int p_get_value(UINode* node, lua::State* L) { if (auto bar = dynamic_cast(node)) { return lua::pushnumber(L, bar->getValue()); + } else if (auto bar = dynamic_cast(node)) { + return lua::pushnumber(L, bar->getValue()); } else if (auto box = dynamic_cast(node)) { return lua::pushstring(L, box->getSelected().value); } return 0; } +static int p_get_progress(UINode* node, lua::State* L) { + if (auto bar = dynamic_cast(node)) { + return lua::pushnumber(L, bar->getProgress()); + } + return 0; +} + +static int p_get_bar_color(UINode* node, lua::State* L) { + if (auto bar = dynamic_cast(node)) { + return lua::pushcolor(L, bar->getBarColor()); + } + return 0; +} + +static int p_get_bg_color(UINode* node, lua::State* L) { + if (auto bar = dynamic_cast(node)) { + return lua::pushcolor(L, bar->getBgColor()); + } + return 0; +} + +static int p_get_text_format(UINode* node, lua::State* L) { + if (auto bar = dynamic_cast(node)) { + return lua::pushstring(L, bar->getTextFormat()); + } + return 0; +} + +static int p_is_smooth(UINode* node, lua::State* L) { + if (auto bar = dynamic_cast(node)) { + return lua::pushboolean(L, bar->isSmooth()); + } + return 0; +} + static int p_get_min(UINode* node, lua::State* L) { if (auto bar = dynamic_cast(node)) { return lua::pushnumber(L, bar->getMin()); + } else if (auto bar = dynamic_cast(node)) { + return lua::pushnumber(L, bar->getMin()); } return 0; } @@ -279,6 +319,8 @@ static int p_get_min(UINode* node, lua::State* L) { static int p_get_max(UINode* node, lua::State* L) { if (auto bar = dynamic_cast(node)) { return lua::pushnumber(L, bar->getMax()); + } else if (auto bar = dynamic_cast(node)) { + return lua::pushnumber(L, bar->getMax()); } return 0; } @@ -307,6 +349,8 @@ static int p_get_track_color(UINode* node, lua::State* L) { static int p_get_text_color(UINode* node, lua::State* L) { if (auto box = dynamic_cast(node)) { return lua::pushcolor(L, box->getTextColor()); + } else if (auto bar = dynamic_cast(node)) { + return lua::pushcolor(L, bar->getTextColor()); } return 0; } @@ -676,12 +720,18 @@ static int l_gui_getattr(lua::State* L) { {"src", p_get_src}, {"fallback", p_get_fallback}, {"value", p_get_value}, + {"progress", p_get_progress}, {"min", p_get_min}, {"max", p_get_max}, {"step", p_get_step}, {"scroll", p_get_scroll}, {"trackWidth", p_get_track_width}, {"trackColor", p_get_track_color}, + {"barColor", p_get_bar_color}, + {"bgColor", p_get_bg_color}, + {"textColor", p_get_text_color}, + {"textFormat", p_get_text_format}, + {"smooth", p_is_smooth}, {"textColor", p_get_text_color}, {"checked", p_is_checked}, {"page", p_get_page}, @@ -851,6 +901,8 @@ static void p_set_zindex(UINode* node, lua::State* L, int idx) { static void p_set_value(UINode* node, lua::State* L, int idx) { if (auto bar = dynamic_cast(node)) { bar->setValue(lua::tonumber(L, idx)); + } else if (auto bar = dynamic_cast(node)) { + bar->setValue(lua::tonumber(L, idx)); } else if (auto selectbox = dynamic_cast(node)) { auto value = lua::require_lstring(L, idx); const auto& options = selectbox->getOptions(); @@ -867,11 +919,39 @@ static void p_set_value(UINode* node, lua::State* L, int idx) { static void p_set_min(UINode* node, lua::State* L, int idx) { if (auto bar = dynamic_cast(node)) { bar->setMin(lua::tonumber(L, idx)); + } else if (auto bar = dynamic_cast(node)) { + bar->setMin(lua::tonumber(L, idx)); } } static void p_set_max(UINode* node, lua::State* L, int idx) { if (auto bar = dynamic_cast(node)) { bar->setMax(lua::tonumber(L, idx)); + } else if (auto bar = dynamic_cast(node)) { + bar->setMax(lua::tonumber(L, idx)); + } +} + +static void p_set_bar_color(UINode* node, lua::State* L, int idx) { + if (auto bar = dynamic_cast(node)) { + bar->setBarColor(lua::tocolor(L, idx)); + } +} + +static void p_set_bg_color(UINode* node, lua::State* L, int idx) { + if (auto bar = dynamic_cast(node)) { + bar->setBgColor(lua::tocolor(L, idx)); + } +} + +static void p_set_text_format(UINode* node, lua::State* L, int idx) { + if (auto bar = dynamic_cast(node)) { + bar->setTextFormat(lua::require_string(L, idx)); + } +} + +static void p_set_smooth(UINode* node, lua::State* L, int idx) { + if (auto bar = dynamic_cast(node)) { + bar->setSmooth(lua::toboolean(L, idx)); } } static void p_set_step(UINode* node, lua::State* L, int idx) { @@ -892,6 +972,8 @@ static void p_set_track_color(UINode* node, lua::State* L, int idx) { static void p_set_text_color(UINode* node, lua::State* L, int idx) { if (auto box = dynamic_cast(node)) { box->setTextColor(lua::tocolor(L, idx)); + } else if (auto bar = dynamic_cast(node)) { + bar->setTextColor(lua::tocolor(L, idx)); } } static void p_set_checked(UINode* node, lua::State* L, int idx) { @@ -989,7 +1071,11 @@ static int l_gui_setattr(lua::State* L) { {"scroll", p_set_scroll}, {"trackWidth", p_set_track_width}, {"trackColor", p_set_track_color}, + {"barColor", p_set_bar_color}, + {"bgColor", p_set_bg_color}, {"textColor", p_set_text_color}, + {"textFormat", p_set_text_format}, + {"smooth", p_set_smooth}, {"checked", p_set_checked}, {"page", p_set_page}, {"inventory", p_set_inventory},