From 3ea213e8d3cee7be55ec39ffb18dc557dec7557b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 17 Nov 2024 15:53:25 +0300 Subject: [PATCH 01/24] fix console position --- res/layouts/console.xml | 2 +- src/frontend/hud.cpp | 7 +++++-- src/graphics/core/DrawContext.cpp | 2 +- src/graphics/core/DrawContext.hpp | 2 +- src/graphics/ui/elements/Container.cpp | 4 ++-- src/window/Window.cpp | 16 ++++++++-------- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/res/layouts/console.xml b/res/layouts/console.xml index 3e1b802d..bae396bf 100644 --- a/res/layouts/console.xml +++ b/res/layouts/console.xml @@ -14,7 +14,7 @@ diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index bfaac141..f0bbf20a 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -615,8 +615,11 @@ void Hud::updateElementsPosition(const Viewport& viewport) { } if (secondUI->getPositionFunc() == nullptr) { secondUI->setPos(glm::vec2( - glm::min(width/2-invwidth/2, width-caWidth-(inventoryView ? 10 : 0)-invwidth), - height/2-totalHeight/2 + glm::min( + width / 2.f - invwidth / 2.f, + width - caWidth - (inventoryView ? 10 : 0) - invwidth + ), + height / 2.f - totalHeight / 2.f )); } } diff --git a/src/graphics/core/DrawContext.cpp b/src/graphics/core/DrawContext.cpp index 29afae2e..314bd7b5 100644 --- a/src/graphics/core/DrawContext.cpp +++ b/src/graphics/core/DrawContext.cpp @@ -148,7 +148,7 @@ void DrawContext::setBlendMode(BlendMode mode) { set_blend_mode(mode); } -void DrawContext::setScissors(glm::vec4 area) { +void DrawContext::setScissors(const glm::vec4& area) { Window::pushScissor(area); scissorsCount++; } diff --git a/src/graphics/core/DrawContext.hpp b/src/graphics/core/DrawContext.hpp index 9174be1b..736b053e 100644 --- a/src/graphics/core/DrawContext.hpp +++ b/src/graphics/core/DrawContext.hpp @@ -34,6 +34,6 @@ public: void setDepthTest(bool flag); void setCullFace(bool flag); void setBlendMode(BlendMode mode); - void setScissors(glm::vec4 area); + void setScissors(const glm::vec4& area); void setLineWidth(float width); }; diff --git a/src/graphics/ui/elements/Container.cpp b/src/graphics/ui/elements/Container.cpp index 3b8fd0ac..72a44d52 100644 --- a/src/graphics/ui/elements/Container.cpp +++ b/src/graphics/ui/elements/Container.cpp @@ -90,7 +90,7 @@ void Container::draw(const DrawContext* pctx, Assets* assets) { if (!nodes.empty()) { batch->flush(); DrawContext ctx = pctx->sub(); - ctx.setScissors(glm::vec4(pos.x, pos.y, size.x, size.y)); + ctx.setScissors(glm::vec4(pos.x, pos.y, glm::ceil(size.x), glm::ceil(size.y))); for (const auto& node : nodes) { if (node->isVisible()) node->draw(pctx, assets); @@ -108,7 +108,7 @@ void Container::drawBackground(const DrawContext* pctx, Assets*) { auto batch = pctx->getBatch2D(); batch->texture(nullptr); batch->setColor(color); - batch->rect(pos.x, pos.y, size.x, size.y); + batch->rect(pos.x, pos.y, glm::ceil(size.x), glm::ceil(size.y)); } void Container::add(const std::shared_ptr &node) { diff --git a/src/window/Window.cpp b/src/window/Window.cpp index fdfde141..99a549ca 100644 --- a/src/window/Window.cpp +++ b/src/window/Window.cpp @@ -258,14 +258,14 @@ void Window::pushScissor(glm::vec4 area) { } scissorStack.push(scissorArea); - area.z += area.x; - area.w += area.y; + area.z += glm::ceil(area.x); + area.w += glm::ceil(area.y); - area.x = fmax(area.x, scissorArea.x); - area.y = fmax(area.y, scissorArea.y); + area.x = glm::max(area.x, scissorArea.x); + area.y = glm::max(area.y, scissorArea.y); - area.z = fmin(area.z, scissorArea.z); - area.w = fmin(area.w, scissorArea.w); + area.z = glm::min(area.z, scissorArea.z); + area.w = glm::min(area.w, scissorArea.w); if (area.z < 0.0f || area.w < 0.0f) { glScissor(0, 0, 0, 0); @@ -273,8 +273,8 @@ void Window::pushScissor(glm::vec4 area) { glScissor( area.x, Window::height - area.w, - std::max(0, int(area.z - area.x)), - std::max(0, int(area.w - area.y)) + std::max(0, static_cast(glm::ceil(area.z - area.x))), + std::max(0, static_cast(glm::ceil(area.w - area.y))) ); } scissorArea = area; From 8e1d6b9f0309c2e060c16d5e856197067c7e8993 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 18 Nov 2024 05:24:16 +0300 Subject: [PATCH 02/24] set default margin to 0,0,0,0 --- src/graphics/ui/elements/UINode.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index 666fa01c..53967f4c 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -81,7 +81,7 @@ namespace gui { /// @brief element color when clicked glm::vec4 pressedColor {1.0f}; /// @brief element margin (only supported for Panel sub-nodes) - glm::vec4 margin {1.0f}; + glm::vec4 margin {0.0f}; /// @brief is element visible bool visible = true; /// @brief is mouse over the element From 618a9f04118302875120c83ad7897bc396a34b96 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 18 Nov 2024 07:11:07 +0300 Subject: [PATCH 03/24] add RadioButton Lua class --- res/layouts/pages/settings.xml | 10 +++++----- res/layouts/pages/settings.xml.lua | 20 +++++++++----------- res/scripts/stdlib.lua | 23 +++++++++++++++++++++++ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/res/layouts/pages/settings.xml b/res/layouts/pages/settings.xml index f5ec33d7..00437e68 100644 --- a/res/layouts/pages/settings.xml +++ b/res/layouts/pages/settings.xml @@ -1,9 +1,9 @@ - - - - + + + + @@ -11,7 +11,7 @@ - + diff --git a/res/layouts/pages/settings.xml.lua b/res/layouts/pages/settings.xml.lua index 24256c84..8b41491a 100644 --- a/res/layouts/pages/settings.xml.lua +++ b/res/layouts/pages/settings.xml.lua @@ -3,15 +3,13 @@ function on_open() "%s: %s", gui.str("Language", "settings"), gui.get_locales_info()[core.get_setting("ui.language")].name ) - set_page("s_gfx", "settings_graphics") -end - -function set_page(btn, page) - document.s_aud.enabled = true - document.s_dsp.enabled = true - document.s_gfx.enabled = true - document.s_ctl.enabled = true - document.s_rst.enabled = true - document[btn].enabled = false - document.menu.page = page + sections = RadioGroup({ + audio=document.s_aud, + display=document.s_dsp, + graphics=document.s_gfx, + controls=document.s_ctl, + reset=document.s_rst + }, function (page) + document.menu.page = "settings_"..page + end, "graphics") end diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index f53323db..4bade31d 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -84,6 +84,29 @@ function Document.new(docname) }) end +local _RadioGroup = {} +function _RadioGroup.set(self, key) + if self.current then + self.elements[self.current].enabled = true + end + self.elements[key].enabled = false + self.current = key + if self.callback then + self.callback(key) + end +end +function _RadioGroup.__call(self, elements, onset, default) + local group = setmetatable({ + elements=elements, + callback=onset, + current=nil + }, {__index=_RadioGroup}) + group:set(default) + return group +end +setmetatable(_RadioGroup, _RadioGroup) +RadioGroup = _RadioGroup + _GUI_ROOT = Document.new("core:root") _MENU = _GUI_ROOT.menu menu = _MENU From dcd8871ee19e3615a7480dfaa5a312ca587e1e0c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 18 Nov 2024 09:21:16 +0300 Subject: [PATCH 04/24] add utf8.escape, string.escape & reformat extensions.md --- doc/en/scripting/builtins/libutf8.md | 3 + doc/ru/scripting/builtins/libutf8.md | 3 + doc/ru/scripting/extensions.md | 111 ++++++++++++++--------- res/scripts/stdmin.lua | 1 + src/logic/scripting/lua/libs/libutf8.cpp | 6 ++ src/util/stringutil.cpp | 3 +- src/util/stringutil.hpp | 2 +- 7 files changed, 85 insertions(+), 44 deletions(-) diff --git a/doc/en/scripting/builtins/libutf8.md b/doc/en/scripting/builtins/libutf8.md index 86714fce..bd8dd22b 100644 --- a/doc/en/scripting/builtins/libutf8.md +++ b/doc/en/scripting/builtins/libutf8.md @@ -27,4 +27,7 @@ utf8.upper(text: str) -> str -- Converts a string to lowercase utf8.lower(text: str) -> str + +-- Escapes a string +utf8.escape(text: str) -> str ``` diff --git a/doc/ru/scripting/builtins/libutf8.md b/doc/ru/scripting/builtins/libutf8.md index 394eb522..ce933417 100644 --- a/doc/ru/scripting/builtins/libutf8.md +++ b/doc/ru/scripting/builtins/libutf8.md @@ -27,4 +27,7 @@ utf8.upper(text: str) -> str -- Переводит строку в нижний регистр utf8.lower(text: str) -> str + +-- Экранирует строку +utf8.escape(text: str) -> str ``` diff --git a/doc/ru/scripting/extensions.md b/doc/ru/scripting/extensions.md index a6b40a38..d4502f64 100644 --- a/doc/ru/scripting/extensions.md +++ b/doc/ru/scripting/extensions.md @@ -4,92 +4,109 @@ ## Расширения для table -Создаёт и возвращает копию переданной таблицы путём создания новой и копирования в неё всех элементов из переданной ```lua -function table.copy(t: table) -> table +table.copy(t: table) -> table ``` -Возвращает количество пар в переданной таблице +Создаёт и возвращает копию переданной таблицы путём создания новой и копирования в неё всех элементов из переданной. + ```lua -function table.count_pairs(t: table) -> integer +table.count_pairs(t: table) -> integer ``` -Возвращает один элемент из переданной таблицы на случайной позиции +Возвращает количество пар в переданной таблице. + ```lua -function table.random(t: table) -> object +table.random(t: table) -> object ``` -Возвращает **true**, если **x** содержится в **t** +Возвращает один элемент из переданной таблицы на случайной позиции. + ```lua -function table.has(t: table, x: object) -> bool +table.has(t: table, x: object) -> bool ``` -Возвращает индекс обьекта **x** в **t**. Если переданный обьект не содержится в таблице, то функция вернёт значение **-1** +Возвращает **true**, если **x** содержится в **t**. + ```lua -function table.index(t: table, x: object) -> integer +table.index(t: table, x: object) -> integer ``` -Удаляет элемент **x** из **t** +Возвращает индекс обьекта **x** в **t**. Если переданный обьект не содержится в таблице, то функция вернёт значение **-1**. + ```lua -function table.remove_value(t: table, x: object) +table.remove_value(t: table, x: object) ``` -Конвертирует переданную таблицу в строку +Удаляет элемент **x** из **t**. + ```lua -function table.tostring(t: table) -> string +table.tostring(t: table) -> string ``` +Конвертирует переданную таблицу в строку. + ## Расширения для string -Разбивает строку **str** на части по указанному разделителю/выражению **separator** и возвращает результат ввиде таблицы из строк. Если **withpattern** равен **true**, то параметр **separator** будет определяться как регулярное выражение ```lua -function string.explode(separator: string, str: string, withpattern: bool) -> table[string] +string.explode(separator: string, str: string, withpattern: bool) -> table[string] ``` -Разбивает строку **str** на части по указанному разделителю **delimiter** и возвращает результат ввиде таблицы из строк +Разбивает строку **str** на части по указанному разделителю/выражению **separator** и возвращает результат ввиде таблицы из строк. Если **withpattern** равен **true**, то параметр **separator** будет определяться как регулярное выражение. + ```lua -function string.split(str: string, delimiter: string) -> table[string] +string.split(str: string, delimiter: string) -> table[string] ``` -Экранирует специальные символы в строке, такие как `()[]+-.$%^?*` в формате `%символ`. Символ `NUL` (`\0`) будет преобразован в `%z` +Разбивает строку **str** на части по указанному разделителю **delimiter** и возвращает результат ввиде таблицы из строк. + ```lua -function string.pattern_safe(str: string) +string.pattern_safe(str: string) ``` -Разбивает секунды на часы, минуты и миллисекунды и форматирует в **format** с следующим порядком параметров: `минуты, секунды, миллисекунды` и после возвращает результат. Если **format** не указан, то возвращает таблицу, где: **h** - hours, **m** - minutes, **s** - seconds, **ms** - milliseconds +Экранирует специальные символы в строке, такие как `()[]+-.$%^?*` в формате `%символ`. Символ `NUL` (`\0`) будет преобразован в `%z`. + ```lua -function string.formatted_time(seconds: number, format: string) -> string | table +string.formatted_time(seconds: number, format: string) -> string | table ``` -Заменяет все подстроки в **str**, равные **tofind** на **toreplace** и возвращает строку со всеми измененными подстроками +Разбивает секунды на часы, минуты и миллисекунды и форматирует в **format** с следующим порядком параметров: `минуты, секунды, миллисекунды` и после возвращает результат. Если **format** не указан, то возвращает таблицу, где: **h** - hours, **m** - minutes, **s** - seconds, **ms** - milliseconds. + ```lua -function string.replace(str: string, tofind: string, toreplace: string) -> string +string.replace(str: string, tofind: string, toreplace: string) -> string +``` + +Заменяет все подстроки в **str**, равные **tofind** на **toreplace** и возвращает строку со всеми измененными подстроками. + +```lua +string.trim(str: string, char: string) -> string ``` Удаляет все символы, равные **char** из строки **str** с левого и правого конца и возвращает результат. Если параметр **char** не определен, то будут выбраны все пустые символы. + ```lua -function string.trim(str: string, char: string) -> string +string.trim_left(str: string, char: string) -> string ``` Удаляет все символы, равные **char** из строки **str** с левого конца и возвращает результат. Если параметр **char** не определен, то будут выбраны все пустые символы. + ```lua -function string.trim_left(str: string, char: string) -> string +string.trim_right(str: string, char: string) -> string ``` Удаляет все символы, равные **char** из строки **str** с правого конца и возвращает результат. Если параметр **char** не определен, то будут выбраны все пустые символы. + ```lua -function string.trim_right(str: string, char: string) -> string +string.starts_with(str: string, start: string) -> bool ``` Возвращает **true**, если строка **str** начинается на подстроку **start** + ```lua -function string.starts_with(str: string, start: string) -> bool +string.ends_with(str: string, endStr: string) -> bool ``` Возвращает **true**, если строка **str** заканчивается на подстроку **endStr** -```lua -function string.ends_with(str: string, endStr: string) -> bool -``` Также важно подметить, что все выше перечисленные функции, расширяющие **string** можно использовать как мета-методы на экземплярах строк, т.е.: @@ -103,39 +120,51 @@ end Также функции `string.lower` и `string.upper` переопределены на `utf8.lower` и `utf8.upper` +```lua +string.escape(str: string) -> string +``` + +Экранирует строку. Является псевдонимом `utf8.escape`. + ## Расширения для math -Ограничивает число **_in** по лимитам **low** и **high**. Т.е.: Если **_in** больше чем **high** - вернётся **high**, если **_in** меньше чем **low** - вернётся **low**. В противном случае вернётся само число ```lua -function math.clamp(_in, low, high) +math.clamp(_in, low, high) ``` -Возвращает случайное дробное число в диапазоне от **low** до **high** +Ограничивает число **_in** по лимитам **low** и **high**. Т.е.: Если **_in** больше чем **high** - вернётся **high**, если **_in** меньше чем **low** - вернётся **low**. В противном случае вернётся само число. + ```lua -function math.rand(low, high) +math.rand(low, high) ``` +Возвращает случайное дробное число в диапазоне от **low** до **high**. + ## Дополнительные глобальные функции В этом же скрипте также определены и другие глобальные функции которые доступны для использования. Ниже их список -Возвращает **true**, если переданная таблица является массивом, тоесть если каждый ключ это целое число больше или равное единице и если каждый ключ следует за прошлым ```lua -function is_array(x: table) -> bool +is_array(x: table) -> bool ``` -Разбивает путь на две части и возвращает их: входную точку и путь к файлу +Возвращает **true**, если переданная таблица является массивом, тоесть если каждый ключ это целое число больше или равное единице и если каждый ключ следует за прошлым. + ```lua function parse_path(path: string) -> string, string ``` -Вызывает функцию **func** **iters** раз, передавая ей аргументы `...`, а после выводит в консоль время в микросекундах, которое прошло с момента вызова **timeit** +Разбивает путь на две части и возвращает их: входную точку и путь к файлу. + ```lua function timeit(iters: integer, func: func, ...) ``` -Вызывает остановку корутины до тех пор, пока не пройдёт количество секунд, указанное в **timesec**. Функция может быть использована только внутри корутины +Вызывает функцию **func** **iters** раз, передавая ей аргументы `...`, а после выводит в консоль время в микросекундах, которое прошло с момента вызова **timeit**. + ```lua function sleep(timesec: number) -``` \ No newline at end of file +``` + +Вызывает остановку корутины до тех пор, пока не пройдёт количество секунд, указанное в **timesec**. Функция может быть использована только внутри корутины. diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 530ec091..762610a7 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -162,6 +162,7 @@ end string.lower = utf8.lower string.upper = utf8.upper +string.escape = utf8.escape local meta = getmetatable("") diff --git a/src/logic/scripting/lua/libs/libutf8.cpp b/src/logic/scripting/lua/libs/libutf8.cpp index 85895c5d..4c1f484f 100644 --- a/src/logic/scripting/lua/libs/libutf8.cpp +++ b/src/logic/scripting/lua/libs/libutf8.cpp @@ -94,6 +94,11 @@ static int l_encode(lua::State* L) { return lua::pushlstring(L, bytes, count); } +static int l_escape(lua::State* L) { + auto string = lua::require_lstring(L, 1); + return lua::pushstring(L, util::escape(string)); +} + const luaL_Reg utf8lib[] = { {"tobytes", lua::wrap}, {"tostring", lua::wrap}, @@ -103,5 +108,6 @@ const luaL_Reg utf8lib[] = { {"upper", lua::wrap}, {"lower", lua::wrap}, {"encode", lua::wrap}, + {"escape", lua::wrap}, {NULL, NULL} }; diff --git a/src/util/stringutil.cpp b/src/util/stringutil.cpp index ca7e8e46..12f4e74c 100644 --- a/src/util/stringutil.cpp +++ b/src/util/stringutil.cpp @@ -7,8 +7,7 @@ #include #include -// TODO: finish -std::string util::escape(const std::string& s) { +std::string util::escape(std::string_view s) { std::stringstream ss; ss << '"'; size_t pos = 0; diff --git a/src/util/stringutil.hpp b/src/util/stringutil.hpp index f584a53c..b0cd5d56 100644 --- a/src/util/stringutil.hpp +++ b/src/util/stringutil.hpp @@ -8,7 +8,7 @@ namespace util { /// @brief Function used for string serialization in text formats - std::string escape(const std::string& s); + std::string escape(std::string_view s); /// @brief Function used for error messages std::string quote(const std::string& s); From 712c0756b8cb607e6a226798aeb283ed303b2b7a Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 18 Nov 2024 11:09:27 +0300 Subject: [PATCH 05/24] add debug.get_traceback --- res/scripts/stdmin.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 762610a7..2b6a10fe 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -228,6 +228,20 @@ function file.readlines(path) return lines end +function debug.get_trackback() + local frames = {} + local n = 0 + while true do + local info = debug.getinfo(n) + if info then + table.insert(frames, info) + else + return frames + end + n = n + 1 + end +end + package = { loaded={} } From 0bfc5d2ad4a40388ae0ee1c71561a3ba349786f3 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 18 Nov 2024 11:52:06 +0300 Subject: [PATCH 06/24] add base64 library --- src/logic/scripting/lua/libs/api_lua.hpp | 1 + src/logic/scripting/lua/libs/libbase64.cpp | 52 ++++++++++++++++++++++ src/logic/scripting/lua/lua_engine.cpp | 1 + src/logic/scripting/lua/lua_util.hpp | 5 +++ src/util/stringutil.cpp | 4 +- src/util/stringutil.hpp | 2 +- 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/logic/scripting/lua/libs/libbase64.cpp diff --git a/src/logic/scripting/lua/libs/api_lua.hpp b/src/logic/scripting/lua/libs/api_lua.hpp index bd810833..b0edba79 100644 --- a/src/logic/scripting/lua/libs/api_lua.hpp +++ b/src/logic/scripting/lua/libs/api_lua.hpp @@ -15,6 +15,7 @@ // Libraries extern const luaL_Reg audiolib[]; +extern const luaL_Reg base64lib[]; extern const luaL_Reg bjsonlib[]; extern const luaL_Reg blocklib[]; extern const luaL_Reg cameralib[]; diff --git a/src/logic/scripting/lua/libs/libbase64.cpp b/src/logic/scripting/lua/libs/libbase64.cpp new file mode 100644 index 00000000..26f77eb6 --- /dev/null +++ b/src/logic/scripting/lua/libs/libbase64.cpp @@ -0,0 +1,52 @@ +#include "api_lua.hpp" + +#include "util/stringutil.hpp" + +static int l_encode(lua::State* L) { + if (lua::istable(L, 1)) { + lua::pushvalue(L, 1); + size_t size = lua::objlen(L, 1); + util::Buffer buffer(size); + for (size_t i = 0; i < size; i++) { + lua::rawgeti(L, i + 1); + buffer[i] = lua::tointeger(L, -1); + lua::pop(L); + } + lua::pop(L); + return lua::pushstring(L, util::base64_encode( + reinterpret_cast(buffer.data()), buffer.size() + )); + } else if (auto bytes = lua::touserdata(L, 1)) { + return lua::pushstring( + L, + util::base64_encode( + bytes->data().data(), + bytes->data().size() + ) + ); + } + throw std::runtime_error("array or ByteArray expected"); +} + +static int l_decode(lua::State* L) { + auto buffer = util::base64_decode(lua::require_lstring(L, 1)); + if (lua::toboolean(L, 2)) { + lua::createtable(L, buffer.size(), 0); + for (size_t i = 0; i < buffer.size(); i++) { + lua::pushinteger(L, buffer[i] & 0xFF); + lua::rawseti(L, i+1); + } + } else { + lua::newuserdata(L, buffer.size()); + auto bytearray = lua::touserdata(L, -1); + bytearray->data().reserve(buffer.size()); + std::memcpy(bytearray->data().data(), buffer.data(), buffer.size()); + } + return 1; +} + +const luaL_Reg base64lib[] = { + {"encode", lua::wrap}, + {"decode", lua::wrap}, + {NULL, NULL} +}; diff --git a/src/logic/scripting/lua/lua_engine.cpp b/src/logic/scripting/lua/lua_engine.cpp index fe3e75b5..1d24ec93 100644 --- a/src/logic/scripting/lua/lua_engine.cpp +++ b/src/logic/scripting/lua/lua_engine.cpp @@ -39,6 +39,7 @@ static void remove_lib_funcs( } static void create_libs(State* L, StateType stateType) { + openlib(L, "base64", base64lib); openlib(L, "bjson", bjsonlib); openlib(L, "block", blocklib); openlib(L, "core", corelib); diff --git a/src/logic/scripting/lua/lua_util.hpp b/src/logic/scripting/lua/lua_util.hpp index f2b51c53..70dd7705 100644 --- a/src/logic/scripting/lua/lua_util.hpp +++ b/src/logic/scripting/lua/lua_util.hpp @@ -240,6 +240,11 @@ namespace lua { inline const char* tostring(lua::State* L, int idx) { return lua_tostring(L, idx); } + inline std::string_view tolstring(lua::State* L, int idx) { + size_t len = 0; + auto string = lua_tolstring(L, idx, &len); + return std::string_view(string, len); + } inline const void* topointer(lua::State* L, int idx) { return lua_topointer(L, idx); } diff --git a/src/util/stringutil.cpp b/src/util/stringutil.cpp index 12f4e74c..1fabcd2c 100644 --- a/src/util/stringutil.cpp +++ b/src/util/stringutil.cpp @@ -363,8 +363,8 @@ util::Buffer util::base64_decode(const char* str, size_t size) { return bytes; } -util::Buffer util::base64_decode(const std::string& str) { - return base64_decode(str.c_str(), str.size()); +util::Buffer util::base64_decode(std::string_view str) { + return base64_decode(str.data(), str.size()); } int util::replaceAll( diff --git a/src/util/stringutil.hpp b/src/util/stringutil.hpp index b0cd5d56..edd0df17 100644 --- a/src/util/stringutil.hpp +++ b/src/util/stringutil.hpp @@ -63,7 +63,7 @@ namespace util { std::string base64_encode(const ubyte* data, size_t size); util::Buffer base64_decode(const char* str, size_t size); - util::Buffer base64_decode(const std::string& str); + util::Buffer base64_decode(std::string_view str); std::string tohex(uint64_t value); From d6608803652a7cc3e36b65b91e2aea9bb2c1afe0 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 18 Nov 2024 12:37:48 +0300 Subject: [PATCH 07/24] fix util::base64_encode --- src/util/stringutil.cpp | 2 +- test/util/stringutil.cpp | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/util/stringutil.cpp b/src/util/stringutil.cpp index 1fabcd2c..d1148da5 100644 --- a/src/util/stringutil.cpp +++ b/src/util/stringutil.cpp @@ -317,7 +317,7 @@ std::string util::base64_encode(const ubyte* data, size_t size) { ending[i - fullsegments] = data[i]; } size_t trailing = size - fullsegments; - { + if (trailing) { char output[] = "===="; output[0] = B64ABC[(ending[0] & 0b11111100) >> 2]; output[1] = diff --git a/test/util/stringutil.cpp b/test/util/stringutil.cpp index 7bd0f85c..2f27a243 100644 --- a/test/util/stringutil.cpp +++ b/test/util/stringutil.cpp @@ -15,3 +15,19 @@ TEST(stringutil, utf8) { std::string str2 = util::u32str2str_utf8(u32str); EXPECT_EQ(str, str2); } + +TEST(stringutil, base64) { + srand(2019); + for (size_t size = 0; size < 30; size++) { + auto bytes = std::make_unique(size); + for (int i = 0; i < size; i++) { + bytes[i] = rand(); + } + auto base64 = util::base64_encode(bytes.get(), size); + auto decoded = util::base64_decode(base64); + ASSERT_EQ(size, decoded.size()); + for (size_t i = 0; i < size; i++) { + ASSERT_EQ(bytes[i], decoded[i]); + } + } +} From 801650824ecd00d0a9024701fb65b4d35b2f229b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 18 Nov 2024 14:03:30 +0300 Subject: [PATCH 08/24] add 'text-color' textbox property --- doc/en/xml-ui-layouts.md | 1 + doc/ru/xml-ui-layouts.md | 1 + src/graphics/ui/elements/TextBox.cpp | 11 ++++++++++- src/graphics/ui/elements/TextBox.hpp | 4 ++++ src/graphics/ui/gui_xml.cpp | 3 +++ src/logic/scripting/lua/libs/libgui.cpp | 14 ++++++++++++++ 6 files changed, 33 insertions(+), 1 deletion(-) diff --git a/doc/en/xml-ui-layouts.md b/doc/en/xml-ui-layouts.md index ac657e44..f4db96c6 100644 --- a/doc/en/xml-ui-layouts.md +++ b/doc/en/xml-ui-layouts.md @@ -105,6 +105,7 @@ Inner text - initially entered text - `text-wrap` - allows automatic text wrapping (works only with multiline: "true") - `editable` - determines whether the text can be edited. - `error-color` - color when entering incorrect data (the text does not pass the validator check). Type: RGBA color. +- `text-color` - text color. Type: RGBA color. - `validator` - lua function that checks text for correctness. Takes a string as input, returns true if the text is correct. - `onup` - lua function called when the up arrow is pressed. - `ondown` - lua function called when the down arrow is pressed. diff --git a/doc/ru/xml-ui-layouts.md b/doc/ru/xml-ui-layouts.md index bdf82f1b..adffcd73 100644 --- a/doc/ru/xml-ui-layouts.md +++ b/doc/ru/xml-ui-layouts.md @@ -106,6 +106,7 @@ - `text-wrap` - разрешает автоматический перенос текста (работает только при multiline: "true") - `editable`- определяет возможность редактирования текста. - `error-color` - цвет при вводе некорректных данных (текст не проходит проверку валидатора). Тип: RGBA цвет. +- `text-color` - цвет текста. Тип: RGBA цвет. - `validator` - lua функция, проверяющая текст на корректность. Принимает на вход строку, возвращает true если текст корректен. - `onup` - lua функция вызываемая при нажатии стрелки вверх. - `ondown` - lua функция вызываемая при нажатии стрелки вниз. diff --git a/src/graphics/ui/elements/TextBox.cpp b/src/graphics/ui/elements/TextBox.cpp index 9fe44327..a4e613d3 100644 --- a/src/graphics/ui/elements/TextBox.cpp +++ b/src/graphics/ui/elements/TextBox.cpp @@ -126,7 +126,7 @@ void TextBox::drawBackground(const DrawContext* pctx, Assets*) { } void TextBox::refreshLabel() { - label->setColor(glm::vec4(input.empty() ? 0.5f : 1.0f)); + label->setColor(textColor * glm::vec4(input.empty() ? 0.5f : 1.0f)); label->setText(input.empty() && !hint.empty() ? hint : getText()); if (autoresize && font) { @@ -619,6 +619,15 @@ glm::vec4 TextBox::getFocusedColor() const { return focusedColor; } + +void TextBox::setTextColor(glm::vec4 color) { + this->textColor = color; +} + +glm::vec4 TextBox::getTextColor() const { + return textColor; +} + void TextBox::setErrorColor(glm::vec4 color) { this->invalidColor = color; } diff --git a/src/graphics/ui/elements/TextBox.hpp b/src/graphics/ui/elements/TextBox.hpp index 834f7a64..27b6e9c9 100644 --- a/src/graphics/ui/elements/TextBox.hpp +++ b/src/graphics/ui/elements/TextBox.hpp @@ -12,6 +12,7 @@ namespace gui { protected: glm::vec4 focusedColor {0.0f, 0.0f, 0.0f, 1.0f}; glm::vec4 invalidColor {0.1f, 0.05f, 0.03f, 1.0f}; + glm::vec4 textColor {1.0f, 1.0f, 1.0f, 1.0f}; std::shared_ptr