ProjectExplorer: Aspectify ProcessStep

This also fixes the update of the summary line which apparently
got lost at some time.

Change-Id: I1d5095244046601bf4624afa133430fcb99b3336
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2019-04-24 17:57:28 +02:00
parent 2d8ce380c9
commit 44b8f6de3d
2 changed files with 67 additions and 176 deletions

View File

@@ -35,103 +35,96 @@
#include <utils/macroexpander.h>
#include <QDebug>
#include <QFormLayout>
using namespace ProjectExplorer;
using namespace ProjectExplorer::Internal;
namespace ProjectExplorer {
namespace Internal {
namespace {
const char PROCESS_STEP_ID[] = "ProjectExplorer.ProcessStep";
const char PROCESS_COMMAND_KEY[] = "ProjectExplorer.ProcessStep.Command";
const char PROCESS_WORKINGDIRECTORY_KEY[] = "ProjectExplorer.ProcessStep.WorkingDirectory";
const char PROCESS_ARGUMENTS_KEY[] = "ProjectExplorer.ProcessStep.Arguments";
}
ProcessStep::ProcessStep(BuildStepList *bsl)
: AbstractProcessStep(bsl, PROCESS_STEP_ID)
{
//: Default ProcessStep display name
setDefaultDisplayName(tr("Custom Process Step"));
if (m_workingDirectory.isEmpty())
m_workingDirectory = Constants::DEFAULT_WORKING_DIR;
m_command = addAspect<BaseStringAspect>();
m_command->setSettingsKey(PROCESS_COMMAND_KEY);
m_command->setDisplayStyle(BaseStringAspect::PathChooserDisplay);
m_command->setLabelText(tr("Command:"));
m_command->setExpectedKind(Utils::PathChooser::Command);
m_command->setHistoryCompleter("PE.ProcessStepCommand.History");
m_arguments = addAspect<BaseStringAspect>();
m_arguments->setSettingsKey(PROCESS_ARGUMENTS_KEY);
m_arguments->setDisplayStyle(BaseStringAspect::LineEditDisplay);
m_arguments->setLabelText(tr("Arguments:"));
m_workingDirectory = addAspect<BaseStringAspect>();
m_workingDirectory->setSettingsKey(PROCESS_WORKINGDIRECTORY_KEY);
m_workingDirectory->setValue(Constants::DEFAULT_WORKING_DIR);
m_workingDirectory->setDisplayStyle(BaseStringAspect::PathChooserDisplay);
m_workingDirectory->setLabelText(tr("Working directory:"));
m_workingDirectory->setExpectedKind(Utils::PathChooser::Directory);
}
bool ProcessStep::init()
{
BuildConfiguration *bc = buildConfiguration();
ProcessParameters *pp = processParameters();
pp->setMacroExpander(bc ? bc->macroExpander() : Utils::globalMacroExpander());
pp->setEnvironment(bc ? bc->environment() : Utils::Environment::systemEnvironment());
pp->setWorkingDirectory(workingDirectory());
pp->setCommand(m_command);
pp->setArguments(m_arguments);
pp->resolveAll();
setupProcessParameters(processParameters());
setOutputParser(target()->kit()->createOutputParser());
return AbstractProcessStep::init();
}
void ProcessStep::doRun()
void ProcessStep::setupProcessParameters(ProcessParameters *pp)
{
AbstractProcessStep::doRun();
BuildConfiguration *bc = buildConfiguration();
QString command = m_command->value();
QString arguments = m_arguments->value();
QString workingDirectory = m_workingDirectory->value();
if (workingDirectory.isEmpty()) {
if (bc)
workingDirectory = Constants::DEFAULT_WORKING_DIR;
else
workingDirectory = Constants::DEFAULT_WORKING_DIR_ALTERNATE;
}
pp->setMacroExpander(bc ? bc->macroExpander() : Utils::globalMacroExpander());
pp->setEnvironment(bc ? bc->environment() : Utils::Environment::systemEnvironment());
pp->setWorkingDirectory(workingDirectory);
pp->setCommand(command);
pp->setArguments(arguments);
pp->resolveAll();
}
BuildStepConfigWidget *ProcessStep::createConfigWidget()
{
return new ProcessStepConfigWidget(this);
}
auto widget = AbstractProcessStep::createConfigWidget();
QString ProcessStep::command() const
{
return m_command;
}
Core::VariableChooser::addSupportForChildWidgets(widget, macroExpander());
QString ProcessStep::arguments() const
{
return m_arguments;
}
auto updateDetails = [this, widget] {
QString display = displayName();
if (display.isEmpty())
display = tr("Custom Process Step");
ProcessParameters param;
setupProcessParameters(&param);
widget->setSummaryText(param.summary(display));
};
QString ProcessStep::workingDirectory() const
{
return m_workingDirectory;
}
updateDetails();
void ProcessStep::setCommand(const QString &command)
{
m_command = command;
}
connect(m_command, &ProjectConfigurationAspect::changed,
widget, updateDetails);
connect(m_workingDirectory, &ProjectConfigurationAspect::changed,
widget, updateDetails);
connect(m_arguments, &ProjectConfigurationAspect::changed,
widget, updateDetails);
void ProcessStep::setArguments(const QString &arguments)
{
m_arguments = arguments;
}
void ProcessStep::setWorkingDirectory(const QString &workingDirectory)
{
if (workingDirectory.isEmpty())
if (buildConfiguration())
m_workingDirectory = Constants::DEFAULT_WORKING_DIR;
else
m_workingDirectory = Constants::DEFAULT_WORKING_DIR_ALTERNATE;
else
m_workingDirectory = workingDirectory;
}
QVariantMap ProcessStep::toMap() const
{
QVariantMap map(AbstractProcessStep::toMap());
map.insert(PROCESS_COMMAND_KEY, command());
map.insert(PROCESS_ARGUMENTS_KEY, arguments());
map.insert(PROCESS_WORKINGDIRECTORY_KEY, workingDirectory());
return map;
}
bool ProcessStep::fromMap(const QVariantMap &map)
{
setCommand(map.value(PROCESS_COMMAND_KEY).toString());
setArguments(map.value(PROCESS_ARGUMENTS_KEY).toString());
setWorkingDirectory(map.value(PROCESS_WORKINGDIRECTORY_KEY).toString());
return AbstractProcessStep::fromMap(map);
return widget;
}
//*******
@@ -144,80 +137,5 @@ ProcessStepFactory::ProcessStepFactory()
setDisplayName(ProcessStep::tr("Custom Process Step", "item in combobox"));
}
//*******
// ProcessStepConfigWidget
//*******
ProcessStepConfigWidget::ProcessStepConfigWidget(ProcessStep *step)
: BuildStepConfigWidget(step), m_step(step)
{
m_ui.setupUi(this);
m_ui.command->setExpectedKind(Utils::PathChooser::Command);
m_ui.command->setHistoryCompleter("PE.ProcessStepCommand.History");
m_ui.workingDirectory->setExpectedKind(Utils::PathChooser::Directory);
BuildConfiguration *bc = m_step->buildConfiguration();
Utils::Environment env = bc ? bc->environment() : Utils::Environment::systemEnvironment();
m_ui.command->setEnvironment(env);
m_ui.command->setPath(m_step->command());
m_ui.workingDirectory->setEnvironment(env);
m_ui.workingDirectory->setPath(m_step->workingDirectory());
m_ui.commandArgumentsLineEdit->setText(m_step->arguments());
updateDetails();
connect(m_ui.command, &Utils::PathChooser::rawPathChanged,
this, &ProcessStepConfigWidget::commandLineEditTextEdited);
connect(m_ui.workingDirectory, &Utils::PathChooser::rawPathChanged,
this, &ProcessStepConfigWidget::workingDirectoryLineEditTextEdited);
connect(m_ui.commandArgumentsLineEdit, &QLineEdit::textEdited,
this, &ProcessStepConfigWidget::commandArgumentsLineEditTextEdited);
Core::VariableChooser::addSupportForChildWidgets(this, m_step->macroExpander());
}
void ProcessStepConfigWidget::updateDetails()
{
QString displayName = m_step->displayName();
if (displayName.isEmpty())
displayName = tr("Custom Process Step");
ProcessParameters param;
BuildConfiguration *bc = m_step->buildConfiguration();
param.setMacroExpander(bc ? bc->macroExpander() : Utils::globalMacroExpander());
param.setEnvironment(bc ? bc->environment() : Utils::Environment::systemEnvironment());
param.setWorkingDirectory(m_step->workingDirectory());
param.setCommand(m_step->command());
param.setArguments(m_step->arguments());
m_summaryText = param.summary(displayName);
emit updateSummary();
}
QString ProcessStepConfigWidget::displayName() const
{
return m_step->displayName();
}
QString ProcessStepConfigWidget::summaryText() const
{
return m_summaryText;
}
void ProcessStepConfigWidget::commandLineEditTextEdited()
{
m_step->setCommand(m_ui.command->rawPath());
updateDetails();
}
void ProcessStepConfigWidget::workingDirectoryLineEditTextEdited()
{
m_step->setWorkingDirectory(m_ui.workingDirectory->rawPath());
}
void ProcessStepConfigWidget::commandArgumentsLineEditTextEdited()
{
m_step->setArguments(m_ui.commandArgumentsLineEdit->text());
updateDetails();
}
} // Internal
} // ProjectExplorer

