From 0ce5e23a2a5c684d48ca19a8f8706f85b2edd020 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 18 Jan 2025 05:55:02 +0300 Subject: [PATCH] add 'min-length' panel property --- doc/en/xml-ui-layouts.md | 1 + doc/ru/xml-ui-layouts.md | 1 + src/graphics/ui/elements/Panel.cpp | 14 ++++++++++++-- src/graphics/ui/elements/Panel.hpp | 4 ++++ src/graphics/ui/elements/UINode.cpp | 6 +++--- src/graphics/ui/gui_xml.cpp | 3 +++ 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/doc/en/xml-ui-layouts.md b/doc/en/xml-ui-layouts.md index 3f0bff07..d6bab384 100644 --- a/doc/en/xml-ui-layouts.md +++ b/doc/en/xml-ui-layouts.md @@ -65,6 +65,7 @@ Buttons and panels are also containers. Buttons are also panels. - `max-length` - maximal length of panel stretching before scrolling (if scrollable = true). Type: number +- `min-length` - minimal length of panel. Type: number - `orientation` - panel orientation: horizontal/vertical. # Common elements diff --git a/doc/ru/xml-ui-layouts.md b/doc/ru/xml-ui-layouts.md index f562ee4c..cbcbbf7c 100644 --- a/doc/ru/xml-ui-layouts.md +++ b/doc/ru/xml-ui-layouts.md @@ -67,6 +67,7 @@ В число панелей также входят кнопки. - `max-length` - максимальная длина, на которую растягивается панель до начала скроллинга (если scrollable = true). Тип: число +- `min-length` - минимальная длина панели. Тип: число - `orientation` - ориентация панели: horizontal/vertical. # Основные элементы diff --git a/src/graphics/ui/elements/Panel.cpp b/src/graphics/ui/elements/Panel.cpp index af4a0de3..7bbc4231 100644 --- a/src/graphics/ui/elements/Panel.cpp +++ b/src/graphics/ui/elements/Panel.cpp @@ -23,6 +23,14 @@ int Panel::getMaxLength() const { return maxLength; } +void Panel::setMinLength(int value) { + minLength = value; +} + +int Panel::getMinLength() const { + return minLength; +} + void Panel::setPadding(glm::vec4 padding) { this->padding = padding; refresh(); @@ -34,9 +42,11 @@ glm::vec4 Panel::getPadding() const { void Panel::cropToContent() { if (maxLength > 0.0f) { - setSize(glm::vec2(getSize().x, glm::min(maxLength, actualLength))); + setSize(glm::vec2( + getSize().x, glm::max(minLength, glm::min(maxLength, actualLength)) + )); } else { - setSize(glm::vec2(getSize().x, actualLength)); + setSize(glm::vec2(getSize().x, glm::max(minLength, actualLength))); } } diff --git a/src/graphics/ui/elements/Panel.hpp b/src/graphics/ui/elements/Panel.hpp index d3d60c30..7e9759dd 100644 --- a/src/graphics/ui/elements/Panel.hpp +++ b/src/graphics/ui/elements/Panel.hpp @@ -9,6 +9,7 @@ namespace gui { Orientation orientation = Orientation::vertical; glm::vec4 padding {2.0f}; float interval = 2.0f; + int minLength = 0; int maxLength = 0; public: Panel( @@ -31,6 +32,9 @@ namespace gui { virtual void setMaxLength(int value); int getMaxLength() const; + virtual void setMinLength(int value); + int getMinLength() const; + virtual void setPadding(glm::vec4 padding); glm::vec4 getPadding() const; }; diff --git a/src/graphics/ui/elements/UINode.cpp b/src/graphics/ui/elements/UINode.cpp index a6fa38c2..ccb427e7 100644 --- a/src/graphics/ui/elements/UINode.cpp +++ b/src/graphics/ui/elements/UINode.cpp @@ -289,12 +289,12 @@ const std::string& UINode::getId() const { } void UINode::reposition() { - if (positionfunc) { - setPos(positionfunc()); - } if (sizefunc) { setSize(sizefunc()); } + if (positionfunc) { + setPos(positionfunc()); + } } void UINode::setGravity(Gravity gravity) { diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index c705d16d..302b89fe 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -220,6 +220,9 @@ static void _readPanel(UiXmlReader& reader, const xml::xmlelement& element, Pane if (element.has("max-length")) { panel.setMaxLength(element.attr("max-length").asInt()); } + if (element.has("min-length")) { + panel.setMinLength(element.attr("min-length").asInt()); + } if (element.has("orientation")) { auto &oname = element.attr("orientation").getText(); if (oname == "horizontal") {