From 5b8cba7323031bba5b862401b3cf4620f9fce933 Mon Sep 17 00:00:00 2001 From: uramer Date: Mon, 22 Nov 2021 19:17:36 +0000 Subject: [PATCH] Clear Lua-created UI on game load and reloadlua command --- apps/openmw/mwlua/luabindings.hpp | 1 + apps/openmw/mwlua/luamanagerimp.cpp | 2 ++ apps/openmw/mwlua/uibindings.cpp | 9 +++++++++ 3 files changed, 12 insertions(+) diff --git a/apps/openmw/mwlua/luabindings.hpp b/apps/openmw/mwlua/luabindings.hpp index aad3183734..b021354a75 100644 --- a/apps/openmw/mwlua/luabindings.hpp +++ b/apps/openmw/mwlua/luabindings.hpp @@ -58,6 +58,7 @@ namespace MWLua // Implemented in uibindings.cpp sol::table initUserInterfacePackage(const Context&); + void clearUserInterface(); // Implemented in inputbindings.cpp sol::table initInputPackage(const Context&); diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index f55ca20f02..2f3df00f7f 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -220,6 +220,7 @@ namespace MWLua mPlayer.getRefData().setLuaScripts(nullptr); mPlayer = MWWorld::Ptr(); } + clearUserInterface(); } void LuaManager::setupPlayer(const MWWorld::Ptr& ptr) @@ -425,6 +426,7 @@ namespace MWLua continue; ESM::LuaScripts data; scripts->save(data); + clearUserInterface(); scripts->load(data); } for (LocalScripts* scripts : mActiveLocalScripts) diff --git a/apps/openmw/mwlua/uibindings.cpp b/apps/openmw/mwlua/uibindings.cpp index 7008a0caea..9982b857c8 100644 --- a/apps/openmw/mwlua/uibindings.cpp +++ b/apps/openmw/mwlua/uibindings.cpp @@ -10,6 +10,7 @@ namespace MWLua { namespace { + std::set allElements; class UiAction final : public Action { @@ -152,6 +153,7 @@ namespace MWLua { if (element->mDestroy) return; + allElements.erase(element.get()); element->mDestroy = true; context.mLuaManager->addAction(std::make_unique(UiAction::DESTROY, element, context.mLua)); }; @@ -168,6 +170,7 @@ namespace MWLua api["create"] = [context](const sol::table& layout) { auto element = std::make_shared(layout); + allElements.emplace(element.get()); context.mLuaManager->addAction(std::make_unique(UiAction::CREATE, element, context.mLua)); return element; }; @@ -180,4 +183,10 @@ namespace MWLua return LuaUtil::makeReadOnly(api); } + void clearUserInterface() + { + for (auto element : allElements) + element->destroy(); + allElements.clear(); + } }