mirror of
https://github.com/OpenMW/openmw.git
synced 2025-10-14 22:26:41 +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:
commit
c75aed5175
2 changed files with 4 additions and 19 deletions
|
@ -22,21 +22,6 @@ namespace MWLua
|
||||||
{
|
{
|
||||||
namespace
|
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{
|
const std::unordered_map<MWGui::GuiMode, std::string_view> modeToName{
|
||||||
{ MWGui::GM_Inventory, "Interface" },
|
{ MWGui::GM_Inventory, "Interface" },
|
||||||
{ MWGui::GM_Container, "Container" },
|
{ MWGui::GM_Container, "Container" },
|
||||||
|
@ -142,7 +127,7 @@ namespace MWLua
|
||||||
|
|
||||||
api["create"] = [luaManager = context.mLuaManager, menu](const sol::table& layout) {
|
api["create"] = [luaManager = context.mLuaManager, menu](const sol::table& layout) {
|
||||||
auto element = LuaUi::Element::make(layout, menu);
|
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;
|
return element;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -327,14 +312,13 @@ namespace MWLua
|
||||||
if (element->mState != LuaUi::Element::Created)
|
if (element->mState != LuaUi::Element::Created)
|
||||||
return;
|
return;
|
||||||
element->mState = LuaUi::Element::Update;
|
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) {
|
uiElement["destroy"] = [luaManager = context.mLuaManager](const std::shared_ptr<LuaUi::Element>& element) {
|
||||||
if (element->mState == LuaUi::Element::Destroyed)
|
if (element->mState == LuaUi::Element::Destroyed)
|
||||||
return;
|
return;
|
||||||
element->mState = LuaUi::Element::Destroy;
|
element->mState = LuaUi::Element::Destroy;
|
||||||
luaManager->addAction(
|
luaManager->addAction([element] { LuaUi::Element::erase(element.get()); }, "Destroy UI");
|
||||||
[element] { wrapAction(element, [&] { LuaUi::Element::erase(element.get()); }); }, "Destroy UI");
|
|
||||||
};
|
};
|
||||||
|
|
||||||
auto uiLayer = context.sol().new_usertype<LuaUi::Layer>("UiLayer");
|
auto uiLayer = context.sol().new_usertype<LuaUi::Layer>("UiLayer");
|
||||||
|
|
|
@ -296,6 +296,7 @@ namespace LuaUi
|
||||||
children.erase(it);
|
children.erase(it);
|
||||||
parent->setChildren(children);
|
parent->setChildren(children);
|
||||||
mRoot = nullptr;
|
mRoot = nullptr;
|
||||||
|
mState = New;
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
parent->setChildren(children);
|
parent->setChildren(children);
|
||||||
|
|
Loading…
Reference in a new issue