1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-10-14 03:56:33 +00:00

Merge branch 'solidlyrooted' into 'master'

Don't break LuaUi::Element's invariant

Closes #8720

See merge request OpenMW/openmw!4930
This commit is contained in:
Alexei Kotov 2025-10-11 11:59:17 +03:00
commit c75aed5175
2 changed files with 4 additions and 19 deletions

View file

@ -22,21 +22,6 @@ namespace MWLua
{
namespace
{
template <typename Fn>
void wrapAction(const std::shared_ptr<LuaUi::Element>& element, Fn&& fn)
{
try
{
fn();
}
catch (...)
{
// prevent any actions on a potentially corrupted widget
element->mRoot = nullptr;
throw;
}
}
const std::unordered_map<MWGui::GuiMode, std::string_view> modeToName{
{ MWGui::GM_Inventory, "Interface" },
{ MWGui::GM_Container, "Container" },
@ -142,7 +127,7 @@ namespace MWLua
api["create"] = [luaManager = context.mLuaManager, menu](const sol::table& layout) {
auto element = LuaUi::Element::make(layout, menu);
luaManager->addAction([element] { wrapAction(element, [&] { element->create(); }); }, "Create UI");
luaManager->addAction([element] { element->create(); }, "Create UI");
return element;
};
@ -327,14 +312,13 @@ namespace MWLua
if (element->mState != LuaUi::Element::Created)
return;
element->mState = LuaUi::Element::Update;
luaManager->addAction([element] { wrapAction(element, [&] { element->update(); }); }, "Update UI");
luaManager->addAction([element] { element->update(); }, "Update UI");
};
uiElement["destroy"] = [luaManager = context.mLuaManager](const std::shared_ptr<LuaUi::Element>& element) {
if (element->mState == LuaUi::Element::Destroyed)
return;
element->mState = LuaUi::Element::Destroy;
luaManager->addAction(
[element] { wrapAction(element, [&] { LuaUi::Element::erase(element.get()); }); }, "Destroy UI");
luaManager->addAction([element] { LuaUi::Element::erase(element.get()); }, "Destroy UI");
};
auto uiLayer = context.sol().new_usertype<LuaUi::Layer>("UiLayer");

View file

@ -296,6 +296,7 @@ namespace LuaUi
children.erase(it);
parent->setChildren(children);
mRoot = nullptr;
mState = New;
throw;
}
parent->setChildren(children);