diff options
author | hjk <hjk@qt.io> | 2019-06-13 18:25:17 +0200 |
---|---|---|
committer | hjk <hjk@qt.io> | 2019-06-14 13:34:38 +0000 |
commit | 67b33a06628ef4df68c402fc1b2907a556a8d44c (patch) | |
tree | ca767cf772310932f23e853188155272d103cb03 | |
parent | 77e8e1707c7223fc4905058f531e83e6788ad845 (diff) |
ProjectExplorer: Introduce a new BaseSelectionAspect
To handle an (exclusive) choice within a set of possible options,
visualized by a set of QRadioButtons.
Use in QdbMakeDefaultAppStep.
Change-Id: Icc62a45e8c5986cd9400f90449f92154ed854a22
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | src/plugins/boot2qt/qdbmakedefaultappstep.cpp | 86 | ||||
-rw-r--r-- | src/plugins/boot2qt/qdbmakedefaultappstep.h | 11 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectconfigurationaspects.cpp | 82 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectconfigurationaspects.h | 26 |
4 files changed, 119 insertions, 86 deletions
diff --git a/src/plugins/boot2qt/qdbmakedefaultappstep.cpp b/src/plugins/boot2qt/qdbmakedefaultappstep.cpp index 8ff39732ff..5ddb9fa6c7 100644 --- a/src/plugins/boot2qt/qdbmakedefaultappstep.cpp +++ b/src/plugins/boot2qt/qdbmakedefaultappstep.cpp @@ -27,56 +27,27 @@ #include "qdbmakedefaultappservice.h" -#include <QRadioButton> -#include <QVBoxLayout> +#include <projectexplorer/runconfigurationaspects.h> + +using namespace ProjectExplorer; namespace Qdb { namespace Internal { -class QdbConfigWidget : public ProjectExplorer::BuildStepConfigWidget -{ -public: - QdbConfigWidget(QdbMakeDefaultAppStep *step) - : BuildStepConfigWidget(step) - { - QVBoxLayout * const mainLayout = new QVBoxLayout(this); - mainLayout->setMargin(0); - - m_makeDefaultBtn.setText( - QdbMakeDefaultAppStep::tr("Set this application to start by default")); - m_resetDefaultBtn.setText( - QdbMakeDefaultAppStep::tr("Reset default application")); - - if (step->makeDefault()) - m_makeDefaultBtn.setChecked(true); - else - m_resetDefaultBtn.setChecked(true); - - mainLayout->addWidget(&m_makeDefaultBtn); - mainLayout->addWidget(&m_resetDefaultBtn); - - connect(&m_makeDefaultBtn, &QRadioButton::clicked, this, [step] { - step->setMakeDefault(true); - }); - connect(&m_resetDefaultBtn, &QRadioButton::clicked, this, [step] { - step->setMakeDefault(false); - }); - } - -private: - QRadioButton m_makeDefaultBtn; - QRadioButton m_resetDefaultBtn; -}; - -QdbMakeDefaultAppStep::QdbMakeDefaultAppStep(ProjectExplorer::BuildStepList *bsl) +QdbMakeDefaultAppStep::QdbMakeDefaultAppStep(BuildStepList *bsl) : AbstractRemoteLinuxDeployStep(bsl, stepId()) { setDefaultDisplayName(stepDisplayName()); auto service = createDeployService<QdbMakeDefaultAppService>(); - setInternalInitializer([this, service] { - service->setMakeDefault(m_makeDefault); + auto selection = addAspect<BaseSelectionAspect>(); + selection->setSettingsKey("QdbMakeDefaultDeployStep.MakeDefault"); + selection->addOption(tr("Set this application to start by default")); + selection->addOption(tr("Reset default application")); + + setInternalInitializer([service, selection] { + service->setMakeDefault(selection->value() == 0); return service->isDeploymentPossible(); }); } @@ -86,45 +57,10 @@ Core::Id QdbMakeDefaultAppStep::stepId() return "Qdb.MakeDefaultAppStep"; } -ProjectExplorer::BuildStepConfigWidget *QdbMakeDefaultAppStep::createConfigWidget() -{ - return new QdbConfigWidget(this); -} - QString QdbMakeDefaultAppStep::stepDisplayName() { return QStringLiteral("Change default application"); } -void QdbMakeDefaultAppStep::setMakeDefault(bool makeDefault) -{ - m_makeDefault = makeDefault; -} - -bool QdbMakeDefaultAppStep::makeDefault() const -{ - return m_makeDefault; -} - -static QString makeDefaultKey() -{ - return QLatin1String("QdbMakeDefaultDeployStep.MakeDefault"); -} - -bool QdbMakeDefaultAppStep::fromMap(const QVariantMap &map) -{ - if (!AbstractRemoteLinuxDeployStep::fromMap(map)) - return false; - m_makeDefault = map.value(makeDefaultKey()).toBool(); - return true; -} - -QVariantMap QdbMakeDefaultAppStep::toMap() const -{ - QVariantMap map = AbstractRemoteLinuxDeployStep::toMap(); - map.insert(makeDefaultKey(), m_makeDefault); - return map; -} - } // namespace Internal } // namespace Qdb diff --git a/src/plugins/boot2qt/qdbmakedefaultappstep.h b/src/plugins/boot2qt/qdbmakedefaultappstep.h index e5f2be8389..ffaf0dcab6 100644 --- a/src/plugins/boot2qt/qdbmakedefaultappstep.h +++ b/src/plugins/boot2qt/qdbmakedefaultappstep.h @@ -39,17 +39,6 @@ public: static Core::Id stepId(); static QString stepDisplayName(); - - void setMakeDefault(bool makeDefault); - bool makeDefault() const; - -protected: - ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; - bool fromMap(const QVariantMap &map) override; - QVariantMap toMap() const override; - -private: - bool m_makeDefault = false; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.cpp b/src/plugins/projectexplorer/projectconfigurationaspects.cpp index d9ad7c4334..d1e5a032cb 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/projectconfigurationaspects.cpp @@ -44,6 +44,8 @@ #include <QSpinBox> #include <QToolButton> #include <QTextEdit> +#include <QRadioButton> +#include <QButtonGroup> using namespace Utils; @@ -60,6 +62,17 @@ public: QPointer<QCheckBox> m_checkBox; // Owned by configuration widget }; +class BaseSelectionAspectPrivate +{ +public: + int m_value = 0; + int m_defaultValue = 0; + struct Option { QString displayName; QString tooltip; }; + QVector<Option> m_options; + QList<QPointer<QRadioButton>> m_buttons; // Owned by configuration widget + QPointer<QButtonGroup> m_buttonGroup; +}; + class BaseStringAspectPrivate { public: @@ -397,6 +410,75 @@ void BaseBoolAspect::setToolTip(const QString &tooltip) } /*! + \class ProjectExplorer::BaseSelectionAspect +*/ + +BaseSelectionAspect::BaseSelectionAspect() + : d(new Internal::BaseSelectionAspectPrivate) +{} + +BaseSelectionAspect::~BaseSelectionAspect() = default; + +void BaseSelectionAspect::addToConfigurationLayout(QFormLayout *layout) +{ + QTC_CHECK(d->m_buttonGroup == nullptr); + d->m_buttonGroup = new QButtonGroup; + d->m_buttonGroup->setExclusive(true); + + QTC_ASSERT(d->m_buttons.isEmpty(), d->m_buttons.clear()); + for (int i = 0, n = d->m_options.size(); i < n; ++i) { + const Internal::BaseSelectionAspectPrivate::Option &option = d->m_options.at(i); + auto button = new QRadioButton(option.displayName, layout->parentWidget()); + button->setChecked(i == d->m_value); + button->setToolTip(option.tooltip); + layout->addRow(QString(), button); + d->m_buttons.append(button); + d->m_buttonGroup->addButton(button); + connect(button, &QAbstractButton::clicked, this, [this, i] { + d->m_value = i; + emit changed(); + }); + } +} + +void BaseSelectionAspect::fromMap(const QVariantMap &map) +{ + d->m_value = map.value(settingsKey(), d->m_defaultValue).toInt(); +} + +void BaseSelectionAspect::toMap(QVariantMap &data) const +{ + data.insert(settingsKey(), d->m_value); +} + +int BaseSelectionAspect::defaultValue() const +{ + return d->m_defaultValue; +} + +void BaseSelectionAspect::setDefaultValue(int defaultValue) +{ + d->m_defaultValue = defaultValue; +} + +int BaseSelectionAspect::value() const +{ + return d->m_value; +} + +void BaseSelectionAspect::setValue(int value) +{ + d->m_value = value; + if (d->m_buttonGroup && 0 <= value && value < d->m_buttons.size()) + d->m_buttons.at(value)->setChecked(true); +} + +void BaseSelectionAspect::addOption(const QString &displayName, const QString &toolTip) +{ + d->m_options.append({displayName, toolTip}); +} + +/*! \class ProjectExplorer::BaseIntegerAspect */ diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.h b/src/plugins/projectexplorer/projectconfigurationaspects.h index 250482b44e..3bdf1986be 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.h +++ b/src/plugins/projectexplorer/projectconfigurationaspects.h @@ -39,6 +39,7 @@ namespace Internal { class BaseBoolAspectPrivate; class BaseStringAspectPrivate; class BaseIntegerAspectPrivate; +class BaseSelectionAspectPrivate; } // Internal class PROJECTEXPLORER_EXPORT BaseBoolAspect : public ProjectConfigurationAspect @@ -67,6 +68,31 @@ private: std::unique_ptr<Internal::BaseBoolAspectPrivate> d; }; +class PROJECTEXPLORER_EXPORT BaseSelectionAspect : public ProjectConfigurationAspect +{ + Q_OBJECT + +public: + BaseSelectionAspect(); + ~BaseSelectionAspect() override; + + void addToConfigurationLayout(QFormLayout *layout) override; + + int value() const; + void setValue(int val); + + int defaultValue() const; + void setDefaultValue(int defaultValue); + + void addOption(const QString &displayName, const QString &toolTip = {}); + + void fromMap(const QVariantMap &map) override; + void toMap(QVariantMap &map) const override; + +private: + std::unique_ptr<Internal::BaseSelectionAspectPrivate> d; +}; + class PROJECTEXPLORER_EXPORT BaseStringAspect : public ProjectConfigurationAspect { Q_OBJECT |