From 37c7ffa7b09fc4496796ed9d702a1603c565468d Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 10 Mar 2025 23:44:43 +0300 Subject: [PATCH] add BasePanel & add padding property to SplitBox --- src/graphics/ui/elements/BasePanel.hpp | 43 ++++++++++++++++++++++++++ src/graphics/ui/elements/Panel.cpp | 21 +------------ src/graphics/ui/elements/Panel.hpp | 19 +++--------- src/graphics/ui/elements/SplitBox.cpp | 20 +++++++----- src/graphics/ui/elements/SplitBox.hpp | 6 ++-- src/graphics/ui/gui_xml.cpp | 37 ++++++++++++++++------ 6 files changed, 90 insertions(+), 56 deletions(-) create mode 100644 src/graphics/ui/elements/BasePanel.hpp diff --git a/src/graphics/ui/elements/BasePanel.hpp b/src/graphics/ui/elements/BasePanel.hpp new file mode 100644 index 00000000..6f9bf826 --- /dev/null +++ b/src/graphics/ui/elements/BasePanel.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include "Container.hpp" + +namespace gui { + class BasePanel : public Container { + public: + virtual ~BasePanel() = default; + + virtual void setOrientation(Orientation orientation) { + this->orientation = orientation; + refresh(); + } + + Orientation getOrientation() const { + return orientation; + } + + virtual void setPadding(glm::vec4 padding) { + this->padding = padding; + refresh(); + } + + glm::vec4 getPadding() const { + return padding; + } + protected: + BasePanel( + glm::vec2 size, + glm::vec4 padding = glm::vec4(0.0f), + float interval = 2.0f, + Orientation orientation = Orientation::vertical + ) + : Container(std::move(size)), + padding(std::move(padding)), + interval(interval) { + } + + Orientation orientation = Orientation::vertical; + glm::vec4 padding; + float interval = 2.0f; + }; +} diff --git a/src/graphics/ui/elements/Panel.cpp b/src/graphics/ui/elements/Panel.cpp index 4f3d91f2..4cc3730e 100644 --- a/src/graphics/ui/elements/Panel.cpp +++ b/src/graphics/ui/elements/Panel.cpp @@ -5,9 +5,7 @@ using namespace gui; Panel::Panel(glm::vec2 size, glm::vec4 padding, float interval) - : Container(size), - padding(padding), - interval(interval) + : BasePanel(size, padding, interval, Orientation::vertical) { setColor(glm::vec4(0.0f, 0.0f, 0.0f, 0.75f)); } @@ -31,15 +29,6 @@ int Panel::getMinLength() const { return minLength; } -void Panel::setPadding(glm::vec4 padding) { - this->padding = padding; - refresh(); -} - -glm::vec4 Panel::getPadding() const { - return padding; -} - void Panel::cropToContent() { if (maxLength > 0.0f) { setSize(glm::vec2( @@ -109,11 +98,3 @@ void Panel::refresh() { actualLength = size.y; } } - -void Panel::setOrientation(Orientation orientation) { - this->orientation = orientation; -} - -Orientation Panel::getOrientation() const { - return orientation; -} diff --git a/src/graphics/ui/elements/Panel.hpp b/src/graphics/ui/elements/Panel.hpp index b2e12c1f..7a16c018 100644 --- a/src/graphics/ui/elements/Panel.hpp +++ b/src/graphics/ui/elements/Panel.hpp @@ -1,16 +1,10 @@ #pragma once #include "commons.hpp" -#include "Container.hpp" +#include "BasePanel.hpp" namespace gui { - class Panel : public Container { - protected: - Orientation orientation = Orientation::vertical; - glm::vec4 padding; - float interval = 2.0f; - int minLength = 0; - int maxLength = 0; + class Panel : public BasePanel { public: Panel( glm::vec2 size, @@ -21,9 +15,6 @@ namespace gui { virtual void cropToContent(); - virtual void setOrientation(Orientation orientation); - Orientation getOrientation() const; - virtual void add(const std::shared_ptr& node) override; virtual void remove(UINode* node) override; @@ -35,8 +26,8 @@ namespace gui { virtual void setMinLength(int value); int getMinLength() const; - - virtual void setPadding(glm::vec4 padding); - glm::vec4 getPadding() const; + protected: + int minLength = 0; + int maxLength = 0; }; } diff --git a/src/graphics/ui/elements/SplitBox.cpp b/src/graphics/ui/elements/SplitBox.cpp index 1d73e0fd..4ea5c5ff 100644 --- a/src/graphics/ui/elements/SplitBox.cpp +++ b/src/graphics/ui/elements/SplitBox.cpp @@ -3,7 +3,7 @@ using namespace gui; SplitBox::SplitBox(const glm::vec2& size, float splitPos, Orientation orientation) - : Container(size), splitPos(splitPos), orientation(orientation) { + : BasePanel(size, glm::vec4(), 4.0f, orientation), splitPos(splitPos) { setCursor( orientation == Orientation::vertical ? CursorShape::NS_RESIZE : CursorShape::EW_RESIZE @@ -40,18 +40,22 @@ void SplitBox::refresh() { } auto nodeA = nodes.at(0); auto nodeB = nodes.at(1); + + float sepRadius = interval / 2.0f; - nodeA->setPos(glm::vec2()); + nodeA->setPos(glm::vec2(padding)); + + const auto& p = padding; if (orientation == Orientation::vertical) { float splitPos = this->splitPos * size.y; - nodeA->setSize(glm::vec2(size.x, splitPos - splitRadius)); - nodeB->setSize(glm::vec2(size.x, size.y - splitPos - splitRadius)); - nodeB->setPos(glm::vec2(0.0f, splitPos + splitRadius)); + nodeA->setSize({size.x-p.x-p.z, splitPos - sepRadius - p.y}); + nodeB->setSize({size.x-p.x-p.z, size.y - splitPos - sepRadius - p.w}); + nodeB->setPos({p.x, splitPos + sepRadius}); } else { float splitPos = this->splitPos * size.x; - nodeA->setSize(glm::vec2(splitPos - splitRadius, size.y)); - nodeB->setSize(glm::vec2(size.x - splitPos - splitRadius, size.y)); - nodeB->setPos(glm::vec2(splitPos + splitRadius, 0.0f)); + nodeA->setSize({splitPos - sepRadius - p.x, size.y - p.y - p.w}); + nodeB->setSize({size.x - splitPos - sepRadius - p.z, size.y - p.y - p.w}); + nodeB->setPos({splitPos + sepRadius, p.y}); } } diff --git a/src/graphics/ui/elements/SplitBox.hpp b/src/graphics/ui/elements/SplitBox.hpp index 0e9092a8..00bab21e 100644 --- a/src/graphics/ui/elements/SplitBox.hpp +++ b/src/graphics/ui/elements/SplitBox.hpp @@ -1,9 +1,9 @@ #pragma once -#include "Container.hpp" +#include "BasePanel.hpp" namespace gui { - class SplitBox : public Container { + class SplitBox : public BasePanel { public: SplitBox(const glm::vec2& size, float splitPos, Orientation orientation); @@ -12,7 +12,5 @@ namespace gui { virtual void fullRefresh() override; private: float splitPos; - int splitRadius = 2; - Orientation orientation; }; } diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index bb913f4d..df0a89a9 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -207,11 +207,10 @@ void UiXmlReader::readUINode( read_uinode(reader, element, node); } -static void read_panel_impl( +static void read_base_panel_impl( UiXmlReader& reader, const xml::xmlelement& element, - Panel& panel, - bool subnodes = true + BasePanel& panel ) { read_uinode(reader, element, panel); @@ -224,6 +223,22 @@ static void read_panel_impl( size.y + padding.y + padding.w )); } + if (element.has("orientation")) { + auto &oname = element.attr("orientation").getText(); + if (oname == "horizontal") { + panel.setOrientation(Orientation::horizontal); + } + } +} + +static void read_panel_impl( + UiXmlReader& reader, + const xml::xmlelement& element, + Panel& panel, + bool subnodes = true +) { + read_base_panel_impl(reader, element, panel); + if (element.has("size")) { panel.setResizing(false); } @@ -233,12 +248,6 @@ static void read_panel_impl( 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") { - panel.setOrientation(Orientation::horizontal); - } - } if (subnodes) { for (auto& sub : element.getElements()) { if (sub->isText()) @@ -324,7 +333,15 @@ static std::shared_ptr read_split_box( : Orientation::vertical; auto splitBox = std::make_shared(glm::vec2(), splitPos, orientation); - read_container_impl(reader, element, *splitBox); + read_base_panel_impl(reader, element, *splitBox); + for (auto& sub : element.getElements()) { + if (sub->isText()) + continue; + auto subnode = reader.readUINode(*sub); + if (subnode) { + splitBox->add(subnode); + } + } return splitBox; }