View File

@@ -25,8 +25,8 @@
#pragma once
#include "ui_processstep.h"
#include "abstractprocessstep.h"
#include "projectconfigurationaspects.h"
namespace ProjectExplorer {
namespace Internal {
@@ -47,40 +47,13 @@ public:
BuildStepConfigWidget *createConfigWidget() override;
QString command() const;
QString arguments() const;
QString workingDirectory() const;
void setCommand(const QString &command);
void setArguments(const QString &arguments);
void setWorkingDirectory(const QString &workingDirectory);
private:
bool init() override;
void doRun() override;
QVariantMap toMap() const override;
bool fromMap(const QVariantMap &map) override;
void setupProcessParameters(ProcessParameters *pp);
QString m_command;
QString m_arguments;
QString m_workingDirectory;
};
class ProcessStepConfigWidget : public BuildStepConfigWidget
{
Q_OBJECT
public:
ProcessStepConfigWidget(ProcessStep *step);
virtual QString displayName() const;
virtual QString summaryText() const;
private:
void commandLineEditTextEdited();
void workingDirectoryLineEditTextEdited();
void commandArgumentsLineEditTextEdited();
void updateDetails();
ProcessStep *m_step;
Ui::ProcessStepWidget m_ui;
QString m_summaryText;
ProjectExplorer::BaseStringAspect *m_command;
ProjectExplorer::BaseStringAspect *m_arguments;
ProjectExplorer::BaseStringAspect *m_workingDirectory;
};
} // namespace Internal