ProjectExplorer: Aspectify most parts of MakeStep

Change-Id: I24419185f1af937845ffbd0dac6d333894c95e67
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2020-07-20 17:02:30 +02:00
parent 6775eeefc5
commit 42ab5c84b9
2 changed files with 123 additions and 161 deletions

View File

@@ -34,6 +34,7 @@
#include "projectexplorerconstants.h"
#include "target.h"
#include "toolchain.h"
#include "projectconfigurationaspects.h"
#include <coreplugin/variablechooser.h>
#include <utils/environment.h>
@@ -66,6 +67,30 @@ const char MAKEFLAGS[] = "MAKEFLAGS";
namespace ProjectExplorer {
namespace Internal {
class OverrideMakeflagsAspect final : public BaseBoolAspect
{
public:
OverrideMakeflagsAspect()
{
const QString text = tr("Override MAKEFLAGS");
setLabel(text, LabelPlacement::AtCheckBox);
m_nonOverrideWarning = new QLabel;
m_nonOverrideWarning->setToolTip("<html><body><p>" +
tr("<code>MAKEFLAGS</code> specifies parallel jobs. Check \"%1\" to override.")
.arg(text) + "</p></body></html>");
m_nonOverrideWarning->setPixmap(Icons::WARNING.pixmap());
}
void addToLayout(LayoutBuilder &builder) final
{
BaseBoolAspect::addToLayout(builder);
builder.addItem(m_nonOverrideWarning);
}
QLabel *m_nonOverrideWarning;
};
class MakeStepConfigWidget : public BuildStepConfigWidget
{
Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::MakeStep)
@@ -75,24 +100,14 @@ public:
private:
void itemChanged(QListWidgetItem *item);
void makeLineEditTextEdited();
void makeArgumentsLineEditTextEdited();
void updateDetails();
void setUserJobCountVisible(bool visible);
void setUserJobCountEnabled(bool enabled);
MakeStep *m_makeStep;
QLabel *m_makeLabel;
Utils::PathChooser *m_makeLineEdit;
QLabel *m_makeArgumentsLabel;
QLineEdit *m_makeArgumentsLineEdit;
QLabel *m_jobsLabel;
QLabel *m_targetsLabel;
QListWidget *m_targetsList;
QSpinBox *m_userJobCount;
QCheckBox *m_overrideMakeflags;
QLabel *m_nonOverrideWarning;
QCheckBox *m_disableInSubDirsCheckBox;
};
@@ -100,57 +115,22 @@ private:
MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep)
: BuildStepConfigWidget(makeStep), m_makeStep(makeStep)
{
m_makeLabel = new QLabel(tr("Override %1:"), this);
m_makeLineEdit = new PathChooser(this);
m_makeLineEdit->setExpectedKind(PathChooser::ExistingCommand);
m_makeLineEdit->setBaseDirectory(FilePath::fromString(PathChooser::homePath()));
m_makeLineEdit->setHistoryCompleter("PE.MakeCommand.History");
m_makeLineEdit->setPath(m_makeStep->makeCommand().toString());
auto makeArgumentsLabel = new QLabel(tr("Make arguments:"), this);
m_makeArgumentsLineEdit = new QLineEdit(this);
m_makeArgumentsLineEdit->setText(m_makeStep->userArguments());
m_jobsLabel = new QLabel(this);
m_jobsLabel->setText(tr("Parallel jobs:"));
m_targetsLabel = new QLabel(this);
m_targetsLabel->setText(tr("Targets:"));
m_targetsList = new QListWidget(this);
m_userJobCount = new QSpinBox(this);
m_userJobCount->setMinimum(1);
m_userJobCount->setMaximum(999);
m_overrideMakeflags = new QCheckBox(tr("Override MAKEFLAGS"), this);
m_nonOverrideWarning = new QLabel(this);
m_nonOverrideWarning->setToolTip("<html><body><p>" +
tr("<code>MAKEFLAGS</code> specifies parallel jobs. Check \"%1\" to override.")
.arg(m_overrideMakeflags->text()) + "</p></body></html>");
m_nonOverrideWarning->setPixmap(Icons::WARNING.pixmap());
auto disableInSubDirsLabel = new QLabel(tr("Disable in subdirectories:"), this);
m_disableInSubDirsCheckBox = new QCheckBox(this);
m_disableInSubDirsCheckBox->setToolTip(tr("Runs this step only for a top-level build."));
auto jobLayout = new QHBoxLayout;
jobLayout->addWidget(m_userJobCount);
jobLayout->addWidget(m_overrideMakeflags);
jobLayout->addWidget(m_nonOverrideWarning);
auto formLayout = new QFormLayout(this);
formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
formLayout->setContentsMargins(0, 0, 0, 0);
formLayout->addRow(m_makeLabel, m_makeLineEdit);
formLayout->addRow(makeArgumentsLabel, m_makeArgumentsLineEdit);
formLayout->addRow(m_jobsLabel, jobLayout);
formLayout->addRow(disableInSubDirsLabel, m_disableInSubDirsCheckBox);
formLayout->addRow(m_targetsLabel, m_targetsList);
LayoutBuilder builder(this);
makeStep->m_makeCommandAspect->addToLayout(builder.startNewRow());
makeStep->m_userArgumentsAspect->addToLayout(builder.startNewRow());
makeStep->m_userJobCountAspect->addToLayout(builder.startNewRow());
makeStep->m_overrideMakeflagsAspect->addToLayout(builder);
builder.startNewRow().addItems(disableInSubDirsLabel, m_disableInSubDirsCheckBox);
builder.startNewRow().addItems(m_targetsLabel, m_targetsList);
if (!makeStep->disablingForSubdirsSupported()) {
disableInSubDirsLabel->hide();
@@ -174,20 +154,16 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep)
updateDetails();
connect(makeStep->m_makeCommandAspect, &BaseStringAspect::changed,
this, &MakeStepConfigWidget::updateDetails);
connect(makeStep->m_userArgumentsAspect, &BaseStringAspect::changed,
this, &MakeStepConfigWidget::updateDetails);
connect(makeStep->m_userJobCountAspect, &BaseIntegerAspect::changed,
this, &MakeStepConfigWidget::updateDetails);
connect(makeStep->m_overrideMakeflagsAspect, &BaseBoolAspect::changed,
this, &MakeStepConfigWidget::updateDetails);
connect(m_targetsList, &QListWidget::itemChanged,
this, &MakeStepConfigWidget::itemChanged);
connect(m_makeLineEdit, &Utils::PathChooser::rawPathChanged,
this, &MakeStepConfigWidget::makeLineEditTextEdited);
connect(m_makeArgumentsLineEdit, &QLineEdit::textEdited,
this, &MakeStepConfigWidget::makeArgumentsLineEditTextEdited);
connect(m_userJobCount, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int value) {
m_makeStep->setJobCount(value);
updateDetails();
});
connect(m_overrideMakeflags, &QCheckBox::stateChanged, this, [this](int state) {
m_makeStep->setJobCountOverrideMakeflags(state == Qt::Checked);
updateDetails();
});
connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged,
this, &MakeStepConfigWidget::updateDetails);
@@ -207,28 +183,20 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep)
void MakeStepConfigWidget::setUserJobCountVisible(bool visible)
{
m_jobsLabel->setVisible(visible);
m_userJobCount->setVisible(visible);
m_overrideMakeflags->setVisible(visible);
m_makeStep->m_userJobCountAspect->setVisible(visible);
m_makeStep->m_overrideMakeflagsAspect->setVisible(visible);
}
void MakeStepConfigWidget::setUserJobCountEnabled(bool enabled)
{
m_jobsLabel->setEnabled(enabled);
m_userJobCount->setEnabled(enabled);
m_overrideMakeflags->setEnabled(enabled);
m_makeStep->m_userJobCountAspect->setEnabled(enabled);
m_makeStep->m_overrideMakeflagsAspect->setEnabled(enabled);
}
void MakeStepConfigWidget::updateDetails()
{
BuildConfiguration *bc = m_makeStep->buildConfiguration();
const QString defaultMake = m_makeStep->defaultMakeCommand().toString();
if (defaultMake.isEmpty())
m_makeLabel->setText(tr("Make:"));
else
m_makeLabel->setText(tr("Override %1:").arg(QDir::toNativeSeparators(defaultMake)));
const CommandLine make = m_makeStep->effectiveMakeCommand(MakeStep::Display);
if (make.executable().isEmpty()) {
setSummaryText(tr("<b>Make:</b> %1").arg(MakeStep::msgNoMakeCommand()));
@@ -241,11 +209,8 @@ void MakeStepConfigWidget::updateDetails()
setUserJobCountVisible(m_makeStep->isJobCountSupported());
setUserJobCountEnabled(!m_makeStep->userArgsContainsJobCount());
m_userJobCount->setValue(m_makeStep->jobCount());
m_overrideMakeflags->setCheckState(
m_makeStep->jobCountOverridesMakeflags() ? Qt::Checked : Qt::Unchecked);
m_nonOverrideWarning->setVisible(m_makeStep->makeflagsJobCountMismatch()
&& !m_makeStep->jobCountOverridesMakeflags());
m_makeStep->m_overrideMakeflagsAspect->m_nonOverrideWarning->setVisible(
m_makeStep->makeflagsJobCountMismatch() && !m_makeStep->jobCountOverridesMakeflags());
m_disableInSubDirsCheckBox->setChecked(!m_makeStep->enabledForSubDirs());
ProcessParameters param;
@@ -267,26 +232,53 @@ void MakeStepConfigWidget::itemChanged(QListWidgetItem *item)
updateDetails();
}
void MakeStepConfigWidget::makeLineEditTextEdited()
{
m_makeStep->setMakeCommand(FilePath::fromString(m_makeLineEdit->rawPath()));
updateDetails();
}
void MakeStepConfigWidget::makeArgumentsLineEditTextEdited()
{
m_makeStep->setUserArguments(m_makeArgumentsLineEdit->text());
updateDetails();
}
} // Internal
MakeStep::MakeStep(BuildStepList *parent, Utils::Id id)
: AbstractProcessStep(parent, id),
m_userJobCount(defaultJobCount())
: AbstractProcessStep(parent, id)
{
setDefaultDisplayName(defaultDisplayName());
setLowPriority();
m_makeCommandAspect = addAspect<BaseStringAspect>();
m_makeCommandAspect->setSettingsKey(id.withSuffix(MAKE_COMMAND_SUFFIX).toString());
m_makeCommandAspect->setDisplayStyle(BaseStringAspect::PathChooserDisplay);
m_makeCommandAspect->setExpectedKind(PathChooser::ExistingCommand);
m_makeCommandAspect->setBaseFileName(FilePath::fromString(PathChooser::homePath()));
m_makeCommandAspect->setHistoryCompleter("PE.MakeCommand.History");
m_userArgumentsAspect = addAspect<BaseStringAspect>();
m_userArgumentsAspect->setSettingsKey(id.withSuffix(MAKE_ARGUMENTS_SUFFIX).toString());
m_userArgumentsAspect->setLabelText(tr("Make arguments:"));
m_userArgumentsAspect->setDisplayStyle(BaseStringAspect::LineEditDisplay);
m_userJobCountAspect = addAspect<BaseIntegerAspect>();
m_userJobCountAspect->setSettingsKey(id.withSuffix(JOBCOUNT_SUFFIX).toString());
m_userJobCountAspect->setLabel(tr("Parallel jobs:"));
m_userJobCountAspect->setRange(1, 999);
m_userJobCountAspect->setValue(defaultJobCount());
m_userJobCountAspect->setDefaultValue(defaultJobCount());
m_overrideMakeflagsAspect = addAspect<Internal::OverrideMakeflagsAspect>();
m_overrideMakeflagsAspect->setSettingsKey(id.withSuffix(OVERRIDE_MAKEFLAGS_SUFFIX).toString());
m_cleanAspect = addAspect<BaseBoolAspect>();
m_cleanAspect->setSettingsKey(id.withSuffix(CLEAN_SUFFIX).toString());
m_buildTargetsAspect = addAspect<BaseStringListAspect>();
m_buildTargetsAspect->setSettingsKey(id.withSuffix(BUILD_TARGETS_SUFFIX).toString());
const auto updateMakeLabel = [this] {
const QString defaultMake = defaultMakeCommand().toString();
const QString labelText = defaultMake.isEmpty()
? tr("Make:")
: tr("Override %1:").arg(QDir::toNativeSeparators(defaultMake));
m_makeCommandAspect->setLabelText(labelText);
};
updateMakeLabel();
connect(m_makeCommandAspect, &BaseStringAspect::changed, this, updateMakeLabel);
}
void MakeStep::setBuildTarget(const QString &buildTarget)
@@ -336,12 +328,12 @@ void MakeStep::setupOutputFormatter(OutputFormatter *formatter)
void MakeStep::setClean(bool clean)
{
m_clean = clean;
m_cleanAspect->setValue(clean);
}
bool MakeStep::isClean() const
{
return m_clean;
return m_cleanAspect->value();
}
QString MakeStep::defaultDisplayName()
@@ -400,22 +392,12 @@ bool MakeStep::isJobCountSupported() const
int MakeStep::jobCount() const
{
return m_userJobCount;
}
void MakeStep::setJobCount(int count)
{
m_userJobCount = count;
return m_userJobCountAspect->value();
}
bool MakeStep::jobCountOverridesMakeflags() const
{
return m_overrideMakeflags;
}
void MakeStep::setJobCountOverrideMakeflags(bool override)
{
m_overrideMakeflags = override;
return m_overrideMakeflagsAspect->value();
}
static Utils::optional<int> argsJobCount(const QString &str)
@@ -448,7 +430,7 @@ bool MakeStep::makeflagsJobCountMismatch() const
if (!env.hasKey(MAKEFLAGS))
return false;
Utils::optional<int> makeFlagsJobCount = argsJobCount(env.expandedValueForKey(MAKEFLAGS));
return makeFlagsJobCount.has_value() && *makeFlagsJobCount != m_userJobCount;
return makeFlagsJobCount.has_value() && *makeFlagsJobCount != m_userJobCountAspect->value();
}
bool MakeStep::makeflagsContainsJobCount() const
@@ -461,7 +443,7 @@ bool MakeStep::makeflagsContainsJobCount() const
bool MakeStep::userArgsContainsJobCount() const
{
return argsJobCount(m_userArguments).has_value();
return argsJobCount(userArguments()).has_value();
}
Environment MakeStep::makeEnvironment() const
@@ -482,36 +464,7 @@ Environment MakeStep::makeEnvironment() const
void MakeStep::setMakeCommand(const FilePath &command)
{
m_makeCommand = command;
}
QVariantMap MakeStep::toMap() const
{
QVariantMap map(AbstractProcessStep::toMap());
map.insert(id().withSuffix(BUILD_TARGETS_SUFFIX).toString(), m_buildTargets);
map.insert(id().withSuffix(MAKE_ARGUMENTS_SUFFIX).toString(), m_userArguments);
map.insert(id().withSuffix(MAKE_COMMAND_SUFFIX).toString(), m_makeCommand.toString());
map.insert(id().withSuffix(CLEAN_SUFFIX).toString(), m_clean);
const QString jobCountKey = id().withSuffix(JOBCOUNT_SUFFIX).toString();
if (m_userJobCount != defaultJobCount())
map.insert(jobCountKey, m_userJobCount);
else
map.remove(jobCountKey);
map.insert(id().withSuffix(OVERRIDE_MAKEFLAGS_SUFFIX).toString(), m_overrideMakeflags);
return map;
}
bool MakeStep::fromMap(const QVariantMap &map)
{
m_buildTargets = map.value(id().withSuffix(BUILD_TARGETS_SUFFIX).toString()).toStringList();
m_userArguments = map.value(id().withSuffix(MAKE_ARGUMENTS_SUFFIX).toString()).toString();
m_makeCommand = FilePath::fromString(
map.value(id().withSuffix(MAKE_COMMAND_SUFFIX).toString()).toString());
m_clean = map.value(id().withSuffix(CLEAN_SUFFIX).toString()).toBool();
m_overrideMakeflags = map.value(id().withSuffix(OVERRIDE_MAKEFLAGS_SUFFIX).toString(), false).toBool();
m_userJobCount = map.value(id().withSuffix(JOBCOUNT_SUFFIX).toString(), defaultJobCount()).toInt();
return BuildStep::fromMap(map);
m_makeCommandAspect->setFilePath(command);
}
int MakeStep::defaultJobCount()
@@ -525,17 +478,17 @@ QStringList MakeStep::jobArguments() const
|| (makeflagsContainsJobCount() && !jobCountOverridesMakeflags())) {
return {};
}
return {"-j" + QString::number(m_userJobCount)};
return {"-j" + QString::number(m_userJobCountAspect->value())};
}
QString MakeStep::userArguments() const
{
return m_userArguments;
return m_userArgumentsAspect->value();
}
void MakeStep::setUserArguments(const QString &args)
{
m_userArguments = args;
m_userArgumentsAspect->setValue(args);
}
QStringList MakeStep::displayArguments() const
@@ -545,12 +498,13 @@ QStringList MakeStep::displayArguments() const
FilePath MakeStep::makeCommand() const
{
return m_makeCommand;
return m_makeCommandAspect->filePath();
}
FilePath MakeStep::makeExecutable() const
{
return m_makeCommand.isEmpty() ? defaultMakeCommand() : m_makeCommand;
const FilePath cmd = makeCommand();
return cmd.isEmpty() ? defaultMakeCommand() : cmd;
}
CommandLine MakeStep::effectiveMakeCommand(MakeCommandType type) const
@@ -559,9 +513,9 @@ CommandLine MakeStep::effectiveMakeCommand(MakeCommandType type) const
if (type == Display)
cmd.addArgs(displayArguments());
cmd.addArgs(m_userArguments, CommandLine::Raw);
cmd.addArgs(userArguments(), CommandLine::Raw);
cmd.addArgs(jobArguments());
cmd.addArgs(m_buildTargets);
cmd.addArgs(m_buildTargetsAspect->value());
return cmd;
}
@@ -573,18 +527,18 @@ BuildStepConfigWidget *MakeStep::createConfigWidget()
bool MakeStep::buildsTarget(const QString &target) const
{
return m_buildTargets.contains(target);
return m_buildTargetsAspect->value().contains(target);
}
void MakeStep::setBuildTarget(const QString &target, bool on)
{
QStringList old = m_buildTargets;
QStringList old = m_buildTargetsAspect->value();
if (on && !old.contains(target))
old << target;
else if (!on && old.contains(target))
old.removeOne(target);
m_buildTargets = old;
m_buildTargetsAspect->setValue(old);
}
QStringList MakeStep::availableTargets() const

