From 79528a44ea1fdc9aa3803dd9ef0cb7782a81a968 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 26 Apr 2025 22:12:34 +0300 Subject: [PATCH] add 'region' image property --- src/graphics/ui/elements/Image.cpp | 6 +++++- src/graphics/ui/elements/Image.hpp | 3 +++ src/graphics/ui/gui_xml.cpp | 5 +++++ src/logic/scripting/lua/libs/libgui.cpp | 7 +++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/graphics/ui/elements/Image.cpp b/src/graphics/ui/elements/Image.cpp index 4a1fabd3..ee3ec886 100644 --- a/src/graphics/ui/elements/Image.cpp +++ b/src/graphics/ui/elements/Image.cpp @@ -55,7 +55,7 @@ void Image::draw(const DrawContext& pctx, const Assets& assets) { 0, 0, 0, - UVRegion(), + region, false, true, calcColor() @@ -76,3 +76,7 @@ const std::string& Image::getTexture() const { void Image::setTexture(const std::string& name) { texture = name; } + +void Image::setRegion(const UVRegion& region) { + this->region = region; +} diff --git a/src/graphics/ui/elements/Image.hpp b/src/graphics/ui/elements/Image.hpp index cc5ff17c..579ddd75 100644 --- a/src/graphics/ui/elements/Image.hpp +++ b/src/graphics/ui/elements/Image.hpp @@ -1,11 +1,13 @@ #pragma once #include "UINode.hpp" +#include "maths/UVRegion.hpp" namespace gui { class Image : public UINode { protected: std::string texture; + UVRegion region {}; bool autoresize = false; public: Image(GUI& gui, std::string texture, glm::vec2 size=glm::vec2(32,32)); @@ -16,5 +18,6 @@ namespace gui { virtual bool isAutoResize() const; virtual const std::string& getTexture() const; virtual void setTexture(const std::string& name); + void setRegion(const UVRegion& region); }; } diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index 06262fec..b01e008e 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -544,6 +544,11 @@ static std::shared_ptr read_image( std::string src = element.attr("src", "").getText(); auto image = std::make_shared(reader.getGUI(), src); read_uinode(reader, element, *image); + + if (element.has("region")) { + auto vec = element.attr("region").asVec4(); + image->setRegion(UVRegion(vec.x, vec.y, vec.z, vec.w)); + } return image; } diff --git a/src/logic/scripting/lua/libs/libgui.cpp b/src/logic/scripting/lua/libs/libgui.cpp index 466ea3aa..56bada71 100644 --- a/src/logic/scripting/lua/libs/libgui.cpp +++ b/src/logic/scripting/lua/libs/libgui.cpp @@ -659,6 +659,12 @@ static void p_set_src(UINode* node, lua::State* L, int idx) { iframe->setSrc(lua::require_string(L, idx)); } } +static void p_set_region(UINode* node, lua::State* L, int idx) { + if (auto image = dynamic_cast(node)) { + auto vec = lua::tovec4(L, idx); + image->setRegion(UVRegion(vec.x, vec.y, vec.z, vec.w)); + } +} static void p_set_value(UINode* node, lua::State* L, int idx) { if (auto bar = dynamic_cast(node)) { bar->setValue(lua::tonumber(L, idx)); @@ -785,6 +791,7 @@ static int l_gui_setattr(lua::State* L) { {"inventory", p_set_inventory}, {"cursor", p_set_cursor}, {"focused", p_set_focused}, + {"region", p_set_region}, }; auto func = setters.find(attr); if (func != setters.end()) {