ProjectExplorer: Add BuildStep::createConfigWidget default implementation

This starts the same process as done for run configuration widgets:
Add an aspect based default implementation and base build step data
handling on aspects.

As first example use the RemoteLinux::GenericDirectUploadStep

Change-Id: Ia2d1fcd393e667094b7852371b893d8356c3eace
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
hjk
2018-09-14 12:41:47 +02:00
parent 83a8b8bf8f
commit 760723f763
3 changed files with 61 additions and 105 deletions

View File

@@ -35,6 +35,8 @@
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
#include <QFormLayout>
/*!
\class ProjectExplorer::BuildStep
@@ -125,6 +127,40 @@ BuildStep::BuildStep(BuildStepList *bsl, Core::Id id) :
expander->registerSubProvider([this] { return projectConfiguration()->macroExpander(); });
}
class ConfigWidget : public BuildStepConfigWidget
{
public:
ConfigWidget(BuildStep *step) : m_step(step)
{
connect(m_step, &ProjectConfiguration::displayNameChanged,
this, &BuildStepConfigWidget::updateSummary);
}
QString summaryText() const override { return QLatin1String("<b>") + displayName() + QLatin1String("</b>"); }
QString displayName() const override { return m_step->displayName(); }
bool showWidget() const override { return true; }
BuildStep *step() const { return m_step; }
private:
BuildStep *m_step;
};
BuildStepConfigWidget *BuildStep::createConfigWidget()
{
auto widget = new ConfigWidget(this);
auto formLayout = new QFormLayout(widget);
formLayout->setMargin(0);
formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
for (ProjectConfigurationAspect *aspect : m_aspects) {
if (aspect->isVisible())
aspect->addToConfigurationLayout(formLayout);
}
return widget;
}
bool BuildStep::fromMap(const QVariantMap &map)
{
m_enabled = map.value(buildStepEnabledKey, true).toBool();

View File

@@ -29,65 +29,19 @@
#include <projectexplorer/deploymentdata.h>
#include <projectexplorer/target.h>
#include <QCheckBox>
#include <QVBoxLayout>
#include <projectexplorer/runconfigurationaspects.h>
using namespace ProjectExplorer;
namespace RemoteLinux {
namespace Internal {
namespace {
const char IncrementalKey[] = "RemoteLinux.GenericDirectUploadStep.Incremental";
const char IgnoreMissingFilesKey[] = "RemoteLinux.GenericDirectUploadStep.IgnoreMissingFiles";
class ConfigWidget : public SimpleBuildStepConfigWidget
{
Q_OBJECT
public:
ConfigWidget(GenericDirectUploadStep *step) : SimpleBuildStepConfigWidget(step)
{
m_incrementalCheckBox.setText(tr("Incremental deployment"));
m_ignoreMissingFilesCheckBox.setText(tr("Ignore missing files"));
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->setMargin(0);
mainLayout->addWidget(&m_incrementalCheckBox);
mainLayout->addWidget(&m_ignoreMissingFilesCheckBox);
m_incrementalCheckBox.setChecked(step->incrementalDeployment());
m_ignoreMissingFilesCheckBox.setChecked(step->ignoreMissingFiles());
connect(&m_incrementalCheckBox, &QAbstractButton::toggled,
this, &ConfigWidget::handleIncrementalChanged);
connect(&m_ignoreMissingFilesCheckBox, &QAbstractButton::toggled,
this, &ConfigWidget::handleIgnoreMissingFilesChanged);
}
bool showWidget() const { return true; }
private:
void handleIncrementalChanged(bool incremental) {
GenericDirectUploadStep *step = qobject_cast<GenericDirectUploadStep *>(this->step());
step->setIncrementalDeployment(incremental);
}
void handleIgnoreMissingFilesChanged(bool ignoreMissingFiles) {
GenericDirectUploadStep *step = qobject_cast<GenericDirectUploadStep *>(this->step());
step->setIgnoreMissingFiles(ignoreMissingFiles);
}
QCheckBox m_incrementalCheckBox;
QCheckBox m_ignoreMissingFilesCheckBox;
};
} // anonymous namespace
class GenericDirectUploadStepPrivate
{
public:
GenericDirectUploadStepPrivate() : incremental(true), ignoreMissingFiles(false) {}
GenericDirectUploadService deployService;
bool incremental;
bool ignoreMissingFiles;
BaseBoolAspect *incrementalAspect;
BaseBoolAspect *ignoreMissingFilesAspect;
};
} // namespace Internal
@@ -96,6 +50,19 @@ GenericDirectUploadStep::GenericDirectUploadStep(BuildStepList *bsl)
: AbstractRemoteLinuxDeployStep(bsl, stepId())
{
d = new Internal::GenericDirectUploadStepPrivate;
d->incrementalAspect = addAspect<BaseBoolAspect>();
d->incrementalAspect->setSettingsKey("RemoteLinux.GenericDirectUploadStep.Incremental");
d->incrementalAspect->setLabel(tr("Incremental deployment"));
d->incrementalAspect->setValue(true);
d->incrementalAspect->setDefaultValue(true);
d->ignoreMissingFilesAspect = addAspect<BaseBoolAspect>();
d->ignoreMissingFilesAspect
->setSettingsKey("RemoteLinux.GenericDirectUploadStep.IgnoreMissingFiles");
d->ignoreMissingFilesAspect->setLabel(tr("Ignore missing files"));
d->ignoreMissingFilesAspect->setValue(false);
setDefaultDisplayName(displayName());
}
@@ -104,17 +71,17 @@ GenericDirectUploadStep::~GenericDirectUploadStep()
delete d;
}
BuildStepConfigWidget *GenericDirectUploadStep::createConfigWidget()
{
return new Internal::ConfigWidget(this);
}
bool GenericDirectUploadStep::initInternal(QString *error)
{
deployService()->setDeployableFiles(target()->deploymentData().allFiles());
deployService()->setIncrementalDeployment(incrementalDeployment());
deployService()->setIgnoreMissingFiles(ignoreMissingFiles());
return deployService()->isDeploymentPossible(error);
d->deployService.setDeployableFiles(target()->deploymentData().allFiles());
d->deployService.setIncrementalDeployment(d->incrementalAspect->value());
d->deployService.setIgnoreMissingFiles(d->ignoreMissingFilesAspect->value());
return d->deployService.isDeploymentPossible(error);
}
BuildStepConfigWidget *GenericDirectUploadStep::createConfigWidget()
{
return BuildStep::createConfigWidget();
}
GenericDirectUploadService *GenericDirectUploadStep::deployService() const
@@ -122,43 +89,6 @@ GenericDirectUploadService *GenericDirectUploadStep::deployService() const
return &d->deployService;
}
bool GenericDirectUploadStep::fromMap(const QVariantMap &map)
{
if (!AbstractRemoteLinuxDeployStep::fromMap(map))
return false;
setIncrementalDeployment(map.value(QLatin1String(Internal::IncrementalKey), true).toBool());
setIgnoreMissingFiles(map.value(QLatin1String(Internal::IgnoreMissingFilesKey), false).toBool());
return true;
}
QVariantMap GenericDirectUploadStep::toMap() const
{
QVariantMap map = AbstractRemoteLinuxDeployStep::toMap();
map.insert(QLatin1String(Internal::IncrementalKey), incrementalDeployment());
map.insert(QLatin1String(Internal::IgnoreMissingFilesKey), ignoreMissingFiles());
return map;
}
void GenericDirectUploadStep::setIncrementalDeployment(bool incremental)
{
d->incremental = incremental;
}
bool GenericDirectUploadStep::incrementalDeployment() const
{
return d->incremental;
}
void GenericDirectUploadStep::setIgnoreMissingFiles(bool ignoreMissingFiles)
{
d->ignoreMissingFiles = ignoreMissingFiles;
}
bool GenericDirectUploadStep::ignoreMissingFiles() const
{
return d->ignoreMissingFiles;
}
Core::Id GenericDirectUploadStep::stepId()
{
return "RemoteLinux.DirectUploadStep";
@@ -170,5 +100,3 @@ QString GenericDirectUploadStep::displayName()
}
} //namespace RemoteLinux
#include "genericdirectuploadstep.moc"

View File

@@ -43,19 +43,11 @@ public:
ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override;
bool initInternal(QString *error = nullptr) override;
void setIncrementalDeployment(bool incremental);
bool incrementalDeployment() const;
void setIgnoreMissingFiles(bool ignoreMissingFiles);
bool ignoreMissingFiles() const;
static Core::Id stepId();
static QString displayName();
private:
GenericDirectUploadService *deployService() const override;
bool fromMap(const QVariantMap &map) override;
QVariantMap toMap() const override;
Internal::GenericDirectUploadStepPrivate *d;
};