From f89c252ddfe5657dc6a65cd059e1deb16f6bea37 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 19 Mar 2024 14:04:06 +0300 Subject: [PATCH] lua suppliers update + label supplier XML attribute --- src/frontend/gui/gui_xml.cpp | 8 ++++++++ src/logic/scripting/lua/LuaState.cpp | 8 ++++++++ src/logic/scripting/lua/LuaState.h | 2 ++ src/logic/scripting/scripting_functional.cpp | 16 ++++++++++++---- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/frontend/gui/gui_xml.cpp b/src/frontend/gui/gui_xml.cpp index 8ddb4494..228abac2 100644 --- a/src/frontend/gui/gui_xml.cpp +++ b/src/frontend/gui/gui_xml.cpp @@ -170,6 +170,14 @@ static std::shared_ptr readLabel(UiXmlReader& reader, xml::xmlelement el align_from_string(element->attr("valign").getText(), label->getVerticalAlign()) ); } + if (element->has("supplier")) { + auto supplier = scripting::create_wstring_supplier( + reader.getEnvironment().getId(), + element->attr("supplier").getText(), + reader.getFilename() + ); + label->textSupplier(supplier); + } return label; } diff --git a/src/logic/scripting/lua/LuaState.cpp b/src/logic/scripting/lua/LuaState.cpp index e472831d..1dab0c38 100644 --- a/src/logic/scripting/lua/LuaState.cpp +++ b/src/logic/scripting/lua/LuaState.cpp @@ -247,6 +247,14 @@ const char* lua::LuaState::tostring(int idx) { return lua_tostring(L, idx); } +bool lua::LuaState::isstring(int idx) { + return lua_isstring(L, idx); +} + +bool lua::LuaState::isfunction(int idx) { + return lua_isfunction(L, idx); +} + void lua::LuaState::openlib(const std::string& name, const luaL_Reg* libfuncs, int nup) { lua_newtable(L); luaL_setfuncs(L, libfuncs, nup); diff --git a/src/logic/scripting/lua/LuaState.h b/src/logic/scripting/lua/LuaState.h index a49d1660..5e753bb1 100644 --- a/src/logic/scripting/lua/LuaState.h +++ b/src/logic/scripting/lua/LuaState.h @@ -45,6 +45,8 @@ namespace lua { luaint tointeger(int idx); luanumber tonumber(int idx); const char* tostring(int idx); + bool isstring(int idx); + bool isfunction(int idx); int call(int argc); int callNoThrow(int argc); int execute(int env, const std::string& src, const std::string& file=""); diff --git a/src/logic/scripting/scripting_functional.cpp b/src/logic/scripting/scripting_functional.cpp index d45bbfda..2a9bb81c 100644 --- a/src/logic/scripting/scripting_functional.cpp +++ b/src/logic/scripting/scripting_functional.cpp @@ -58,7 +58,9 @@ wstringsupplier scripting::create_wstring_supplier( ) { return [=](){ if (processCallback(env, src, file)) { - state->callNoThrow(0); + if (state->isfunction(-1)) { + state->callNoThrow(0); + } auto str = state->tostring(-1); state->pop(); return util::str2wstr_utf8(str); } @@ -101,7 +103,9 @@ boolsupplier scripting::create_bool_supplier( ) { return [=](){ if (processCallback(env, src, file)) { - state->callNoThrow(0); + if (state->isfunction(-1)) { + state->callNoThrow(0); + } bool x = state->toboolean(-1); state->pop(); return x; } @@ -129,7 +133,9 @@ doublesupplier scripting::create_number_supplier( ) { return [=](){ if (processCallback(env, src, file)) { - state->callNoThrow(0); + if (state->isfunction(-1)) { + state->callNoThrow(0); + } lua::luanumber x = state->tonumber(-1); state->pop(); return x; } @@ -159,7 +165,9 @@ vec2supplier scripting::create_vec2_supplier( ) { return [=](){ if (processCallback(env, src, file)) { - state->callNoThrow(0); + if (state->isfunction(-1)) { + state->callNoThrow(0); + } lua::luanumber y = state->tonumber(-1); state->pop(); lua::luanumber x = state->tonumber(-1); state->pop(); return glm::vec2(x, y);