1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-21 23:09:42 +00:00

Allow changing script settings pages after registering them

This commit is contained in:
uramer 2022-01-29 18:33:14 +01:00
parent 5f7ab49880
commit 1455aa3e02
4 changed files with 36 additions and 23 deletions

View file

@ -744,16 +744,15 @@ namespace MWGui
auto flags = std::regex_constants::icase; auto flags = std::regex_constants::icase;
std::regex filterRegex(filter, flags); std::regex filterRegex(filter, flags);
auto scriptSettings = LuaUi::scriptSettingsPages(); for (size_t i = 0; i < LuaUi::scriptSettingsPageCount(); ++i)
for (size_t i = 0; i < scriptSettings.size(); ++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)) if (std::regex_match(page.mName, filterRegex) || std::regex_match(page.mDescription, filterRegex))
mScriptList->addItem(page.mName, i); mScriptList->addItem(page.mName, i);
} }
// Hide script settings tab when the game world isn't loaded and scripts couldn't add their settings // 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); mScriptDisabled->setVisible(disabled);
mScriptFilter->setVisible(!disabled); mScriptFilter->setVisible(!disabled);
mScriptList->setVisible(!disabled); mScriptList->setVisible(!disabled);
@ -793,7 +792,7 @@ namespace MWGui
return; return;
} }
size_t page = *mScriptList->getItemDataAt<size_t>(index); size_t page = *mScriptList->getItemDataAt<size_t>(index);
mScriptDescription->setCaption(LuaUi::scriptSettingsPages()[page].mDescription); mScriptDescription->setCaption(LuaUi::scriptSettingsPageAt(page).mDescription);
mScriptDescription->setVisible(true); mScriptDescription->setVisible(true);
mScriptView->setVisible(false); mScriptView->setVisible(false);
} }

View file

@ -241,16 +241,7 @@ namespace MWLua
api["registerSettingsPage"] = [](sol::table options) api["registerSettingsPage"] = [](sol::table options)
{ {
LuaUi::ScriptSettingsPage page; LuaUi::registerSettingsPage(options);
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<std::shared_ptr<LuaUi::Element>>("element", nullptr);
if (!element)
throw std::logic_error("No UI element provided for the settings page");
page.mElement = element.get();
LuaUi::registerSettingsPage(page);
}; };
return LuaUtil::makeReadOnly(api); return LuaUtil::makeReadOnly(api);

View file

@ -8,17 +8,35 @@ namespace LuaUi
{ {
namespace namespace
{ {
std::vector<ScriptSettingsPage> allPages; std::vector<sol::table> 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<std::shared_ptr<LuaUi::Element>>("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<ScriptSettingsPage>& 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() void clearSettings()
@ -29,6 +47,10 @@ namespace LuaUi
void attachToWidget(size_t index, MyGUI::Widget* widget) void attachToWidget(size_t index, MyGUI::Widget* widget)
{ {
if (index < allPages.size()) if (index < allPages.size())
allPages[index].mElement->attachToWidget(widget); {
ScriptSettingsPage page = parse(allPages[index]);
if (page.mElement)
page.mElement->attachToWidget(widget);
}
} }
} }

View file

@ -16,8 +16,9 @@ namespace LuaUi
std::string mDescription; std::string mDescription;
Element* mElement; // TODO: figure out if this can lead to use after free Element* mElement; // TODO: figure out if this can lead to use after free
}; };
const std::vector<ScriptSettingsPage>& scriptSettingsPages(); size_t scriptSettingsPageCount();
void registerSettingsPage(const ScriptSettingsPage& page); ScriptSettingsPage scriptSettingsPageAt(size_t index);
void registerSettingsPage(const sol::table& options);
void clearSettings(); void clearSettings();
void attachToWidget(size_t index, MyGUI::Widget* widget = nullptr); void attachToWidget(size_t index, MyGUI::Widget* widget = nullptr);
} }