diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp index 9715c1c89f5..8cbbd7eac42 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp +++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp @@ -134,9 +134,10 @@ QWidget *IOptionsPage::widget() if (!m_widget) { if (m_widgetCreator) { m_widget = m_widgetCreator(); - } else if (m_settings) { + } else if (m_settingsProvider) { m_widget = new IOptionsPageWidget; - if (auto layouter = m_settings->layouter()) { + AspectContainer *container = m_settingsProvider(); + if (auto layouter = container->layouter()) { layouter().attachTo(m_widget); } else { QTC_CHECK(false); @@ -162,10 +163,11 @@ void IOptionsPage::apply() if (auto widget = qobject_cast(m_widget)) widget->apply(); - if (m_settings) { - if (m_settings->isDirty()) { - m_settings->apply(); - m_settings->writeSettings(ICore::settings()); + if (m_settingsProvider) { + AspectContainer *container = m_settingsProvider(); + if (container->isDirty()) { + container->apply(); + container->writeSettings(ICore::settings()); } } } @@ -184,8 +186,10 @@ void IOptionsPage::finish() if (auto widget = qobject_cast(m_widget)) widget->finish(); - if (m_settings) - m_settings->finish(); + if (m_settingsProvider) { + AspectContainer *container = m_settingsProvider(); + container->finish(); + } delete m_widget; } @@ -201,7 +205,12 @@ void IOptionsPage::setCategoryIconPath(const FilePath &categoryIconPath) void IOptionsPage::setSettings(AspectContainer *settings) { - m_settings = settings; + m_settingsProvider = [settings] { return settings; }; +} + +void IOptionsPage::setSettingsProvider(const std::function &provider) +{ + m_settingsProvider = provider; } /*! @@ -234,7 +243,11 @@ void IOptionsPage::setSettings(AspectContainer *settings) Sets \a categoryIcon as the category icon of the options page. */ -static QList g_optionsPages; +static QList &optionsPages() +{ + static QList thePages; + return thePages; +} /*! Constructs an options page and registers it @@ -243,7 +256,7 @@ static QList g_optionsPages; IOptionsPage::IOptionsPage(bool registerGlobally) { if (registerGlobally) - g_optionsPages.append(this); + optionsPages().append(this); } /*! @@ -251,7 +264,7 @@ IOptionsPage::IOptionsPage(bool registerGlobally) */ IOptionsPage::~IOptionsPage() { - g_optionsPages.removeOne(this); + optionsPages().removeOne(this); } /*! @@ -259,7 +272,7 @@ IOptionsPage::~IOptionsPage() */ const QList IOptionsPage::allOptionsPages() { - return g_optionsPages; + return optionsPages(); } /*! diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.h b/src/plugins/coreplugin/dialogs/ioptionspage.h index 98275e76268..2c46fea9fdf 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.h +++ b/src/plugins/coreplugin/dialogs/ioptionspage.h @@ -74,7 +74,8 @@ protected: void setDisplayCategory(const QString &displayCategory) { m_displayCategory = displayCategory; } void setCategoryIcon(const Utils::Icon &categoryIcon) { m_categoryIcon = categoryIcon; } void setCategoryIconPath(const Utils::FilePath &categoryIconPath); - void setSettings(Utils::AspectContainer *settings); + void setSettings(Utils::AspectContainer *settings); // FIXME: Remove. + void setSettingsProvider(const std::function &provider); // Used in FontSettingsPage. FIXME? QPointer m_widget; // Used in conjunction with m_widgetCreator @@ -90,7 +91,7 @@ private: mutable bool m_keywordsInitialized = false; mutable QStringList m_keywords; - Utils::AspectContainer *m_settings = nullptr; + std::function m_settingsProvider; }; /*