From 01c7cd91414e68a7c4ead955ebb1b841362b9f6d Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 13 May 2024 17:10:12 +0300 Subject: [PATCH] input callback fix + added focused property --- src/logic/scripting/lua/libgui.cpp | 18 ++++++++++++++++++ src/logic/scripting/lua/libinput.cpp | 7 ++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/logic/scripting/lua/libgui.cpp b/src/logic/scripting/lua/libgui.cpp index b8c30b6b..5bcd62b4 100644 --- a/src/logic/scripting/lua/libgui.cpp +++ b/src/logic/scripting/lua/libgui.cpp @@ -252,6 +252,9 @@ static int p_is_enabled(UINode* node) { static int p_move_into(UINode*) { return state->pushcfunction(l_uinode_move_into); } +static int p_get_focused(UINode* node) { + return state->pushboolean(node->isFocused()); +} static int l_gui_getattr(lua_State* L) { auto docname = lua_tostring(L, 1); @@ -287,6 +290,7 @@ static int l_gui_getattr(lua_State* L) { {"back", p_get_back}, {"reset", p_get_reset}, {"inventory", p_get_inventory}, + {"focused", p_get_focused}, }; auto func = getters.find(attr); if (func != getters.end()) { @@ -390,6 +394,13 @@ static void p_set_inventory(UINode* node, int idx) { } } } +static void p_set_focused(std::shared_ptr node, int idx) { + if (state->toboolean(idx) && !node->isFocused()) { + scripting::engine->getGUI()->setFocus(node); + } else if (node->isFocused()){ + node->defocus(); + } +} static int l_gui_setattr(lua_State* L) { auto docname = lua_tostring(L, 1); @@ -425,6 +436,13 @@ static int l_gui_setattr(lua_State* L) { if (func != setters.end()) { func->second(node.get(), 4); } + static const std::unordered_map,int)>> setters2 { + {"focused", p_set_focused}, + }; + auto func2 = setters2.find(attr); + if (func2 != setters2.end()) { + func2->second(node, 4); + } return 0; } diff --git a/src/logic/scripting/lua/libinput.cpp b/src/logic/scripting/lua/libinput.cpp index 1c021093..7f3fbc20 100644 --- a/src/logic/scripting/lua/libinput.cpp +++ b/src/logic/scripting/lua/libinput.cpp @@ -7,6 +7,7 @@ #include "../../../window/input.hpp" #include "../../../window/Events.hpp" #include "../../../util/stringutil.hpp" +#include "../../../graphics/ui/GUI.hpp" #include "../../../frontend/screens/Screen.hpp" #include "../../../frontend/hud.hpp" #include "../../../engine.hpp" @@ -31,7 +32,11 @@ static int l_add_callback(lua_State* L) { throw std::runtime_error("unknown binding "+util::quote(bindname)); } state->pushvalue(2); - runnable callback = state->createRunnable(); + runnable callback = [=]() { + if (!scripting::engine->getGUI()->isFocusCaught()) { + state->createRunnable(); + } + }; if (hud) { hud->keepAlive(bind->second.onactived.add(callback)); } else {