forked from qt-creator/qt-creator
ProjectExplorer: make cloned workspace run configurations editable
Change-Id: Ic2c90da28f3cc498a698e948d99b13e296c3ca0d Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
@@ -547,7 +547,7 @@ bool Project::copySteps(Target *sourceTarget, Target *newTarget)
|
||||
}
|
||||
|
||||
for (RunConfiguration *sourceRc : sourceTarget->runConfigurations()) {
|
||||
RunConfiguration *newRc = RunConfigurationFactory::clone(newTarget, sourceRc);
|
||||
RunConfiguration *newRc = sourceRc->clone(newTarget);
|
||||
if (!newRc) {
|
||||
runconfigurationError << sourceRc->displayName();
|
||||
continue;
|
||||
|
@@ -356,6 +356,13 @@ void RunConfiguration::update()
|
||||
ProjectExplorerPlugin::updateRunActions();
|
||||
}
|
||||
|
||||
RunConfiguration *RunConfiguration::clone(Target *parent)
|
||||
{
|
||||
Store map;
|
||||
toMap(map);
|
||||
return RunConfigurationFactory::restore(parent, map);
|
||||
}
|
||||
|
||||
BuildTargetInfo RunConfiguration::buildTargetInfo() const
|
||||
{
|
||||
BuildSystem *bs = target()->buildSystem();
|
||||
@@ -656,13 +663,6 @@ RunConfiguration *RunConfigurationFactory::restore(Target *parent, const Store &
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
RunConfiguration *RunConfigurationFactory::clone(Target *parent, RunConfiguration *source)
|
||||
{
|
||||
Store map;
|
||||
source->toMap(map);
|
||||
return restore(parent, map);
|
||||
}
|
||||
|
||||
const QList<RunConfigurationCreationInfo> RunConfigurationFactory::creatorsForTarget(Target *parent)
|
||||
{
|
||||
QList<RunConfigurationCreationInfo> items;
|
||||
|
@@ -174,6 +174,8 @@ public:
|
||||
|
||||
const Utils::MacroExpander *macroExpander() const { return &m_expander; }
|
||||
|
||||
virtual RunConfiguration *clone(Target *parent);
|
||||
|
||||
protected:
|
||||
RunConfiguration(Target *target, Utils::Id id);
|
||||
|
||||
@@ -233,7 +235,6 @@ public:
|
||||
virtual ~RunConfigurationFactory();
|
||||
|
||||
static RunConfiguration *restore(Target *parent, const Utils::Store &map);
|
||||
static RunConfiguration *clone(Target *parent, RunConfiguration *source);
|
||||
static const QList<RunConfigurationCreationInfo> creatorsForTarget(Target *parent);
|
||||
|
||||
Utils::Id runConfigurationId() const { return m_runConfigurationId; }
|
||||
|
@@ -210,7 +210,7 @@ void RunSettingsWidget::cloneRunConfiguration()
|
||||
if (name.isEmpty())
|
||||
return;
|
||||
|
||||
RunConfiguration *newRc = RunConfigurationFactory::clone(m_target, activeRunConfiguration);
|
||||
RunConfiguration *newRc = activeRunConfiguration->clone(m_target);
|
||||
if (!newRc)
|
||||
return;
|
||||
|
||||
|
@@ -235,6 +235,8 @@ void WorkspaceBuildSystem::reparse(bool force)
|
||||
|
||||
if (force || oldFilters != m_filters)
|
||||
scan(target()->project()->projectDirectory());
|
||||
else
|
||||
emitBuildSystemUpdated();
|
||||
}
|
||||
|
||||
void WorkspaceBuildSystem::triggerParsing()
|
||||
@@ -369,6 +371,7 @@ public:
|
||||
const BuildTargetInfo bti = buildTargetInfo();
|
||||
executable.setLabelText(Tr::tr("Executable:"));
|
||||
executable.setValue(bti.targetFilePath);
|
||||
executable.setSettingsKey("Workspace.RunConfiguration.Executable");
|
||||
|
||||
auto argumentsAsString = [this]() {
|
||||
return CommandLine{
|
||||
@@ -379,36 +382,47 @@ public:
|
||||
arguments.setLabelText(Tr::tr("Arguments:"));
|
||||
arguments.setMacroExpander(macroExpander());
|
||||
arguments.setArguments(argumentsAsString());
|
||||
arguments.setSettingsKey("Workspace.RunConfiguration.Arguments");
|
||||
|
||||
workingDirectory.setLabelText(Tr::tr("Working directory:"));
|
||||
workingDirectory.setDefaultWorkingDirectory(bti.workingDirectory);
|
||||
workingDirectory.setSettingsKey("Workspace.RunConfiguration.WorkingDirectory");
|
||||
|
||||
setCommandLineGetter([this] {
|
||||
const BuildTargetInfo bti = buildTargetInfo();
|
||||
CommandLine cmdLine{
|
||||
macroExpander()->expand(bti.targetFilePath),
|
||||
Utils::transform(
|
||||
bti.additionalData.toMap()["arguments"].toStringList(),
|
||||
[this](const QString &arg) { return macroExpander()->expand(arg); })};
|
||||
|
||||
return cmdLine;
|
||||
return CommandLine(executable.effectiveBinary(),
|
||||
arguments.arguments(),
|
||||
CommandLine::Raw);
|
||||
});
|
||||
|
||||
setUpdater([this, argumentsAsString] {
|
||||
if (enabled.value()) // skip the update for cloned run configurations
|
||||
return;
|
||||
const BuildTargetInfo bti = buildTargetInfo();
|
||||
executable.setValue(bti.targetFilePath);
|
||||
arguments.setArguments(argumentsAsString());
|
||||
workingDirectory.setDefaultWorkingDirectory(bti.workingDirectory);
|
||||
});
|
||||
|
||||
auto enabledUpdater = [this] { setEnabled(enabled.value()); };
|
||||
connect(&enabled, &BaseAspect::changed, this, enabledUpdater);
|
||||
connect(this, &AspectContainer::fromMapFinished, this, enabledUpdater);
|
||||
connect(target, &Target::buildSystemUpdated, this, &RunConfiguration::update);
|
||||
setEnabled(false);
|
||||
enabledUpdater();
|
||||
enabled.setSettingsKey("Workspace.RunConfiguration.Enabled");
|
||||
}
|
||||
|
||||
RunConfiguration *clone(Target *parent) override
|
||||
{
|
||||
RunConfiguration *result = RunConfiguration::clone(parent);
|
||||
dynamic_cast<WorkspaceRunConfiguration *>(result)->enabled.setValue(true);
|
||||
return result;
|
||||
}
|
||||
|
||||
TextDisplay hint{this};
|
||||
FilePathAspect executable{this};
|
||||
ArgumentsAspect arguments{this};
|
||||
WorkingDirectoryAspect workingDirectory{this};
|
||||
BoolAspect enabled{this};
|
||||
};
|
||||
|
||||
class WorkspaceProjectRunConfigurationFactory : public RunConfigurationFactory
|
||||
|
Reference in New Issue
Block a user