From 35004c2075f0df39431c45b5fc87d5b79e3330c7 Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Sun, 26 Jan 2025 14:02:38 +0300 Subject: [PATCH 01/89] Added new extensions for tables and math --- res/scripts/stdmin.lua | 76 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 5da1b347..abdfb905 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -64,6 +64,16 @@ function math.round(num, places) return math.floor(num * mult + 0.5) / mult end +function math.sum(...) + local sum = 0 + + for _, v in ipairs({...}) do + sum = sum + v + end + + return sum +end + ---------------------------------------------- function table.copy(t) @@ -113,6 +123,72 @@ function table.shuffle(t) return t end +function table.merge(t1, t2) + for i, v in pairs(t2) do + if type(i) == "number" then + t1[#t1 + 1] = v + elseif t1[i] == nil then + t1[i] = v + end + end + + return t1 +end + +function table.map(t, func) + for i, v in pairs(t) do + t[i] = func(i, v) + end + + return t +end + +function table.filter(t, func) + for i, v in pairs(t) do + if not func(i, v) then + t[i] = nil + end + end + + return t +end + +function table.set_default(t, indx, default) + if t[indx] == nil then + t[indx] = default + return + end + + return t[indx] +end + +function table.flat(t) + local flat = {} + + for _, v in pairs(t) do + if type(v) == "table" then + table.merge(flat, v) + else + table.insert(flat, v) + end + end + + return flat +end + +function table.deep_flat(t) + local flat = {} + + for _, v in pairs(t) do + if type(v) == "table" then + table.merge(flat, table.deep_flat(v)) + else + table.insert(flat, v) + end + end + + return flat +end ---------------------------------------------- local pattern_escape_replacements = { From 266ddd400ffea9990520880e30efc04876a130f4 Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Sun, 26 Jan 2025 14:20:20 +0300 Subject: [PATCH 02/89] Update extensions.md --- doc/ru/scripting/extensions.md | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/doc/ru/scripting/extensions.md b/doc/ru/scripting/extensions.md index ca165b0c..be697463 100644 --- a/doc/ru/scripting/extensions.md +++ b/doc/ru/scripting/extensions.md @@ -52,6 +52,41 @@ table.shuffle(t: table) -> table Перемешивает значения в таблице. +```lua +table.merge(t1: table, t2: table) -> table +``` + +Объединяет таблицу t1 с t2. + +```lua +table.map(t: table, func: function(indx, value) ) -> table +``` + +Проходится по таблице и применяет ко всем её элементам **func**, которая возвращает новое значение элемента. + +```lua +table.filter(t: table, func: function(indx, value) ) -> table +``` + +Проходится по таблице с помощью **func**, которая возвращает **true** если элемент надо сохранить и **false**, если его надо удалить. + +```lua +table.set_default(t: table, key: number | string, default: any) -> any | nil +``` + +Позволяет получить значение по ключу, если он существует, или установить и вернуть **nil**, если ключ отсутствует. + +```lua +table.flat(t: table) -> table +``` + +Возвращает "плоскую" версию исходной таблицы. + +```lua +table.deep_flat(t: table) -> table +``` + +Возвращает глубокую "плоскую" версию исходной таблицы. ```lua table.tostring(t: table) -> string @@ -165,6 +200,12 @@ math.round(num: number, [опционально] places: num) -> number Возвращает округлённое значение num до указанного количества знаков после запятой places. +```lua +math.sum(x: number, ...) -> number +``` + +Возвращает сумму всех принимаемых аргументов. + ## Дополнительные глобальные функции В этом же скрипте также определены и другие глобальные функции которые доступны для использования. Ниже их список From 5187ee76e913fc35d8eef6705cbe99122667cf2b Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Sun, 26 Jan 2025 14:21:44 +0300 Subject: [PATCH 03/89] Changes to comply with the documentation --- res/scripts/stdmin.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index abdfb905..cd57df8e 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -153,13 +153,13 @@ function table.filter(t, func) return t end -function table.set_default(t, indx, default) - if t[indx] == nil then - t[indx] = default +function table.set_default(t, key, default) + if t[key] == nil then + t[key] = default return end - return t[indx] + return t[key] end function table.flat(t) From 089d86d0a1029c33cd5c7a31a084d1a6eb45bfd7 Mon Sep 17 00:00:00 2001 From: Xertis Date: Sun, 26 Jan 2025 20:28:58 +0300 Subject: [PATCH 04/89] documentation and stdmin corrections --- doc/ru/scripting/extensions.md | 18 +++++++++--------- res/scripts/stdmin.lua | 23 ++++++++++++----------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/doc/ru/scripting/extensions.md b/doc/ru/scripting/extensions.md index be697463..32afc52d 100644 --- a/doc/ru/scripting/extensions.md +++ b/doc/ru/scripting/extensions.md @@ -56,7 +56,7 @@ table.shuffle(t: table) -> table table.merge(t1: table, t2: table) -> table ``` -Объединяет таблицу t1 с t2. +Добавляет в таблицу **t1** значения из таблицы **t2**. Если в таблице **t2** присутствует ключ из **t1**, то значение ключа не будет изменено. ```lua table.map(t: table, func: function(indx, value) ) -> table @@ -71,10 +71,10 @@ table.filter(t: table, func: function(indx, value) ) -> table Проходится по таблице с помощью **func**, которая возвращает **true** если элемент надо сохранить и **false**, если его надо удалить. ```lua -table.set_default(t: table, key: number | string, default: any) -> any | nil +table.set_default(t: table, key: number | string, default: any) -> any | default ``` -Позволяет получить значение по ключу, если он существует, или установить и вернуть **nil**, если ключ отсутствует. +Позволяет безопасно получать значение по указанному ключу. Если ключ существует в таблице, метод вернет его значение. Если ключ отсутствует, метод установит его со значением **default** и вернет его. ```lua table.flat(t: table) -> table @@ -88,6 +88,12 @@ table.deep_flat(t: table) -> table Возвращает глубокую "плоскую" версию исходной таблицы. +```lua +table.sum(t) -> number +``` + +Возвращает сумму всех элементов, игнорируя пары ключ-значение. + ```lua table.tostring(t: table) -> string ``` @@ -200,12 +206,6 @@ math.round(num: number, [опционально] places: num) -> number Возвращает округлённое значение num до указанного количества знаков после запятой places. -```lua -math.sum(x: number, ...) -> number -``` - -Возвращает сумму всех принимаемых аргументов. - ## Дополнительные глобальные функции В этом же скрипте также определены и другие глобальные функции которые доступны для использования. Ниже их список diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index cd57df8e..7a264540 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -64,16 +64,6 @@ function math.round(num, places) return math.floor(num * mult + 0.5) / mult end -function math.sum(...) - local sum = 0 - - for _, v in ipairs({...}) do - sum = sum + v - end - - return sum -end - ---------------------------------------------- function table.copy(t) @@ -156,7 +146,7 @@ end function table.set_default(t, key, default) if t[key] == nil then t[key] = default - return + return default end return t[key] @@ -189,6 +179,17 @@ function table.deep_flat(t) return flat end + +function table.sum(t) + local sum = 0 + + for _, v in ipairs(t) do + sum = sum + v + end + + return sum +end + ---------------------------------------------- local pattern_escape_replacements = { From 6592684db100f9539e859ed971ee3c85c8526649 Mon Sep 17 00:00:00 2001 From: Xertis Date: Sun, 26 Jan 2025 20:47:45 +0300 Subject: [PATCH 05/89] math.sum return --- doc/ru/scripting/extensions.md | 12 ++++++------ res/scripts/stdmin.lua | 28 +++++++++++++++++----------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/doc/ru/scripting/extensions.md b/doc/ru/scripting/extensions.md index 32afc52d..82235b96 100644 --- a/doc/ru/scripting/extensions.md +++ b/doc/ru/scripting/extensions.md @@ -88,12 +88,6 @@ table.deep_flat(t: table) -> table Возвращает глубокую "плоскую" версию исходной таблицы. -```lua -table.sum(t) -> number -``` - -Возвращает сумму всех элементов, игнорируя пары ключ-значение. - ```lua table.tostring(t: table) -> string ``` @@ -206,6 +200,12 @@ math.round(num: number, [опционально] places: num) -> number Возвращает округлённое значение num до указанного количества знаков после запятой places. +```lua +math.sum(x: number, ... | t: table) -> number +``` + +Возвращает сумму всех принимаемых аргументов. Если в качестве аргумента была передана таблица, метод вернёт сумму всех её элементов. + ## Дополнительные глобальные функции В этом же скрипте также определены и другие глобальные функции которые доступны для использования. Ниже их список diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 7a264540..07c42e35 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -64,6 +64,23 @@ function math.round(num, places) return math.floor(num * mult + 0.5) / mult end +function math.sum(...) + local numbers = nil + local sum = 0 + + if type(...) == "table" then + numbers = ... + else + numbers = {...} + end + + for _, v in ipairs(numbers) do + sum = sum + v + end + + return sum +end + ---------------------------------------------- function table.copy(t) @@ -179,17 +196,6 @@ function table.deep_flat(t) return flat end - -function table.sum(t) - local sum = 0 - - for _, v in ipairs(t) do - sum = sum + v - end - - return sum -end - ---------------------------------------------- local pattern_escape_replacements = { From 756ff4a2c7a99699a5faf3907ec254d89d35843b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 28 Jan 2025 05:09:18 +0300 Subject: [PATCH 06/89] fix gui alert window size --- src/graphics/ui/GUI.cpp | 15 +++++++++++++-- src/graphics/ui/elements/Menu.cpp | 8 +++++--- src/graphics/ui/elements/Menu.hpp | 2 +- src/graphics/ui/elements/Panel.cpp | 14 ++++++-------- src/graphics/ui/elements/UINode.cpp | 12 +++++++++++- src/graphics/ui/elements/UINode.hpp | 4 ++++ src/graphics/ui/gui_util.cpp | 12 +++++++++--- 7 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/graphics/ui/GUI.cpp b/src/graphics/ui/GUI.cpp index 08485201..55dd8ceb 100644 --- a/src/graphics/ui/GUI.cpp +++ b/src/graphics/ui/GUI.cpp @@ -5,6 +5,7 @@ #include "elements/UINode.hpp" #include "elements/Label.hpp" #include "elements/Menu.hpp" +#include "elements/Panel.hpp" #include "assets/Assets.hpp" #include "frontend/UiDocument.hpp" @@ -23,8 +24,10 @@ using namespace gui; -GUI::GUI() : batch2D(std::make_unique(1024)) { - container = std::make_shared(glm::vec2(1000)); +GUI::GUI() + : batch2D(std::make_unique(1024)), + container(std::make_shared(glm::vec2(1000))) { + container->setId("root"); uicamera = std::make_unique(glm::vec3(), Window::height); uicamera->perspective = false; uicamera->flipped = true; @@ -214,6 +217,14 @@ void GUI::draw(const DrawContext& pctx, const Assets& assets) { auto& viewport = ctx.getViewport(); glm::vec2 wsize = viewport.size(); + auto& page = menu->getCurrent(); + if (page.panel) { + menu->setSize(page.panel->getSize()); + page.panel->refresh(); + if (auto panel = std::dynamic_pointer_cast(page.panel)) { + panel->cropToContent(); + } + } menu->setPos((wsize - menu->getSize()) / 2.0f); uicamera->setFov(wsize.y); diff --git a/src/graphics/ui/elements/Menu.cpp b/src/graphics/ui/elements/Menu.cpp index da827489..d059d693 100644 --- a/src/graphics/ui/elements/Menu.cpp +++ b/src/graphics/ui/elements/Menu.cpp @@ -65,9 +65,10 @@ void Menu::setPage(Page page, bool history) { setSize(current.panel->getSize()); } -void Menu::back() { - if (pageStack.empty()) - return; +bool Menu::back() { + if (pageStack.empty()) { + return false; + } Page page = pageStack.top(); pageStack.pop(); @@ -77,6 +78,7 @@ void Menu::back() { } setPage(page, false); + return true; } void Menu::setPageLoader(PageLoaderFunc loader) { diff --git a/src/graphics/ui/elements/Menu.hpp b/src/graphics/ui/elements/Menu.hpp index 478c985a..e3e134d6 100644 --- a/src/graphics/ui/elements/Menu.hpp +++ b/src/graphics/ui/elements/Menu.hpp @@ -54,7 +54,7 @@ namespace gui { PageLoaderFunc getPageLoader(); /// @brief Set page to previous saved in history - void back(); + bool back(); /// @brief Clear pages history void clearHistory(); diff --git a/src/graphics/ui/elements/Panel.cpp b/src/graphics/ui/elements/Panel.cpp index d76866f0..70446d7d 100644 --- a/src/graphics/ui/elements/Panel.cpp +++ b/src/graphics/ui/elements/Panel.cpp @@ -70,9 +70,6 @@ void Panel::remove(const std::shared_ptr &node) { void Panel::refresh() { UINode::refresh(); - std::stable_sort(nodes.begin(), nodes.end(), [](auto a, auto b) { - return a->getZIndex() < b->getZIndex(); - }); float x = padding.x; float y = padding.y; @@ -80,20 +77,21 @@ void Panel::refresh() { if (orientation == Orientation::vertical) { float maxw = size.x; for (auto& node : nodes) { - glm::vec2 nodesize = node->getSize(); const glm::vec4 margin = node->getMargin(); y += margin.y; float ex = x + margin.x; node->setPos(glm::vec2(ex, y)); - y += nodesize.y + margin.w + interval; - + float width = size.x - padding.x - padding.z - margin.x - margin.z; if (node->isResizing()) { - node->setSize(glm::vec2(width, nodesize.y)); + node->setMaxSize({width, node->getMaxSize().y}); + node->setSize(glm::vec2(width, node->getSize().y)); } node->refresh(); - maxw = fmax(maxw, ex+node->getSize().x+margin.z+padding.z); + glm::vec2 nodeSize = node->getSize(); + y += nodeSize.y + margin.w + interval; + maxw = fmax(maxw, ex+nodeSize.x+margin.z+padding.z); } actualLength = y + padding.w; } else { diff --git a/src/graphics/ui/elements/UINode.cpp b/src/graphics/ui/elements/UINode.cpp index 4ebe8c7a..f6444f41 100644 --- a/src/graphics/ui/elements/UINode.cpp +++ b/src/graphics/ui/elements/UINode.cpp @@ -195,7 +195,8 @@ glm::vec2 UINode::getSize() const { void UINode::setSize(glm::vec2 size) { this->size = glm::vec2( - glm::max(minSize.x, size.x), glm::max(minSize.y, size.y) + glm::max(minSize.x, glm::min(maxSize.x, size.x)), + glm::max(minSize.y, glm::min(maxSize.y, size.y)) ); } @@ -208,6 +209,15 @@ void UINode::setMinSize(glm::vec2 minSize) { setSize(getSize()); } +glm::vec2 UINode::getMaxSize() const { + return maxSize; +} + +void UINode::setMaxSize(glm::vec2 maxSize) { + this->maxSize = maxSize; + setSize(getSize()); +} + void UINode::setColor(glm::vec4 color) { this->color = color; this->hoverColor = color; diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index af0ab145..2f62dd27 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -75,6 +75,8 @@ namespace gui { glm::vec2 size; /// @brief minimal element size glm::vec2 minSize {1.0f}; + /// @brief maximal element size + glm::vec2 maxSize {1e6f}; /// @brief element primary color (background-color or text-color if label) glm::vec4 color {1.0f}; /// @brief element color when mouse is over it @@ -224,6 +226,8 @@ namespace gui { virtual void setSize(glm::vec2 size); virtual glm::vec2 getMinSize() const; virtual void setMinSize(glm::vec2 size); + virtual glm::vec2 getMaxSize() const; + virtual void setMaxSize(glm::vec2 size); /// @brief Called in containers when new element added virtual void refresh() {}; virtual void fullRefresh() { diff --git a/src/graphics/ui/gui_util.cpp b/src/graphics/ui/gui_util.cpp index 04026132..f4f880b8 100644 --- a/src/graphics/ui/gui_util.cpp +++ b/src/graphics/ui/gui_util.cpp @@ -31,7 +31,11 @@ void guiutil::alert( const std::wstring& text, const runnable& on_hidden ) { - auto panel = std::make_shared(glm::vec2(500, 300), glm::vec4(4.0f), 4.0f); + auto panel = std::make_shared( + glm::vec2(glm::min(650UL, glm::max(text.length() * 10, 200UL)), 300), + glm::vec4(4.0f), + 4.0f + ); panel->setColor(glm::vec4(0.0f, 0.0f, 0.0f, 0.5f)); auto menuPtr = engine.getGUI()->getMenu(); @@ -40,14 +44,15 @@ void guiutil::alert( menu.removePage(""); if (on_hidden) { on_hidden(); - } else { - menu.back(); + } else if (!menu.back()) { + menu.reset(); } }; auto label = std::make_shared