diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp index a3a0f7eb385..82f1250f861 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp +++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp @@ -28,6 +28,9 @@ #include "ioptionspage.h" +#include + +#include #include #include @@ -121,9 +124,16 @@ void Core::IOptionsPage::setWidgetCreator(const WidgetCreator &widgetCreator) QWidget *Core::IOptionsPage::widget() { - QTC_ASSERT(m_widgetCreator, return nullptr); - if (!m_widget) - m_widget = m_widgetCreator(); + if (!m_widget) { + if (m_widgetCreator) { + m_widget = m_widgetCreator(); + } else if (m_layouter) { + m_widget = new QWidget; + m_layouter(m_widget); + } else { + QTC_CHECK(false); + } + } return m_widget; } @@ -138,9 +148,14 @@ QWidget *Core::IOptionsPage::widget() void Core::IOptionsPage::apply() { - QTC_ASSERT(m_widgetCreator, return); - if (m_widget) - m_widget->apply(); + if (auto widget = qobject_cast(m_widget)) { + widget->apply(); + } else if (m_settings) { + if (m_settings->isDirty()) { + m_settings->apply(); + m_settings->writeSettings(Core::ICore::settings()); + } + } } /*! @@ -154,11 +169,12 @@ void Core::IOptionsPage::apply() void Core::IOptionsPage::finish() { - QTC_ASSERT(m_widgetCreator, return); - if (m_widget) { - m_widget->finish(); - delete m_widget; - } + if (auto widget = qobject_cast(m_widget)) + widget->finish(); + else if (m_settings) + m_settings->finish(); + + delete m_widget; } /*! @@ -170,6 +186,16 @@ void Core::IOptionsPage::setCategoryIconPath(const QString &categoryIconPath) m_categoryIcon = Icon({{categoryIconPath, Theme::PanelTextColorDark}}, Icon::Tint); } +void Core::IOptionsPage::setSettings(AspectContainer *settings) +{ + m_settings = settings; +} + +void Core::IOptionsPage::setLayouter(const std::function &layouter) +{ + m_layouter = layouter; +} + /*! \fn void Core::IOptionsPage::setId(Utils::Id id) diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.h b/src/plugins/coreplugin/dialogs/ioptionspage.h index 36ee209b38d..abc0bf93503 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.h +++ b/src/plugins/coreplugin/dialogs/ioptionspage.h @@ -37,10 +37,13 @@ #include +namespace Utils { class AspectContainer; }; + namespace Core { class CORE_EXPORT IOptionsPageWidget : public QWidget { + Q_OBJECT public: virtual void apply() = 0; virtual void finish() {} @@ -77,6 +80,8 @@ protected: void setDisplayCategory(const QString &displayCategory) { m_displayCategory = displayCategory; } void setCategoryIcon(const Utils::Icon &categoryIcon) { m_categoryIcon = categoryIcon; } void setCategoryIconPath(const QString &categoryIconPath); + void setSettings(Utils::AspectContainer *settings); + void setLayouter(const std::function &layouter); Utils::Id m_id; Utils::Id m_category; @@ -84,10 +89,13 @@ protected: QString m_displayCategory; Utils::Icon m_categoryIcon; WidgetCreator m_widgetCreator; - QPointer m_widget; // Used in conjunction with m_widgetCreator + QPointer m_widget; // Used in conjunction with m_widgetCreator mutable bool m_keywordsInitialized = false; mutable QStringList m_keywords; + + Utils::AspectContainer *m_settings = nullptr; + std::function m_layouter; }; /*