From cd85bed2f720d7d143079c222b613e084232d247 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 7 Oct 2024 12:53:29 +0200 Subject: [PATCH] ProjectExplorer: make cloned workspace run configurations editable Change-Id: Ic2c90da28f3cc498a698e948d99b13e296c3ca0d Reviewed-by: Marcus Tillmanns --- src/plugins/projectexplorer/project.cpp | 2 +- .../projectexplorer/runconfiguration.cpp | 14 ++++---- .../projectexplorer/runconfiguration.h | 3 +- .../runsettingspropertiespage.cpp | 2 +- .../projectexplorer/workspaceproject.cpp | 32 +++++++++++++------ 5 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 5ca9b57b3ee..d1a9f2af869 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -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; diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index f5b858d141d..edeb1d1e609 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -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 RunConfigurationFactory::creatorsForTarget(Target *parent) { QList items; diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 113bc54426b..9fa2a21633c 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -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 creatorsForTarget(Target *parent); Utils::Id runConfigurationId() const { return m_runConfigurationId; } diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index ec18f68c603..c10870c2af0 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -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; diff --git a/src/plugins/projectexplorer/workspaceproject.cpp b/src/plugins/projectexplorer/workspaceproject.cpp index f5ca390bc85..40637cb7ce7 100644 --- a/src/plugins/projectexplorer/workspaceproject.cpp +++ b/src/plugins/projectexplorer/workspaceproject.cpp @@ -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(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