From c4294bea230180fa0ef204e669a9ce7bda68ed14 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 6 Jul 2023 09:18:25 +0200 Subject: [PATCH] Core: Add the IOptionsPage::setSettingsProvider This allows creating the options page without having the settings object already present, potentially delaying its creation until its first truly necessary use. Task-number: QTCREATORBUG-29167 Change-Id: I004fb19f0ea2b7e500747b3905283d74f749cd78 Reviewed-by: Marcus Tillmanns --- .../coreplugin/dialogs/ioptionspage.cpp | 39 ++++++++++++------- src/plugins/coreplugin/dialogs/ioptionspage.h | 5 ++- 2 files changed, 29 insertions(+), 15 deletions(-) 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; }; /*