diff --git a/src/plugins/winrt/winrtpackagedeploymentstep.cpp b/src/plugins/winrt/winrtpackagedeploymentstep.cpp index 9f7047bd70f..61cb14ff0a8 100644 --- a/src/plugins/winrt/winrtpackagedeploymentstep.cpp +++ b/src/plugins/winrt/winrtpackagedeploymentstep.cpp @@ -41,7 +41,9 @@ #include #include +#include +#include #include #include #include @@ -52,16 +54,92 @@ using namespace Utils; namespace WinRt { namespace Internal { +const char ARGUMENTS_KEY[] = "WinRt.BuildStep.Deploy.Arguments"; +const char DEFAULTARGUMENTS_KEY[] = "WinRt.BuildStep.Deploy.DefaultArguments"; + +WinRtArgumentsAspect::WinRtArgumentsAspect() = default; + +WinRtArgumentsAspect::~WinRtArgumentsAspect() = default; + +void WinRtArgumentsAspect::addToLayout(ProjectExplorer::LayoutBuilder &builder) +{ + QTC_CHECK(!m_lineEdit); + auto label = new QLabel(tr("Arguments:")); + label->setTextInteractionFlags(Qt::TextSelectableByMouse); + builder.addItem(label); + + auto *layout = new QHBoxLayout(); + m_lineEdit = new Utils::FancyLineEdit(); + if (!m_value.isEmpty()) + m_lineEdit->setText(m_value); + else if (!m_defaultValue.isEmpty()) + m_lineEdit->setText(m_defaultValue); + connect(m_lineEdit, &Utils::FancyLineEdit::textEdited, + this, &WinRtArgumentsAspect::setValue); + layout->addWidget(m_lineEdit); + + auto restoreDefaultButton = new QToolButton(); + restoreDefaultButton->setText(tr("Restore Default Arguments")); + connect(restoreDefaultButton, &QToolButton::clicked, + this, &WinRtArgumentsAspect::restoreDefaultValue); + layout->addWidget(restoreDefaultButton); + builder.addItem(layout); +} + +void WinRtArgumentsAspect::fromMap(const QVariantMap &map) +{ + m_defaultValue = map.value(DEFAULTARGUMENTS_KEY).toString(); + m_value = map.value(ARGUMENTS_KEY).toString(); +} + +void WinRtArgumentsAspect::toMap(QVariantMap &map) const +{ + map.insert(DEFAULTARGUMENTS_KEY, m_defaultValue); + map.insert(ARGUMENTS_KEY, m_value); +} + +void WinRtArgumentsAspect::setValue(const QString &value) +{ + if (value == m_value) + return; + + m_value = value; + if (m_lineEdit) + m_lineEdit->setText(value); + emit changed(); +} + +QString WinRtArgumentsAspect::value() const +{ + return m_value; +} + +void WinRtArgumentsAspect::setDefaultValue(const QString &value) +{ + m_defaultValue = value; +} + +QString WinRtArgumentsAspect::defaultValue() const +{ + return m_defaultValue; +} + +void WinRtArgumentsAspect::restoreDefaultValue() +{ + if (m_defaultValue == m_value) + return; + + setValue(m_defaultValue); +} + WinRtPackageDeploymentStep::WinRtPackageDeploymentStep(BuildStepList *bsl, Core::Id id) : AbstractProcessStep(bsl, id) { setDisplayName(tr("Run windeployqt")); - m_argsAspect = addAspect(); - m_argsAspect->setDisplayStyle(BaseStringAspect::LineEditDisplay); - m_argsAspect->setSettingsKey("WinRt.BuildStep.Deploy.Arguments"); + m_argsAspect = addAspect(); + m_argsAspect->setDefaultValue(defaultWinDeployQtArguments()); m_argsAspect->setValue(defaultWinDeployQtArguments()); - m_argsAspect->setLabelText(tr("Arguments:")); } bool WinRtPackageDeploymentStep::init() @@ -221,23 +299,6 @@ void WinRtPackageDeploymentStep::stdOutput(const QString &line) AbstractProcessStep::stdOutput(line); } -BuildStepConfigWidget *WinRtPackageDeploymentStep::createConfigWidget() -{ - auto widget = AbstractProcessStep::createConfigWidget(); - - auto restoreDefaultButton = new QToolButton(widget); - restoreDefaultButton->setText(tr("Restore Default Arguments")); - connect(restoreDefaultButton, &QToolButton::clicked, this, [this] { - m_argsAspect->setValue(defaultWinDeployQtArguments()); - }); - - // Smuggle in the extra button. We know that there's exactly one aspect. - QTC_ASSERT(widget->layout()->count() == 2, return widget); - widget->layout()->itemAt(1)->layout()->addWidget(restoreDefaultButton); - - return widget; -} - QString WinRtPackageDeploymentStep::defaultWinDeployQtArguments() const { QString args; diff --git a/src/plugins/winrt/winrtpackagedeploymentstep.h b/src/plugins/winrt/winrtpackagedeploymentstep.h index fd39ce7ca1f..2b1329db798 100644 --- a/src/plugins/winrt/winrtpackagedeploymentstep.h +++ b/src/plugins/winrt/winrtpackagedeploymentstep.h @@ -31,6 +31,33 @@ namespace WinRt { namespace Internal { +class WinRtArgumentsAspect : public ProjectExplorer::ProjectConfigurationAspect +{ + Q_OBJECT + +public: + WinRtArgumentsAspect(); + ~WinRtArgumentsAspect() override; + + void addToLayout(ProjectExplorer::LayoutBuilder &builder) override; + + void fromMap(const QVariantMap &map) override; + void toMap(QVariantMap &map) const override; + + void setValue(const QString &value); + QString value() const; + + void setDefaultValue(const QString &value); + QString defaultValue() const; + + void restoreDefaultValue(); + +private: + Utils::FancyLineEdit *m_lineEdit = nullptr; + QString m_value; + QString m_defaultValue; +}; + class WinRtPackageDeploymentStep : public ProjectExplorer::AbstractProcessStep { Q_OBJECT @@ -48,11 +75,10 @@ private: void doRun() override; bool processSucceeded(int exitCode, QProcess::ExitStatus status) override; void stdOutput(const QString &line) override; - ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; bool parseIconsAndExecutableFromManifest(QString manifestFileName, QStringList *items, QString *executable); - ProjectExplorer::BaseStringAspect *m_argsAspect = nullptr; + WinRtArgumentsAspect *m_argsAspect = nullptr; QString m_targetFilePath; QString m_targetDirPath; QString m_executablePathInManifest;