From a6e2ceebb832ddb43e0cb606f571a99b8477741b Mon Sep 17 00:00:00 2001 From: uramer Date: Sun, 7 Jan 2024 23:29:20 +0100 Subject: [PATCH] Don't clear menu UI on game load --- apps/openmw/mwgui/windowmanagerimp.cpp | 3 ++- apps/openmw/mwlua/context.hpp | 1 + apps/openmw/mwlua/luamanagerimp.cpp | 11 ++++++++--- apps/openmw/mwlua/uibindings.cpp | 24 ++++++++++++++++++------ components/lua_ui/element.cpp | 17 +++++++++++++---- components/lua_ui/element.hpp | 20 +++++++++++++++----- components/lua_ui/util.cpp | 13 ++++++++++--- components/lua_ui/util.hpp | 3 ++- 8 files changed, 69 insertions(+), 23 deletions(-) diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 09b4bd5d5f..c6b729332a 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -546,7 +546,8 @@ namespace MWGui { try { - LuaUi::clearUserInterface(); + LuaUi::clearGameInterface(); + LuaUi::clearMenuInterface(); mStatsWatcher.reset(); diff --git a/apps/openmw/mwlua/context.hpp b/apps/openmw/mwlua/context.hpp index 68b46164d6..def38a5309 100644 --- a/apps/openmw/mwlua/context.hpp +++ b/apps/openmw/mwlua/context.hpp @@ -15,6 +15,7 @@ namespace MWLua struct Context { + bool mIsMenu; bool mIsGlobal; LuaManager* mLuaManager; LuaUtil::LuaState* mLua; diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index 2e60d4ea2d..97e1dfae39 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -75,6 +75,7 @@ namespace MWLua void LuaManager::init() { Context context; + context.mIsMenu = false; context.mIsGlobal = true; context.mLuaManager = this; context.mLua = &mLua; @@ -86,11 +87,14 @@ namespace MWLua localContext.mIsGlobal = false; localContext.mSerializer = mLocalSerializer.get(); + Context menuContext = context; + menuContext.mIsMenu = true; + for (const auto& [name, package] : initCommonPackages(context)) mLua.addCommonPackage(name, package); for (const auto& [name, package] : initGlobalPackages(context)) mGlobalScripts.addPackage(name, package); - for (const auto& [name, package] : initMenuPackages(context)) + for (const auto& [name, package] : initMenuPackages(menuContext)) mMenuScripts.addPackage(name, package); mLocalPackages = initLocalPackages(localContext); @@ -278,7 +282,7 @@ namespace MWLua void LuaManager::clear() { - LuaUi::clearUserInterface(); + LuaUi::clearGameInterface(); mUiResourceManager.clear(); MWBase::Environment::get().getWorld()->getPostProcessor()->disableDynamicShaders(); mActiveLocalScripts.clear(); @@ -526,7 +530,8 @@ namespace MWLua { Log(Debug::Info) << "Reload Lua"; - LuaUi::clearUserInterface(); + LuaUi::clearGameInterface(); + LuaUi::clearMenuInterface(); MWBase::Environment::get().getWindowManager()->setConsoleMode(""); MWBase::Environment::get().getL10nManager()->dropCache(); mUiResourceManager.clear(); diff --git a/apps/openmw/mwlua/uibindings.cpp b/apps/openmw/mwlua/uibindings.cpp index 3a838f4544..54d8523b4d 100644 --- a/apps/openmw/mwlua/uibindings.cpp +++ b/apps/openmw/mwlua/uibindings.cpp @@ -155,15 +155,27 @@ namespace MWLua } }; api["content"] = LuaUi::loadContentConstructor(context.mLua); - api["create"] = [luaManager = context.mLuaManager](const sol::table& layout) { - auto element = LuaUi::Element::make(layout); - luaManager->addAction([element] { wrapAction(element, [&] { element->create(); }); }, "Create UI"); + api["create"] = [context](const sol::table& layout) { + auto element + = context.mIsMenu ? LuaUi::Element::makeMenuElement(layout) : LuaUi::Element::makeGameElement(layout); + context.mLuaManager->addAction([element] { wrapAction(element, [&] { element->create(); }); }, "Create UI"); return element; }; api["updateAll"] = [context]() { - LuaUi::Element::forEach([](LuaUi::Element* e) { e->mUpdate = true; }); - context.mLuaManager->addAction( - []() { LuaUi::Element::forEach([](LuaUi::Element* e) { e->update(); }); }, "Update all UI elements"); + if (context.mIsMenu) + { + LuaUi::Element::forEachMenuElement([](LuaUi::Element* e) { e->mUpdate = true; }); + context.mLuaManager->addAction( + []() { LuaUi::Element::forEachMenuElement([](LuaUi::Element* e) { e->update(); }); }, + "Update all menu UI elements"); + } + else + { + LuaUi::Element::forEachGameElement([](LuaUi::Element* e) { e->mUpdate = true; }); + context.mLuaManager->addAction( + []() { LuaUi::Element::forEachGameElement([](LuaUi::Element* e) { e->update(); }); }, + "Update all game UI elements"); + } }; api["_getMenuTransparency"] = []() -> float { return Settings::gui().mMenuTransparency; }; diff --git a/components/lua_ui/element.cpp b/components/lua_ui/element.cpp index baa3438982..b74938b044 100644 --- a/components/lua_ui/element.cpp +++ b/components/lua_ui/element.cpp @@ -240,7 +240,8 @@ namespace LuaUi } } - std::map> Element::sAllElements; + std::map> Element::sGameElements; + std::map> Element::sMenuElements; Element::Element(sol::table layout) : mRoot(nullptr) @@ -251,10 +252,17 @@ namespace LuaUi { } - std::shared_ptr Element::make(sol::table layout) + std::shared_ptr Element::makeGameElement(sol::table layout) { std::shared_ptr ptr(new Element(std::move(layout))); - sAllElements[ptr.get()] = ptr; + sGameElements[ptr.get()] = ptr; + return ptr; + } + + std::shared_ptr Element::makeMenuElement(sol::table layout) + { + std::shared_ptr ptr(new Element(std::move(layout))); + sMenuElements[ptr.get()] = ptr; return ptr; } @@ -302,6 +310,7 @@ namespace LuaUi mRoot = nullptr; mLayout = sol::make_object(mLayout.lua_state(), sol::nil); } - sAllElements.erase(this); + sGameElements.erase(this); + sMenuElements.erase(this); } } diff --git a/components/lua_ui/element.hpp b/components/lua_ui/element.hpp index 5aadb1beab..0446f448b6 100644 --- a/components/lua_ui/element.hpp +++ b/components/lua_ui/element.hpp @@ -7,12 +7,20 @@ namespace LuaUi { struct Element { - static std::shared_ptr make(sol::table layout); + static std::shared_ptr makeGameElement(sol::table layout); + static std::shared_ptr makeMenuElement(sol::table layout); template - static void forEach(Callback callback) + static void forEachGameElement(Callback callback) { - for (auto& [e, _] : sAllElements) + for (auto& [e, _] : sGameElements) + callback(e); + } + + template + static void forEachMenuElement(Callback callback) + { + for (auto& [e, _] : sMenuElements) callback(e); } @@ -28,12 +36,14 @@ namespace LuaUi void destroy(); - friend void clearUserInterface(); + friend void clearGameInterface(); + friend void clearMenuInterface(); private: Element(sol::table layout); sol::table layout() { return LuaUtil::cast(mLayout); } - static std::map> sAllElements; + static std::map> sGameElements; + static std::map> sMenuElements; }; } diff --git a/components/lua_ui/util.cpp b/components/lua_ui/util.cpp index 78237c54ea..ac5e63e405 100644 --- a/components/lua_ui/util.cpp +++ b/components/lua_ui/util.cpp @@ -44,10 +44,17 @@ namespace LuaUi return types; } - void clearUserInterface() + void clearGameInterface() { + // TODO: move settings clearing logic to Lua? clearSettings(); - while (!Element::sAllElements.empty()) - Element::sAllElements.begin()->second->destroy(); + while (!Element::sGameElements.empty()) + Element::sGameElements.begin()->second->destroy(); + } + + void clearMenuInterface() + { + while (!Element::sMenuElements.empty()) + Element::sMenuElements.begin()->second->destroy(); } } diff --git a/components/lua_ui/util.hpp b/components/lua_ui/util.hpp index 78daf6669c..2b5c4ff13c 100644 --- a/components/lua_ui/util.hpp +++ b/components/lua_ui/util.hpp @@ -10,7 +10,8 @@ namespace LuaUi const std::unordered_map& widgetTypeToName(); - void clearUserInterface(); + void clearGameInterface(); + void clearMenuInterface(); } #endif // OPENMW_LUAUI_WIDGETLIST