View File

@@ -33,6 +33,16 @@ namespace Utils { class Environment; }
namespace ProjectExplorer {
namespace Internal {
class MakeStepConfigWidget;
class OverrideMakeflagsAspect;
} // Internal
class BaseBoolAspect;
class BaseIntegerAspect;
class BaseStringAspect;
class BaseStringListAspect;
class PROJECTEXPLORER_EXPORT MakeStep : public ProjectExplorer::AbstractProcessStep
{
Q_OBJECT
@@ -71,9 +81,7 @@ public:
virtual bool isJobCountSupported() const;
int jobCount() const;
void setJobCount(int count);
bool jobCountOverridesMakeflags() const;
void setJobCountOverrideMakeflags(bool override);
bool makeflagsContainsJobCount() const;
bool userArgsContainsJobCount() const;
bool makeflagsJobCountMismatch() const;
@@ -85,24 +93,24 @@ public:
Utils::Environment makeEnvironment() const;
protected:
bool fromMap(const QVariantMap &map) override;
void supportDisablingForSubdirs() { m_disablingForSubDirsSupported = true; }
virtual QStringList displayArguments() const;
private:
QVariantMap toMap() const override;
friend class Internal::MakeStepConfigWidget;
static int defaultJobCount();
QStringList jobArguments() const;
QStringList m_buildTargets;
BaseStringListAspect *m_buildTargetsAspect = nullptr;
QStringList m_availableTargets;
QString m_userArguments;
Utils::FilePath m_makeCommand;
int m_userJobCount = 4;
bool m_overrideMakeflags = false;
bool m_clean = false;
BaseStringAspect *m_makeCommandAspect = nullptr;
BaseStringAspect *m_userArgumentsAspect = nullptr;
BaseIntegerAspect *m_userJobCountAspect = nullptr;
Internal::OverrideMakeflagsAspect *m_overrideMakeflagsAspect = nullptr;
BaseBoolAspect *m_cleanAspect = nullptr;
bool m_disablingForSubDirsSupported = false;
bool m_enabledForSubDirs = true;
};
} // namespace GenericProjectManager
} // namespace ProjectExplorer