From 08ebfa15dbaf47b96d53608e6fa8112861af166b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 15 Oct 2024 05:56:15 +0300 Subject: [PATCH] add read-only UI contentOffset property --- doc/en/scripting/ui.md | 119 ++++++++++++------------ doc/ru/scripting/ui.md | 33 +++---- src/graphics/ui/elements/Container.hpp | 2 +- src/graphics/ui/elements/TextBox.cpp | 2 +- src/graphics/ui/elements/UINode.cpp | 2 +- src/graphics/ui/elements/UINode.hpp | 2 +- src/logic/scripting/lua/libs/libgui.cpp | 5 + 7 files changed, 86 insertions(+), 79 deletions(-) diff --git a/doc/en/scripting/ui.md b/doc/en/scripting/ui.md index c5bc44cc..e209c267 100644 --- a/doc/en/scripting/ui.md +++ b/doc/en/scripting/ui.md @@ -19,7 +19,7 @@ The element id cannot be changed from a script. The following tables will use abbreviated type descriptions, such as: - vec2 - an array of two numbers. - ivec2 - an array of two integers. -- rgba - an array of four integers in the range *\[0..255\]* denoting RGBA constituent colors. +- rgba - an array of four integers in the range `[0..255]` denoting RGBA constituent colors. Element methods, according to OOP features in Lua, are called using the `:` operator instead of `.` @@ -32,28 +32,29 @@ document["worlds-panel"]:clear() Properties that apply to all elements: -| Title | Type | Reading | Record | Description | -| ------------ | ------ | ------- | ------ | ------------------------------------------- | -| id | string | yes | *no* | element id | -| pos | vec2 | yes | yes | element position inside a container | -| wpos | vec2 | yes | yes | element position inside the window | -| size | vec2 | yes | yes | element size | -| interactive | bool | yes | yes | ability to interact with the element | -| enabled | bool | yes | yes | visually indicated version of *interactive* | -| visible | bool | yes | yes | element visibility | -| focused | bool | yes | yes | focus on element | -| color | rgba | yes | yes | element color | -| hoverColor | rgba | yes | yes | hover color | -| pressedColor | rgba | yes | yes | color when pressed | -| tooltip | string | yes | yes | tooltip text | -| tooltipDelay | float | yes | yes | tooltip delay | +| Title | Type | Read | Write | Description | +| ------------- | ------ | ---- | ----- | ------------------------------------------- | +| id | string | yes | *no* | element id | +| pos | vec2 | yes | yes | element position inside a container | +| wpos | vec2 | yes | yes | element position inside the window | +| size | vec2 | yes | yes | element size | +| interactive | bool | yes | yes | ability to interact with the element | +| enabled | bool | yes | yes | visually indicated version of *interactive* | +| visible | bool | yes | yes | element visibility | +| focused | bool | yes | yes | focus on element | +| color | rgba | yes | yes | element color | +| hoverColor | rgba | yes | yes | hover color | +| pressedColor | rgba | yes | yes | color when pressed | +| tooltip | string | yes | yes | tooltip text | +| tooltipDelay | float | yes | yes | tooltip delay | +| contentOffset | vec2 | yes | *no* | element content offset | Common element methods: -| Method | Description | -| ------------------- | ----------------------------------------------------------------------- | +| Method | Description | +| ------------------- | ----------------------------------------------------------------------------------- | | moveInto(container) | moves the element to the specified container (the element is specified, not the id) | -| destruct() | removes element | +| destruct() | removes element | ## Containers @@ -69,86 +70,86 @@ Common methods for containers (elements: container, panel, button, pagebox): Properties: -| Title | Type | Reading | Record | Description | -| ----------- | ------ | ------- | ------ | ------------------------------------------------------------------------------------ | -| text | string | yes | yes | entered text or placeholder | -| placeholder | string | yes | yes | placeholder (used if nothing has been entered) | -| caret | int | yes | yes | carriage position. `textbox.caret = -1` will set the position to the end of the text | -| editable | bool | yes | yes | text mutability | -| multiline | bool | yes | yes | multiline support | -| textWrap | bool | yes | yes | automatic text wrapping (only with multiline: "true") | -| valid | bool | yes | no | is the entered text correct | +| Title | Type | Read | Write | Description | +| ----------- | ------ | ---- | ----- | ------------------------------------------------------------------------------------ | +| text | string | yes | yes | entered text or placeholder | +| placeholder | string | yes | yes | placeholder (used if nothing has been entered) | +| caret | int | yes | yes | carriage position. `textbox.caret = -1` will set the position to the end of the text | +| editable | bool | yes | yes | text mutability | +| multiline | bool | yes | yes | multiline support | +| textWrap | bool | yes | yes | automatic text wrapping (only with multiline: "true") | +| valid | bool | yes | no | is the entered text correct | Methods: -| Method | Description | -| ----------- | -------------------------------------------- | +| Method | Description | +| ----------- | ------------------------------------------------ | | paste(text) | inserts the specified text at the caret position | ## Slider (trackbar) Properties: -| Title | Type | Reading | Record | Description | -| ---------- | ----- | ------- | ------ | --------------------- | -| value | float | yes | yes | current value | -| min | float | yes | yes | minimum value | -| max | float | yes | yes | maximum value | -| step | float | yes | yes | division step | -| trackWidth | float | yes | yes | control element width | -| trackColor | rgba | yes | yes | control element color | +| Title | Type | Read | Write | Description | +| ---------- | ----- | ---- | ----- | --------------------- | +| value | float | yes | yes | current value | +| min | float | yes | yes | minimum value | +| max | float | yes | yes | maximum value | +| step | float | yes | yes | division step | +| trackWidth | float | yes | yes | control element width | +| trackColor | rgba | yes | yes | control element color | ## Menu (pagebox) Properties: -| Title | Type | Reading | Record | Description | -| -------- | ------ | ------ | ------ | ---------------- | -| page | string | yes | yes | current page | +| Title | Type | Read | Write | Description | +| ----- | ------ | ---- | ----- | ------------ | +| page | string | yes | yes | current page | Methods: -| Method | Description | -| ------- | ------------------------------------------ | -| back() | switches to previous page | +| Method | Description | +| ------- | --------------------------------- | +| back() | switches to previous page | | reset() | resets page and switching history | ## Checkbox Properties: -| Title | Type | Reading | Record | Description | -| -------- | ---- | ------ | ------ | ----------------- | -| checked | bool | yes | yes | mark status | +| Title | Type | Read | Write | Description | +| ------- | ---- | ---- | ----- | ----------- | +| checked | bool | yes | yes | mark status | ## Button Properties: -| Title | Type | Reading | Record | Description | -| -------- | ------ | ------ | ------ | ------------ | -| text | string | yes | yes | button text | +| Title | Type | Read | Write | Description | +| ----- | ------ | ---- | ----- | ------------ | +| text | string | yes | yes | button text | ## Label Properties: -| Title | Type | Reading | Record | Description | -| -------- | ------ | ------ | ------ | ----------- | -| text | string | yes | yes | label text | +| Title | Type | Read | Write | Description | +| ----- | ------ | ---- | ----- | ----------- | +| text | string | yes | yes | label text | ## Image Properties: -| Title | Type | Reading | Record | Description | -| ----- | ------ | ------- | ------ | ------------ | -| src | string | yes | yes | texture name | +| Title | Type | Read | Write | Description | +| ----- | ------ | ---- | ----- | ------------ | +| src | string | yes | yes | texture name | ## Inventory Properties: -| Title | Type | Reading | Record | Description | -| --------- | ---- | ------- | ------ | ------------------------------------------------- | -| inventory | int | yes | yes | id of the inventory to which the element is bound | +| Title | Type | Read | Write | Description | +| --------- | ---- | ---- | ----- | ------------------------------------------------- | +| inventory | int | yes | yes | id of the inventory to which the element is bound | diff --git a/doc/ru/scripting/ui.md b/doc/ru/scripting/ui.md index 956278fa..6d39c6c7 100644 --- a/doc/ru/scripting/ui.md +++ b/doc/ru/scripting/ui.md @@ -19,7 +19,7 @@ Id элемента не может быть изменен из скрипта. В таблицах далее будут использоваться сокращенные описания типов, такие как: - vec2 - массив из двух дробных чисел. - ivec2 - массив из двух целых чисел. -- rgba - массив из четырех дробных чисел в диапазоне *\[0..255\]* обозначающий RGBA состовляющие цвета. +- rgba - массив из четырех дробных чисел в диапазоне `[0..255]` обозначающий RGBA состовляющие цвета. Методы элементов, согласно особенностям ООП в Lua вызываются с использованием оператора `:` вместо `.` @@ -32,21 +32,22 @@ document["worlds-panel"]:clear() Свойства, относящиеся ко всем элементам: -| Название | Тип | Чтение | Запись | Описание | -| ------------ | ------ | ------ | ------ | ----------------------------------------- | -| id | string | да | *нет* | идентификатор элемента | -| pos | vec2 | да | да | позиция элемента внутри контейнера | -| wpos | vec2 | да | да | позиция элемента в окне | -| size | vec2 | да | да | размер элемента | -| interactive | bool | да | да | возможность взаимодействия с элементом | -| enabled | bool | да | да | визуально обозначаемая версия interactive | -| visible | bool | да | да | видимость элемента | -| focused | bool | да | да | фокус на элементе | -| color | rgba | да | да | цвет элемента | -| hoverColor | rgba | да | да | цвет при наведении | -| pressedColor | rgba | да | да | цвет при нажатии | -| tooltip | string | да | да | текст всплывающей подсказки | -| tooltipDelay | float | да | да | задержка всплывающей подсказки | +| Название | Тип | Чтение | Запись | Описание | +| ------------- | ------ | ------ | ------ | ----------------------------------------- | +| id | string | да | *нет* | идентификатор элемента | +| pos | vec2 | да | да | позиция элемента внутри контейнера | +| wpos | vec2 | да | да | позиция элемента в окне | +| size | vec2 | да | да | размер элемента | +| interactive | bool | да | да | возможность взаимодействия с элементом | +| enabled | bool | да | да | визуально обозначаемая версия interactive | +| visible | bool | да | да | видимость элемента | +| focused | bool | да | да | фокус на элементе | +| color | rgba | да | да | цвет элемента | +| hoverColor | rgba | да | да | цвет при наведении | +| pressedColor | rgba | да | да | цвет при нажатии | +| tooltip | string | да | да | текст всплывающей подсказки | +| tooltipDelay | float | да | да | задержка всплывающей подсказки | +| contentOffset | vec2 | да | *нет* | смещение содержимого | Общие методы элементов: diff --git a/src/graphics/ui/elements/Container.hpp b/src/graphics/ui/elements/Container.hpp index 52d2a374..a5cca04c 100644 --- a/src/graphics/ui/elements/Container.hpp +++ b/src/graphics/ui/elements/Container.hpp @@ -30,7 +30,7 @@ namespace gui { virtual void scrolled(int value) override; virtual void setScrollable(bool flag); void listenInterval(float interval, ontimeout callback, int repeat=-1); - virtual glm::vec2 contentOffset() override {return glm::vec2(0.0f, scroll);}; + virtual glm::vec2 getContentOffset() override {return glm::vec2(0.0f, scroll);}; virtual void setSize(glm::vec2 size) override; virtual void refresh() override; diff --git a/src/graphics/ui/elements/TextBox.cpp b/src/graphics/ui/elements/TextBox.cpp index 7d481048..12c59508 100644 --- a/src/graphics/ui/elements/TextBox.cpp +++ b/src/graphics/ui/elements/TextBox.cpp @@ -646,7 +646,7 @@ void TextBox::setCaret(size_t position) { caretLastMove = Window::time(); int width = label->getSize().x; uint line = label->getLineByTextIndex(caret); - int offset = label->getLineYOffset(line) + contentOffset().y; + int offset = label->getLineYOffset(line) + getContentOffset().y; uint lineHeight = font->getLineHeight()*label->getLineInterval(); scrollStep = lineHeight; if (offset < 0) { diff --git a/src/graphics/ui/elements/UINode.cpp b/src/graphics/ui/elements/UINode.cpp index 85646480..8bf4f007 100644 --- a/src/graphics/ui/elements/UINode.cpp +++ b/src/graphics/ui/elements/UINode.cpp @@ -152,7 +152,7 @@ float UINode::getTooltipDelay() const { glm::vec2 UINode::calcPos() const { if (parent) { - return pos + parent->calcPos() + parent->contentOffset(); + return pos + parent->calcPos() + parent->getContentOffset(); } return pos; } diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index 29de089e..666fa01c 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -209,7 +209,7 @@ namespace gui { virtual glm::vec4 calcColor() const; /// @brief Get inner content offset. Used for scroll - virtual glm::vec2 contentOffset() {return glm::vec2(0.0f);}; + virtual glm::vec2 getContentOffset() {return glm::vec2(0.0f);}; /// @brief Calculate screen position of the element virtual glm::vec2 calcPos() const; virtual void setPos(glm::vec2 pos); diff --git a/src/logic/scripting/lua/libs/libgui.cpp b/src/logic/scripting/lua/libs/libgui.cpp index 460b1caf..df00b2fd 100644 --- a/src/logic/scripting/lua/libs/libgui.cpp +++ b/src/logic/scripting/lua/libs/libgui.cpp @@ -292,6 +292,10 @@ static int p_set_interval(UINode* node, lua::State* L) { return 0; } +static int p_get_content_offset(UINode* node, lua::State* L) { + return lua::pushvec(L, node->getContentOffset()); +} + static int p_get_color(UINode* node, lua::State* L) { return lua::pushcolor(L, node->getColor()); } @@ -344,6 +348,7 @@ static int l_gui_getattr(lua::State* L) { {"color", p_get_color}, {"hoverColor", p_get_hover_color}, {"pressedColor", p_get_pressed_color}, + {"contentOffset", p_get_content_offset}, {"tooltip", p_get_tooltip}, {"tooltipDelay", p_get_tooltip_delay}, {"pos", p_get_pos},