diff --git a/src/graphics/ui/elements/Container.cpp b/src/graphics/ui/elements/Container.cpp index fe8d77ba..e31cde11 100644 --- a/src/graphics/ui/elements/Container.cpp +++ b/src/graphics/ui/elements/Container.cpp @@ -127,6 +127,14 @@ void Container::remove(std::shared_ptr selected) { refresh(); } +void Container::remove(const std::string& id) { + for (auto& node : nodes) { + if (node->getId() == id) { + return remove(node); + } + } +} + void Container::clear() { for (auto node : nodes) { node->setParent(nullptr); diff --git a/src/graphics/ui/elements/Container.hpp b/src/graphics/ui/elements/Container.hpp index 8aa38b2f..be385f35 100644 --- a/src/graphics/ui/elements/Container.hpp +++ b/src/graphics/ui/elements/Container.hpp @@ -26,6 +26,7 @@ namespace gui { virtual void add(std::shared_ptr node, glm::vec2 pos); virtual void clear(); virtual void remove(std::shared_ptr node); + virtual void remove(const std::string& id); virtual void scrolled(int value) override; virtual void setScrollable(bool flag); void listenInterval(float interval, ontimeout callback, int repeat=-1); diff --git a/src/logic/scripting/lua/libgui.cpp b/src/logic/scripting/lua/libgui.cpp index 1152b0a0..3c738dde 100644 --- a/src/logic/scripting/lua/libgui.cpp +++ b/src/logic/scripting/lua/libgui.cpp @@ -93,6 +93,18 @@ static int l_container_add(lua_State* L) { return 0; } +static int l_node_destruct(lua_State* L) { + auto docnode = getDocumentNode(L); + auto node = std::dynamic_pointer_cast(docnode.node); + engine->getGUI()->postRunnable([node]() { + auto parent = node->getParent(); + if (auto container = dynamic_cast(parent)) { + container->remove(node); + } + }); + return 0; +} + static int l_container_clear(lua_State* L) { auto node = getDocumentNode(L, 1); if (auto container = std::dynamic_pointer_cast(node.node)) { @@ -254,21 +266,25 @@ static int p_get_src(UINode* node) { static int p_get_add(UINode* node) { if (dynamic_cast(node)) { - return state->pushcfunction(l_container_add); + return state->pushcfunction(lua_wrap_errors); } return 0; } +static int p_get_destruct(UINode*) { + return state->pushcfunction(lua_wrap_errors); +} + static int p_get_clear(UINode* node) { if (dynamic_cast(node)) { - return state->pushcfunction(l_container_clear); + return state->pushcfunction(lua_wrap_errors); } return 0; } static int p_set_interval(UINode* node) { if (dynamic_cast(node)) { - return state->pushcfunction(l_container_set_interval); + return state->pushcfunction(lua_wrap_errors); } return 0; } @@ -331,9 +347,10 @@ static int l_gui_getattr(lua_State* L) { {"size", p_get_size}, {"interactive", p_is_interactive}, {"visible", p_is_visible}, - {"enabled", p_is_enabled}, + {"enabled", p_is_enabled}, {"move_into", p_move_into}, {"add", p_get_add}, + {"destruct", p_get_destruct}, {"clear", p_get_clear}, {"setInterval", p_set_interval}, {"placeholder", p_get_placeholder},