From f8a5f329a423b7c1d21b42a0b57e997fabf53902 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 13 May 2024 02:57:36 +0300 Subject: [PATCH] UINode size-func --- src/graphics/ui/elements/UINode.cpp | 11 ++++++++++ src/graphics/ui/elements/UINode.hpp | 33 +++++++++++++++++------------ src/graphics/ui/gui_xml.cpp | 9 +++++++- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/graphics/ui/elements/UINode.cpp b/src/graphics/ui/elements/UINode.cpp index 98e2eb18..5669abf1 100644 --- a/src/graphics/ui/elements/UINode.cpp +++ b/src/graphics/ui/elements/UINode.cpp @@ -233,6 +233,14 @@ void UINode::setPositionFunc(vec2supplier func) { positionfunc = func; } +vec2supplier UINode::getSizeFunc() const { + return sizefunc; +} + +void UINode::setSizeFunc(vec2supplier func) { + sizefunc = func; +} + void UINode::setId(const std::string& id) { this->id = id; } @@ -245,6 +253,9 @@ void UINode::reposition() { if (positionfunc) { setPos(positionfunc()); } + if (sizefunc) { + setSize(sizefunc()); + } } void UINode::setGravity(Gravity gravity) { diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index 4dd80a13..99bd39b0 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -84,6 +84,8 @@ namespace gui { UINode* parent = nullptr; /// @brief position supplier for the element (called on parent element size update) vec2supplier positionfunc = nullptr; + /// @brief size supplier for the element (called on parent element size update) + vec2supplier sizefunc = nullptr; /// @brief 'onclick' callbacks std::vector actions; @@ -148,25 +150,25 @@ namespace gui { void defocus(); bool isFocused() const; - /** Check if element catches all user input when focused */ + /// @brief Check if element catches all user input when focused virtual bool isFocuskeeper() const {return false;} virtual void typed(unsigned int codepoint) {}; virtual void keyPressed(keycode key) {}; - /** Check if screen position is inside of the element - * @param pos screen position */ + /// @brief Check if screen position is inside of the element + /// @param pos screen position virtual bool isInside(glm::vec2 pos); - /** Get element under the cursor. - * @param pos cursor screen position - * @param self shared pointer to element - * @return self, sub-element or nullptr if element is not interractive */ + /// @brief Get element under the cursor. + /// @param pos cursor screen position + /// @param self shared pointer to element + /// @return self, sub-element or nullptr if element is not interractive virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self); - /* Check if element is opaque for cursor */ + /// @brief Check if element is opaque for cursor virtual bool isInteractive() const; - /* Make the element opaque (true) or transparent (false) for cursor */ + /// @brief Make the element opaque (true) or transparent (false) for cursor virtual void setInteractive(bool flag); virtual void setResizing(bool flag); @@ -174,9 +176,9 @@ namespace gui { virtual glm::vec4 calcColor() const; - /* Get inner content offset. Used for scroll */ + /// @brief Get inner content offset. Used for scroll virtual glm::vec2 contentOffset() {return glm::vec2(0.0f);}; - /* Calculate screen position of the element */ + /// @brief Calculate screen position of the element virtual glm::vec2 calcPos() const; virtual void setPos(glm::vec2 pos); virtual glm::vec2 getPos() const; @@ -184,7 +186,7 @@ namespace gui { virtual void setSize(glm::vec2 size); virtual glm::vec2 getMinSize() const; virtual void setMinSize(glm::vec2 size); - /* Called in containers when new element added */ + /// @brief Called in containers when new element added virtual void refresh() {}; virtual void fullRefresh() { if (parent) { @@ -199,15 +201,18 @@ namespace gui { virtual vec2supplier getPositionFunc() const; virtual void setPositionFunc(vec2supplier); + virtual vec2supplier getSizeFunc() const; + virtual void setSizeFunc(vec2supplier); + void setId(const std::string& id); const std::string& getId() const; - /* Fetch pos from positionfunc if assigned */ + /// @brief Fetch pos from positionfunc if assigned void reposition(); virtual void setGravity(Gravity gravity); - // @brief collect all nodes having id + /// @brief collect all nodes having id static void getIndices( std::shared_ptr node, std::unordered_map>& map diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index 1c86a92e..8f7acac2 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -94,7 +94,14 @@ static void _readUINode(UiXmlReader& reader, xml::xmlelement element, UINode& no node.setPositionFunc(scripting::create_vec2_supplier( reader.getEnvironment(), element->attr("position-func").getText(), - reader.getFilename()+".lua" + reader.getFilename() + )); + } + if (element->has("size-func")) { + node.setSizeFunc(scripting::create_vec2_supplier( + reader.getEnvironment(), + element->attr("size-func").getText(), + reader.getFilename() )); } if (element->has("hover-color")) {