From 2412699b89c44fe789cc4b4e9875cb7b60c87c99 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 19 Nov 2024 06:46:54 +0300 Subject: [PATCH] add 'scroll-step' property to container --- doc/en/xml-ui-layouts.md | 3 ++- doc/ru/xml-ui-layouts.md | 3 ++- src/graphics/ui/elements/Container.cpp | 8 ++++++++ src/graphics/ui/elements/Container.hpp | 2 ++ src/graphics/ui/elements/TextBox.cpp | 5 ++++- src/graphics/ui/gui_xml.cpp | 3 +++ 6 files changed, 21 insertions(+), 3 deletions(-) diff --git a/doc/en/xml-ui-layouts.md b/doc/en/xml-ui-layouts.md index b039a29b..788814e5 100644 --- a/doc/en/xml-ui-layouts.md +++ b/doc/en/xml-ui-layouts.md @@ -56,7 +56,8 @@ Buttons and panels are also containers. - `padding` - element padding. Type: 4D vector. *left, top, right, bottom* - `scrollable` - element scrollability. Works on panels only. Type: boolean +- `scrollable` - element scrollability. Type: boolean. +- `scroll-step` - scrolling step. Type: integer. # Common *panel* attributes diff --git a/doc/ru/xml-ui-layouts.md b/doc/ru/xml-ui-layouts.md index dc9455f7..28777950 100644 --- a/doc/ru/xml-ui-layouts.md +++ b/doc/ru/xml-ui-layouts.md @@ -59,7 +59,8 @@ В число контейнеров также входят панели и кнопки. - `padding` - внутренний отступ элемента. Тип: 4D вектор. Порядок: `"left,top,right,bottom"` -- `scrollable` - возможность скроллинга. Работает только у Panel. Тип: логический. +- `scrollable` - возможность скроллинга. Тип: логический. +- `scroll-step` - шаг скроллинга. Тип: целочисленный. # Общие атрибуты панелей diff --git a/src/graphics/ui/elements/Container.cpp b/src/graphics/ui/elements/Container.cpp index 72a44d52..fdd0bc02 100644 --- a/src/graphics/ui/elements/Container.cpp +++ b/src/graphics/ui/elements/Container.cpp @@ -165,6 +165,14 @@ void Container::setSize(glm::vec2 size) { } } +int Container::getScrollStep() const { + return scrollStep; +} + +void Container::setScrollStep(int step) { + scrollStep = step; +} + void Container::refresh() { std::stable_sort(nodes.begin(), nodes.end(), [](const auto& a, const auto& b) { return a->getZIndex() < b->getZIndex(); diff --git a/src/graphics/ui/elements/Container.hpp b/src/graphics/ui/elements/Container.hpp index a5cca04c..bfe40ab5 100644 --- a/src/graphics/ui/elements/Container.hpp +++ b/src/graphics/ui/elements/Container.hpp @@ -32,6 +32,8 @@ namespace gui { void listenInterval(float interval, ontimeout callback, int repeat=-1); virtual glm::vec2 getContentOffset() override {return glm::vec2(0.0f, scroll);}; virtual void setSize(glm::vec2 size) override; + virtual int getScrollStep() const; + virtual void setScrollStep(int step); virtual void refresh() override; const std::vector>& getNodes() const; diff --git a/src/graphics/ui/elements/TextBox.cpp b/src/graphics/ui/elements/TextBox.cpp index 90a4c256..6a54d682 100644 --- a/src/graphics/ui/elements/TextBox.cpp +++ b/src/graphics/ui/elements/TextBox.cpp @@ -43,6 +43,7 @@ TextBox::TextBox(std::wstring placeholder, glm::vec4 padding) textInitX = label->getPos().x; scrollable = true; + scrollStep = 0; } void TextBox::draw(const DrawContext* pctx, Assets* assets) { @@ -746,7 +747,9 @@ void TextBox::setCaret(size_t position) { uint line = label->getLineByTextIndex(caret); int offset = label->getLineYOffset(line) + getContentOffset().y; uint lineHeight = font->getLineHeight()*label->getLineInterval(); - scrollStep = lineHeight; + if (scrollStep == 0) { + scrollStep = lineHeight; + } if (offset < 0) { scrolled(-glm::floor(offset/static_cast(scrollStep)+0.5f)); } else if (offset >= getSize().y) { diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index 7e30a31d..ffdf0e16 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -172,6 +172,9 @@ static void _readContainer(UiXmlReader& reader, const xml::xmlelement& element, if (element->has("scrollable")) { container.setScrollable(element->attr("scrollable").asBool()); } + if (element->has("scroll-step")) { + container.setScrollStep(element->attr("scroll-step").asInt()); + } for (auto& sub : element->getElements()) { if (sub->isText()) continue;