ProjectExplorer: make cloned workspace run configurations editable

Change-Id: Ic2c90da28f3cc498a698e948d99b13e296c3ca0d
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
David Schulz
2024-10-07 12:53:29 +02:00
parent 6c668279df
commit cd85bed2f7
5 changed files with 34 additions and 19 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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; }

View File

@@ -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;

View File

@@ -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