diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index f0868666c84..d8fdd9f6f3d 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -2430,6 +2430,7 @@ public: QList m_ownedItems; // Owned only. bool m_autoApply = true; QStringList m_settingsGroup; + std::function m_layouter; }; } // Internal @@ -2483,6 +2484,16 @@ AspectContainer::const_iterator AspectContainer::end() const return d->m_items.cend(); } +void AspectContainer::setLayouter(const std::function &layouter) +{ + d->m_layouter = layouter; +} + +std::function AspectContainer::layouter() const +{ + return d->m_layouter; +} + const QList &AspectContainer::aspects() const { return d->m_items; diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index 22dcc9bb0df..3c69306214d 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -710,6 +710,9 @@ public: const_iterator begin() const; const_iterator end() const; + void setLayouter(const std::function &layouter); + std::function layouter() const; + signals: void applied(); void changed(); diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp index 4def6095a11..1e03ef2a582 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp +++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp @@ -136,6 +136,13 @@ QWidget *IOptionsPage::widget() if (!m_widget) { if (m_widgetCreator) { m_widget = m_widgetCreator(); + } else if (m_settings) { + m_widget = new IOptionsPageWidget; + if (auto layouter = m_settings->layouter()) { + layouter().attachTo(m_widget); + } else { + QTC_CHECK(false); + } } else { QTC_CHECK(false); } @@ -199,15 +206,6 @@ void IOptionsPage::setSettings(AspectContainer *settings) m_settings = settings; } -void IOptionsPage::setLayouter(const std::function &layouter) -{ - m_widgetCreator = [layouter] { - auto widget = new IOptionsPageWidget; - layouter().attachTo(widget); - return widget; - }; -} - /*! \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 4007a3219ef..c25ed35becc 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.h +++ b/src/plugins/coreplugin/dialogs/ioptionspage.h @@ -74,7 +74,6 @@ protected: void setCategoryIcon(const Utils::Icon &categoryIcon) { m_categoryIcon = categoryIcon; } void setCategoryIconPath(const Utils::FilePath &categoryIconPath); void setSettings(Utils::AspectContainer *settings); - void setLayouter(const std::function &layouter); // Used in FontSettingsPage. FIXME? QPointer m_widget; // Used in conjunction with m_widgetCreator diff --git a/src/plugins/perforce/perforcesettings.cpp b/src/plugins/perforce/perforcesettings.cpp index 47ef5a03b35..6dff959d5f6 100644 --- a/src/plugins/perforce/perforcesettings.cpp +++ b/src/plugins/perforce/perforcesettings.cpp @@ -77,6 +77,70 @@ PerforceSettings::PerforceSettings() autoOpen.setSettingsKey("PromptToOpen"); autoOpen.setDefaultValue(true); autoOpen.setLabelText(Tr::tr("Automatically open files when editing")); + + setLayouter([this] { + using namespace Layouting; + + auto errorLabel = new InfoLabel({}, InfoLabel::None); + errorLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + errorLabel->setFilled(true); + auto testButton = new QPushButton(Tr::tr("Test")); + QObject::connect(testButton, &QPushButton::clicked, errorLabel, + [this, errorLabel, testButton] { + testButton->setEnabled(false); + auto checker = new PerforceChecker(errorLabel); + checker->setUseOverideCursor(true); + QObject::connect(checker, &PerforceChecker::failed, errorLabel, + [errorLabel, testButton, checker](const QString &t) { + errorLabel->setType(InfoLabel::Error); + errorLabel->setText(t); + testButton->setEnabled(true); + checker->deleteLater(); + }); + QObject::connect(checker, &PerforceChecker::succeeded, errorLabel, + [errorLabel, testButton, checker](const FilePath &repo) { + errorLabel->setType(InfoLabel::Ok); + errorLabel->setText(Tr::tr("Test succeeded (%1).") + .arg(repo.toUserOutput())); + testButton->setEnabled(true); + checker->deleteLater(); + }); + + errorLabel->setType(InfoLabel::Information); + errorLabel->setText(Tr::tr("Testing...")); + + const FilePath p4Bin = FilePath::fromUserInput( + p4BinaryPath.volatileValue().toString()); + checker->start(p4Bin, {}, commonP4Arguments_volatile(), 10000); + }); + + Group config { + title(Tr::tr("Configuration")), + Row { p4BinaryPath } + }; + + Group environment { + title(Tr::tr("Environment Variables")), + customEnv.groupChecker(), + Row { p4Port, p4Client, p4User } + }; + + Group misc { + title(Tr::tr("Miscellaneous")), + Column { + Row { logCount, timeOutS, st }, + autoOpen + } + }; + + return Column { + config, + environment, + misc, + Row { errorLabel, st, testButton }, + st + }; + }); } // --------------------PerforceSettings @@ -216,70 +280,6 @@ PerforceSettingsPage::PerforceSettingsPage(PerforceSettings *settings) setCategory(VcsBase::Constants::VCS_SETTINGS_CATEGORY); setSettings(settings); - setLayouter([settings] { - PerforceSettings &s = *settings; - using namespace Layouting; - - auto errorLabel = new InfoLabel({}, InfoLabel::None); - errorLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - errorLabel->setFilled(true); - auto testButton = new QPushButton(Tr::tr("Test")); - QObject::connect(testButton, &QPushButton::clicked, errorLabel, - [settings, errorLabel, testButton] { - testButton->setEnabled(false); - auto checker = new PerforceChecker(errorLabel); - checker->setUseOverideCursor(true); - QObject::connect(checker, &PerforceChecker::failed, errorLabel, - [errorLabel, testButton, checker](const QString &t) { - errorLabel->setType(InfoLabel::Error); - errorLabel->setText(t); - testButton->setEnabled(true); - checker->deleteLater(); - }); - QObject::connect(checker, &PerforceChecker::succeeded, errorLabel, - [errorLabel, testButton, checker](const FilePath &repo) { - errorLabel->setType(InfoLabel::Ok); - errorLabel->setText(Tr::tr("Test succeeded (%1).") - .arg(repo.toUserOutput())); - testButton->setEnabled(true); - checker->deleteLater(); - }); - - errorLabel->setType(InfoLabel::Information); - errorLabel->setText(Tr::tr("Testing...")); - - const FilePath p4Bin = FilePath::fromUserInput( - settings->p4BinaryPath.volatileValue().toString()); - checker->start(p4Bin, {}, settings->commonP4Arguments_volatile(), 10000); - }); - - Group config { - title(Tr::tr("Configuration")), - Row { s.p4BinaryPath } - }; - - Group environment { - title(Tr::tr("Environment Variables")), - s.customEnv.groupChecker(), - Row { s.p4Port, s.p4Client, s.p4User } - }; - - Group misc { - title(Tr::tr("Miscellaneous")), - Column { - Row { s.logCount, s.timeOutS, st }, - s.autoOpen - } - }; - - return Column { - config, - environment, - misc, - Row { errorLabel, st, testButton }, - st - }; - }); } } // Perforce::Internal