diff --git a/src/plugins/projectexplorer/runconfigurationaspects.cpp b/src/plugins/projectexplorer/runconfigurationaspects.cpp index 58e06f8364b..1afd840c8c2 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/runconfigurationaspects.cpp @@ -135,8 +135,8 @@ void TerminalAspect::setRunMode(ApplicationLauncher::Mode runMode) \class ProjectExplorer::WorkingDirectoryAspect */ -WorkingDirectoryAspect::WorkingDirectoryAspect(RunConfiguration *runConfig, const QString &key, const QString &dir) - : IRunConfigurationAspect(runConfig), m_workingDirectory(dir), m_chooser(0), m_key(key) +WorkingDirectoryAspect::WorkingDirectoryAspect(RunConfiguration *runConfig, const QString &key) + : IRunConfigurationAspect(runConfig), m_chooser(0), m_key(key) { setDisplayName(tr("Working Directory")); setId("WorkingDirectoryAspect"); @@ -149,7 +149,10 @@ WorkingDirectoryAspect *WorkingDirectoryAspect::create(RunConfiguration *runConf WorkingDirectoryAspect *WorkingDirectoryAspect::clone(RunConfiguration *runConfig) const { - return new WorkingDirectoryAspect(runConfig, m_key, m_workingDirectory); + auto * const aspect = new WorkingDirectoryAspect(runConfig, m_key); + aspect->m_defaultWorkingDirectory = m_defaultWorkingDirectory; + aspect->m_workingDirectory = m_workingDirectory; + return aspect; } void WorkingDirectoryAspect::addToMainConfigurationWidget(QWidget *parent, QFormLayout *layout) @@ -159,8 +162,10 @@ void WorkingDirectoryAspect::addToMainConfigurationWidget(QWidget *parent, QForm m_chooser->setHistoryCompleter(m_key); m_chooser->setExpectedKind(Utils::PathChooser::Directory); m_chooser->setPromptDialogTitle(tr("Select Working Directory")); - connect(m_chooser.data(), &PathChooser::pathChanged, - this, &WorkingDirectoryAspect::setWorkingDirectory); + m_chooser->lineEdit()->setPlaceholderText(m_defaultWorkingDirectory); + m_chooser->setPath(m_workingDirectory); + connect(m_chooser.data(), &PathChooser::pathChanged, this, + [this]() { m_workingDirectory = m_chooser->rawPath(); }); auto resetButton = new QToolButton(parent); resetButton->setToolTip(tr("Reset to Default")); @@ -187,25 +192,39 @@ void WorkingDirectoryAspect::updateEnvironment() m_chooser->setEnvironment(envAspect->environment()); } +QString WorkingDirectoryAspect::keyForDefaultWd() const +{ + return m_key + QLatin1String(".default"); +} + void WorkingDirectoryAspect::resetPath() { - QTC_ASSERT(m_chooser, return); m_chooser->setPath(QString()); } void WorkingDirectoryAspect::fromMap(const QVariantMap &map) { m_workingDirectory = map.value(m_key).toString(); + m_defaultWorkingDirectory = map.value(keyForDefaultWd()).toString(); } void WorkingDirectoryAspect::toMap(QVariantMap &data) const { data.insert(m_key, m_workingDirectory); + data.insert(keyForDefaultWd(), m_defaultWorkingDirectory); } QString WorkingDirectoryAspect::workingDirectory() const { - return runConfiguration()->macroExpander()->expandProcessArgs(m_workingDirectory); + QTC_ASSERT(m_chooser, return m_defaultWorkingDirectory); + return m_workingDirectory.isEmpty() + ? m_defaultWorkingDirectory + : runConfiguration()->macroExpander()->expandProcessArgs(m_chooser->path()); +} + +QString WorkingDirectoryAspect::defaultWorkingDirectory() const +{ + return m_defaultWorkingDirectory; } QString WorkingDirectoryAspect::unexpandedWorkingDirectory() const @@ -213,9 +232,11 @@ QString WorkingDirectoryAspect::unexpandedWorkingDirectory() const return m_workingDirectory; } -void WorkingDirectoryAspect::setWorkingDirectory(const QString &workingDirectory) +void WorkingDirectoryAspect::setDefaultWorkingDirectory(const QString &defaultWorkingDir) { - m_workingDirectory = workingDirectory; + m_defaultWorkingDirectory = defaultWorkingDir; + if (m_chooser) + m_chooser->lineEdit()->setPlaceholderText(m_defaultWorkingDirectory); } PathChooser *WorkingDirectoryAspect::pathChooser() const diff --git a/src/plugins/projectexplorer/runconfigurationaspects.h b/src/plugins/projectexplorer/runconfigurationaspects.h index 8680c215bbc..d006c3581e8 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.h +++ b/src/plugins/projectexplorer/runconfigurationaspects.h @@ -85,7 +85,7 @@ class PROJECTEXPLORER_EXPORT WorkingDirectoryAspect : public IRunConfigurationAs Q_OBJECT public: - explicit WorkingDirectoryAspect(RunConfiguration *runConfig, const QString &key, const QString &dir = QString()); + explicit WorkingDirectoryAspect(RunConfiguration *runConfig, const QString &key); WorkingDirectoryAspect *create(RunConfiguration *runConfig) const override; WorkingDirectoryAspect *clone(RunConfiguration *runConfig) const override; @@ -93,8 +93,9 @@ public: void addToMainConfigurationWidget(QWidget *parent, QFormLayout *layout); QString workingDirectory() const; + QString defaultWorkingDirectory() const; QString unexpandedWorkingDirectory() const; - void setWorkingDirectory(const QString &workingDirectory); + void setDefaultWorkingDirectory(const QString &defaultWorkingDir); Utils::PathChooser *pathChooser() const; private: @@ -103,8 +104,10 @@ private: void resetPath(); void updateEnvironment(); + QString keyForDefaultWd() const; QString m_workingDirectory; + QString m_defaultWorkingDirectory; QPointer m_chooser; QString m_key; }; diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 8ef4ffbef17..7b5112bdb29 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -246,21 +246,13 @@ bool QbsRunConfiguration::isConsoleApplication() const QString QbsRunConfiguration::workingDirectory() const { - EnvironmentAspect *aspect = extraAspect(); - QTC_ASSERT(aspect, return baseWorkingDirectory()); - return QDir::cleanPath(aspect->environment().expandVariables( - macroExpander()->expand(baseWorkingDirectory()))); + const auto *wdAspect = extraAspect(); + QTC_ASSERT(wdAspect, return baseWorkingDirectory()); + return wdAspect->workingDirectory(); } QString QbsRunConfiguration::baseWorkingDirectory() const { - WorkingDirectoryAspect *aspect = extraAspect(); - // if the user overrode us, then return his working directory - QString wd = aspect->unexpandedWorkingDirectory(); - if (!wd.isEmpty()) - return wd; - - // else what the pro file reader tells us const QString exe = executable(); if (!exe.isEmpty()) return QFileInfo(executable()).absolutePath(); @@ -272,18 +264,6 @@ QString QbsRunConfiguration::commandLineArguments() const return extraAspect()->arguments(); } -void QbsRunConfiguration::setBaseWorkingDirectory(const QString &wd) -{ - WorkingDirectoryAspect *aspect = extraAspect(); - const QString &oldWorkingDirectory = workingDirectory(); - - aspect->setWorkingDirectory(wd); - - const QString &newWorkingDirectory = workingDirectory(); - if (oldWorkingDirectory != newWorkingDirectory) - emit baseWorkingDirectoryChanged(newWorkingDirectory); -} - void QbsRunConfiguration::setRunMode(ApplicationLauncher::Mode runMode) { extraAspect()->setRunMode(runMode); @@ -413,7 +393,7 @@ void QbsRunConfigurationWidget::targetInformationHasChanged() setExecutableLineText(m_rc->executable()); WorkingDirectoryAspect *aspect = m_rc->extraAspect(); - aspect->pathChooser()->setPath(m_rc->baseWorkingDirectory()); + aspect->setDefaultWorkingDirectory(m_rc->baseWorkingDirectory()); aspect->pathChooser()->setBaseFileName(m_rc->target()->project()->projectDirectory()); m_ignoreChange = false; } diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h index d6e2be2f23b..5d04c9da357 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h @@ -92,7 +92,6 @@ public: bool isConsoleApplication() const; signals: - void baseWorkingDirectoryChanged(const QString&); void targetInformationChanged(); void usingDyldImageSuffixChanged(bool); @@ -104,7 +103,6 @@ private slots: void installStepToBeRemoved(int pos); private: - void setBaseWorkingDirectory(const QString &workingDirectory); QString baseWorkingDirectory() const; QString defaultDisplayName(); qbs::InstallOptions installOptions() const;