diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp index dfd0e6d9df..d41d9cc4f0 100644 --- a/apps/openmw/mwgui/settingswindow.cpp +++ b/apps/openmw/mwgui/settingswindow.cpp @@ -744,16 +744,15 @@ namespace MWGui auto flags = std::regex_constants::icase; std::regex filterRegex(filter, flags); - auto scriptSettings = LuaUi::scriptSettingsPages(); - for (size_t i = 0; i < scriptSettings.size(); ++i) + for (size_t i = 0; i < LuaUi::scriptSettingsPageCount(); ++i) { - LuaUi::ScriptSettingsPage page = scriptSettings[i]; + LuaUi::ScriptSettingsPage page = LuaUi::scriptSettingsPageAt(i); if (std::regex_match(page.mName, filterRegex) || std::regex_match(page.mDescription, filterRegex)) mScriptList->addItem(page.mName, i); } // Hide script settings tab when the game world isn't loaded and scripts couldn't add their settings - bool disabled = scriptSettings.empty(); + bool disabled = LuaUi::scriptSettingsPageCount() == 0; mScriptDisabled->setVisible(disabled); mScriptFilter->setVisible(!disabled); mScriptList->setVisible(!disabled); @@ -793,7 +792,7 @@ namespace MWGui return; } size_t page = *mScriptList->getItemDataAt(index); - mScriptDescription->setCaption(LuaUi::scriptSettingsPages()[page].mDescription); + mScriptDescription->setCaption(LuaUi::scriptSettingsPageAt(page).mDescription); mScriptDescription->setVisible(true); mScriptView->setVisible(false); } diff --git a/apps/openmw/mwlua/uibindings.cpp b/apps/openmw/mwlua/uibindings.cpp index 7b11e1770c..bd19dde114 100644 --- a/apps/openmw/mwlua/uibindings.cpp +++ b/apps/openmw/mwlua/uibindings.cpp @@ -241,16 +241,7 @@ namespace MWLua api["registerSettingsPage"] = [](sol::table options) { - LuaUi::ScriptSettingsPage page; - page.mName = options.get_or("name", std::string()); - if (page.mName.empty()) - throw std::logic_error("No name provided for the settings page"); - page.mDescription = options.get_or("description", std::string()); - auto element = options.get_or>("element", nullptr); - if (!element) - throw std::logic_error("No UI element provided for the settings page"); - page.mElement = element.get(); - LuaUi::registerSettingsPage(page); + LuaUi::registerSettingsPage(options); }; return LuaUtil::makeReadOnly(api); diff --git a/components/lua_ui/scriptsettings.cpp b/components/lua_ui/scriptsettings.cpp index 1a016381cd..2695b9f25d 100644 --- a/components/lua_ui/scriptsettings.cpp +++ b/components/lua_ui/scriptsettings.cpp @@ -8,17 +8,35 @@ namespace LuaUi { namespace { - std::vector allPages; + std::vector allPages; + ScriptSettingsPage parse(const sol::table& options) + { + auto name = options.get_or("name", std::string()); + auto description = options.get_or("description", std::string()); + auto element = options.get_or>("element", nullptr); + if (name.empty()) + Log(Debug::Warning) << "A script settings page has an empty name"; + if (!element.get()) + Log(Debug::Warning) << "A script settings page has no UI element assigned"; + return { + name, description, element.get() + }; + } } - const std::vector& scriptSettingsPages() + size_t scriptSettingsPageCount() { - return allPages; + return allPages.size(); } - void registerSettingsPage(const ScriptSettingsPage& page) + ScriptSettingsPage scriptSettingsPageAt(size_t index) { - allPages.push_back(page); + return parse(allPages[index]); + } + + void registerSettingsPage(const sol::table& options) + { + allPages.push_back(options); } void clearSettings() @@ -29,6 +47,10 @@ namespace LuaUi void attachToWidget(size_t index, MyGUI::Widget* widget) { if (index < allPages.size()) - allPages[index].mElement->attachToWidget(widget); + { + ScriptSettingsPage page = parse(allPages[index]); + if (page.mElement) + page.mElement->attachToWidget(widget); + } } } diff --git a/components/lua_ui/scriptsettings.hpp b/components/lua_ui/scriptsettings.hpp index 28525bb1da..3b51aff901 100644 --- a/components/lua_ui/scriptsettings.hpp +++ b/components/lua_ui/scriptsettings.hpp @@ -16,8 +16,9 @@ namespace LuaUi std::string mDescription; Element* mElement; // TODO: figure out if this can lead to use after free }; - const std::vector& scriptSettingsPages(); - void registerSettingsPage(const ScriptSettingsPage& page); + size_t scriptSettingsPageCount(); + ScriptSettingsPage scriptSettingsPageAt(size_t index); + void registerSettingsPage(const sol::table& options); void clearSettings(); void attachToWidget(size_t index, MyGUI::Widget* widget = nullptr); }