mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-28 12:58:00 +03:00
Don't clear menu UI on game load
This commit is contained in:
parent
d1268acf95
commit
a6e2ceebb8
8 changed files with 69 additions and 23 deletions
|
@ -546,7 +546,8 @@ namespace MWGui
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
LuaUi::clearUserInterface();
|
LuaUi::clearGameInterface();
|
||||||
|
LuaUi::clearMenuInterface();
|
||||||
|
|
||||||
mStatsWatcher.reset();
|
mStatsWatcher.reset();
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ namespace MWLua
|
||||||
|
|
||||||
struct Context
|
struct Context
|
||||||
{
|
{
|
||||||
|
bool mIsMenu;
|
||||||
bool mIsGlobal;
|
bool mIsGlobal;
|
||||||
LuaManager* mLuaManager;
|
LuaManager* mLuaManager;
|
||||||
LuaUtil::LuaState* mLua;
|
LuaUtil::LuaState* mLua;
|
||||||
|
|
|
@ -75,6 +75,7 @@ namespace MWLua
|
||||||
void LuaManager::init()
|
void LuaManager::init()
|
||||||
{
|
{
|
||||||
Context context;
|
Context context;
|
||||||
|
context.mIsMenu = false;
|
||||||
context.mIsGlobal = true;
|
context.mIsGlobal = true;
|
||||||
context.mLuaManager = this;
|
context.mLuaManager = this;
|
||||||
context.mLua = &mLua;
|
context.mLua = &mLua;
|
||||||
|
@ -86,11 +87,14 @@ namespace MWLua
|
||||||
localContext.mIsGlobal = false;
|
localContext.mIsGlobal = false;
|
||||||
localContext.mSerializer = mLocalSerializer.get();
|
localContext.mSerializer = mLocalSerializer.get();
|
||||||
|
|
||||||
|
Context menuContext = context;
|
||||||
|
menuContext.mIsMenu = true;
|
||||||
|
|
||||||
for (const auto& [name, package] : initCommonPackages(context))
|
for (const auto& [name, package] : initCommonPackages(context))
|
||||||
mLua.addCommonPackage(name, package);
|
mLua.addCommonPackage(name, package);
|
||||||
for (const auto& [name, package] : initGlobalPackages(context))
|
for (const auto& [name, package] : initGlobalPackages(context))
|
||||||
mGlobalScripts.addPackage(name, package);
|
mGlobalScripts.addPackage(name, package);
|
||||||
for (const auto& [name, package] : initMenuPackages(context))
|
for (const auto& [name, package] : initMenuPackages(menuContext))
|
||||||
mMenuScripts.addPackage(name, package);
|
mMenuScripts.addPackage(name, package);
|
||||||
|
|
||||||
mLocalPackages = initLocalPackages(localContext);
|
mLocalPackages = initLocalPackages(localContext);
|
||||||
|
@ -278,7 +282,7 @@ namespace MWLua
|
||||||
|
|
||||||
void LuaManager::clear()
|
void LuaManager::clear()
|
||||||
{
|
{
|
||||||
LuaUi::clearUserInterface();
|
LuaUi::clearGameInterface();
|
||||||
mUiResourceManager.clear();
|
mUiResourceManager.clear();
|
||||||
MWBase::Environment::get().getWorld()->getPostProcessor()->disableDynamicShaders();
|
MWBase::Environment::get().getWorld()->getPostProcessor()->disableDynamicShaders();
|
||||||
mActiveLocalScripts.clear();
|
mActiveLocalScripts.clear();
|
||||||
|
@ -526,7 +530,8 @@ namespace MWLua
|
||||||
{
|
{
|
||||||
Log(Debug::Info) << "Reload Lua";
|
Log(Debug::Info) << "Reload Lua";
|
||||||
|
|
||||||
LuaUi::clearUserInterface();
|
LuaUi::clearGameInterface();
|
||||||
|
LuaUi::clearMenuInterface();
|
||||||
MWBase::Environment::get().getWindowManager()->setConsoleMode("");
|
MWBase::Environment::get().getWindowManager()->setConsoleMode("");
|
||||||
MWBase::Environment::get().getL10nManager()->dropCache();
|
MWBase::Environment::get().getL10nManager()->dropCache();
|
||||||
mUiResourceManager.clear();
|
mUiResourceManager.clear();
|
||||||
|
|
|
@ -155,15 +155,27 @@ namespace MWLua
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
api["content"] = LuaUi::loadContentConstructor(context.mLua);
|
api["content"] = LuaUi::loadContentConstructor(context.mLua);
|
||||||
api["create"] = [luaManager = context.mLuaManager](const sol::table& layout) {
|
api["create"] = [context](const sol::table& layout) {
|
||||||
auto element = LuaUi::Element::make(layout);
|
auto element
|
||||||
luaManager->addAction([element] { wrapAction(element, [&] { element->create(); }); }, "Create UI");
|
= context.mIsMenu ? LuaUi::Element::makeMenuElement(layout) : LuaUi::Element::makeGameElement(layout);
|
||||||
|
context.mLuaManager->addAction([element] { wrapAction(element, [&] { element->create(); }); }, "Create UI");
|
||||||
return element;
|
return element;
|
||||||
};
|
};
|
||||||
api["updateAll"] = [context]() {
|
api["updateAll"] = [context]() {
|
||||||
LuaUi::Element::forEach([](LuaUi::Element* e) { e->mUpdate = true; });
|
if (context.mIsMenu)
|
||||||
context.mLuaManager->addAction(
|
{
|
||||||
[]() { LuaUi::Element::forEach([](LuaUi::Element* e) { e->update(); }); }, "Update all UI elements");
|
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; };
|
api["_getMenuTransparency"] = []() -> float { return Settings::gui().mMenuTransparency; };
|
||||||
|
|
||||||
|
|
|
@ -240,7 +240,8 @@ namespace LuaUi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<Element*, std::shared_ptr<Element>> Element::sAllElements;
|
std::map<Element*, std::shared_ptr<Element>> Element::sGameElements;
|
||||||
|
std::map<Element*, std::shared_ptr<Element>> Element::sMenuElements;
|
||||||
|
|
||||||
Element::Element(sol::table layout)
|
Element::Element(sol::table layout)
|
||||||
: mRoot(nullptr)
|
: mRoot(nullptr)
|
||||||
|
@ -251,10 +252,17 @@ namespace LuaUi
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Element> Element::make(sol::table layout)
|
std::shared_ptr<Element> Element::makeGameElement(sol::table layout)
|
||||||
{
|
{
|
||||||
std::shared_ptr<Element> ptr(new Element(std::move(layout)));
|
std::shared_ptr<Element> ptr(new Element(std::move(layout)));
|
||||||
sAllElements[ptr.get()] = ptr;
|
sGameElements[ptr.get()] = ptr;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Element> Element::makeMenuElement(sol::table layout)
|
||||||
|
{
|
||||||
|
std::shared_ptr<Element> ptr(new Element(std::move(layout)));
|
||||||
|
sMenuElements[ptr.get()] = ptr;
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,6 +310,7 @@ namespace LuaUi
|
||||||
mRoot = nullptr;
|
mRoot = nullptr;
|
||||||
mLayout = sol::make_object(mLayout.lua_state(), sol::nil);
|
mLayout = sol::make_object(mLayout.lua_state(), sol::nil);
|
||||||
}
|
}
|
||||||
sAllElements.erase(this);
|
sGameElements.erase(this);
|
||||||
|
sMenuElements.erase(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,12 +7,20 @@ namespace LuaUi
|
||||||
{
|
{
|
||||||
struct Element
|
struct Element
|
||||||
{
|
{
|
||||||
static std::shared_ptr<Element> make(sol::table layout);
|
static std::shared_ptr<Element> makeGameElement(sol::table layout);
|
||||||
|
static std::shared_ptr<Element> makeMenuElement(sol::table layout);
|
||||||
|
|
||||||
template <class Callback>
|
template <class Callback>
|
||||||
static void forEach(Callback callback)
|
static void forEachGameElement(Callback callback)
|
||||||
{
|
{
|
||||||
for (auto& [e, _] : sAllElements)
|
for (auto& [e, _] : sGameElements)
|
||||||
|
callback(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Callback>
|
||||||
|
static void forEachMenuElement(Callback callback)
|
||||||
|
{
|
||||||
|
for (auto& [e, _] : sMenuElements)
|
||||||
callback(e);
|
callback(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,12 +36,14 @@ namespace LuaUi
|
||||||
|
|
||||||
void destroy();
|
void destroy();
|
||||||
|
|
||||||
friend void clearUserInterface();
|
friend void clearGameInterface();
|
||||||
|
friend void clearMenuInterface();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Element(sol::table layout);
|
Element(sol::table layout);
|
||||||
sol::table layout() { return LuaUtil::cast<sol::table>(mLayout); }
|
sol::table layout() { return LuaUtil::cast<sol::table>(mLayout); }
|
||||||
static std::map<Element*, std::shared_ptr<Element>> sAllElements;
|
static std::map<Element*, std::shared_ptr<Element>> sGameElements;
|
||||||
|
static std::map<Element*, std::shared_ptr<Element>> sMenuElements;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,10 +44,17 @@ namespace LuaUi
|
||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearUserInterface()
|
void clearGameInterface()
|
||||||
{
|
{
|
||||||
|
// TODO: move settings clearing logic to Lua?
|
||||||
clearSettings();
|
clearSettings();
|
||||||
while (!Element::sAllElements.empty())
|
while (!Element::sGameElements.empty())
|
||||||
Element::sAllElements.begin()->second->destroy();
|
Element::sGameElements.begin()->second->destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearMenuInterface()
|
||||||
|
{
|
||||||
|
while (!Element::sMenuElements.empty())
|
||||||
|
Element::sMenuElements.begin()->second->destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,8 @@ namespace LuaUi
|
||||||
|
|
||||||
const std::unordered_map<std::string, std::string>& widgetTypeToName();
|
const std::unordered_map<std::string, std::string>& widgetTypeToName();
|
||||||
|
|
||||||
void clearUserInterface();
|
void clearGameInterface();
|
||||||
|
void clearMenuInterface();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // OPENMW_LUAUI_WIDGETLIST
|
#endif // OPENMW_LUAUI_WIDGETLIST
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue