CMakeProjectManager: Use WorkingDirectoryAspect

This mimics the relevant parts of QbsProjectManager.

Change-Id: I31257556ce0fcc714f6fac26f9d0b88ca6cb076b
Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
This commit is contained in:
hjk
2015-12-16 12:10:11 +01:00
parent beb561b8cc
commit e5b9e819fa
2 changed files with 26 additions and 133 deletions

View File

@@ -61,31 +61,30 @@ using namespace ProjectExplorer;
namespace { namespace {
const char CMAKE_RC_PREFIX[] = "CMakeProjectManager.CMakeRunConfiguration."; const char CMAKE_RC_PREFIX[] = "CMakeProjectManager.CMakeRunConfiguration.";
const char USER_WORKING_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory";
const char TITLE_KEY[] = "CMakeProjectManager.CMakeRunConfiguation.Title"; const char TITLE_KEY[] = "CMakeProjectManager.CMakeRunConfiguation.Title";
} // namespace } // namespace
CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, Core::Id id, const QString &target, CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, Core::Id id, const QString &target,
const QString &workingDirectory, const QString &title) : const QString &workingDirectory, const QString &title) :
LocalApplicationRunConfiguration(parent, id), LocalApplicationRunConfiguration(parent, id),
m_buildTarget(target), m_buildTarget(target),
m_workingDirectory(workingDirectory),
m_title(title), m_title(title),
m_enabled(true) m_enabled(true)
{ {
addExtraAspect(new LocalEnvironmentAspect(this)); addExtraAspect(new LocalEnvironmentAspect(this));
addExtraAspect(new ArgumentsAspect(this, QStringLiteral("CMakeProjectManager.CMakeRunConfiguration.Arguments"))); addExtraAspect(new ArgumentsAspect(this, QStringLiteral("CMakeProjectManager.CMakeRunConfiguration.Arguments")));
addExtraAspect(new TerminalAspect(this, QStringLiteral("CMakeProjectManager.CMakeRunConfiguration.UseTerminal"))); addExtraAspect(new TerminalAspect(this, QStringLiteral("CMakeProjectManager.CMakeRunConfiguration.UseTerminal")));
auto wd = new WorkingDirectoryAspect(this, QStringLiteral("CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"));
wd->setDefaultWorkingDirectory(workingDirectory);
addExtraAspect(wd);
ctor(); ctor();
} }
CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, CMakeRunConfiguration *source) : CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, CMakeRunConfiguration *source) :
LocalApplicationRunConfiguration(parent, source), LocalApplicationRunConfiguration(parent, source),
m_buildTarget(source->m_buildTarget), m_buildTarget(source->m_buildTarget),
m_workingDirectory(source->m_workingDirectory),
m_userWorkingDirectory(source->m_userWorkingDirectory),
m_title(source->m_title), m_title(source->m_title),
m_enabled(source->m_enabled) m_enabled(source->m_enabled)
{ {
@@ -109,17 +108,17 @@ ApplicationLauncher::Mode CMakeRunConfiguration::runMode() const
QString CMakeRunConfiguration::workingDirectory() const QString CMakeRunConfiguration::workingDirectory() const
{ {
EnvironmentAspect *aspect = extraAspect<EnvironmentAspect>(); const auto *wdAspect = extraAspect<WorkingDirectoryAspect>();
QTC_ASSERT(aspect, return QString()); QTC_ASSERT(wdAspect, return baseWorkingDirectory());
return QDir::cleanPath(aspect->environment().expandVariables( return wdAspect->workingDirectory();
macroExpander()->expand(baseWorkingDirectory())));
} }
QString CMakeRunConfiguration::baseWorkingDirectory() const QString CMakeRunConfiguration::baseWorkingDirectory() const
{ {
if (!m_userWorkingDirectory.isEmpty()) const QString exe = executable();
return m_userWorkingDirectory; if (!exe.isEmpty())
return m_workingDirectory; return QFileInfo(executable()).absolutePath();
return QString();
} }
QString CMakeRunConfiguration::commandLineArguments() const QString CMakeRunConfiguration::commandLineArguments() const
@@ -139,41 +138,19 @@ void CMakeRunConfiguration::setExecutable(const QString &executable)
void CMakeRunConfiguration::setBaseWorkingDirectory(const QString &wd) void CMakeRunConfiguration::setBaseWorkingDirectory(const QString &wd)
{ {
const QString &oldWorkingDirectory = workingDirectory(); extraAspect<WorkingDirectoryAspect>()->setDefaultWorkingDirectory(wd);
m_workingDirectory = wd;
const QString &newWorkingDirectory = workingDirectory();
if (oldWorkingDirectory != newWorkingDirectory)
emit baseWorkingDirectoryChanged(newWorkingDirectory);
}
void CMakeRunConfiguration::setUserWorkingDirectory(const QString &wd)
{
const QString & oldWorkingDirectory = workingDirectory();
m_userWorkingDirectory = wd;
const QString &newWorkingDirectory = workingDirectory();
if (oldWorkingDirectory != newWorkingDirectory)
emit baseWorkingDirectoryChanged(newWorkingDirectory);
} }
QVariantMap CMakeRunConfiguration::toMap() const QVariantMap CMakeRunConfiguration::toMap() const
{ {
QVariantMap map(LocalApplicationRunConfiguration::toMap()); QVariantMap map(LocalApplicationRunConfiguration::toMap());
map.insert(QLatin1String(USER_WORKING_DIRECTORY_KEY), m_userWorkingDirectory);
map.insert(QLatin1String(TITLE_KEY), m_title); map.insert(QLatin1String(TITLE_KEY), m_title);
return map; return map;
} }
bool CMakeRunConfiguration::fromMap(const QVariantMap &map) bool CMakeRunConfiguration::fromMap(const QVariantMap &map)
{ {
m_userWorkingDirectory = map.value(QLatin1String(USER_WORKING_DIRECTORY_KEY)).toString();
m_title = map.value(QLatin1String(TITLE_KEY)).toString(); m_title = map.value(QLatin1String(TITLE_KEY)).toString();
return RunConfiguration::fromMap(map); return RunConfiguration::fromMap(map);
} }
@@ -217,93 +194,28 @@ QString CMakeRunConfiguration::disabledReason() const
// Configuration widget // Configuration widget
CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *cmakeRunConfiguration, QWidget *parent) CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *cmakeRunConfiguration, QWidget *parent)
: QWidget(parent), m_ignoreChange(false), m_cmakeRunConfiguration(cmakeRunConfiguration) : QWidget(parent)
{ {
QFormLayout *fl = new QFormLayout(); auto fl = new QFormLayout();
fl->setMargin(0); fl->setMargin(0);
fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
cmakeRunConfiguration->extraAspect<ArgumentsAspect>()->addToMainConfigurationWidget(this, fl); cmakeRunConfiguration->extraAspect<ArgumentsAspect>()->addToMainConfigurationWidget(this, fl);
cmakeRunConfiguration->extraAspect<WorkingDirectoryAspect>()->addToMainConfigurationWidget(this, fl);
cmakeRunConfiguration->extraAspect<TerminalAspect>()->addToMainConfigurationWidget(this, fl);
m_workingDirectoryEdit = new Utils::PathChooser(); auto detailsContainer = new Utils::DetailsWidget(this);
m_workingDirectoryEdit->setExpectedKind(Utils::PathChooser::Directory); detailsContainer->setState(Utils::DetailsWidget::NoSummary);
m_workingDirectoryEdit->setBaseFileName(m_cmakeRunConfiguration->target()->project()->projectDirectory());
m_workingDirectoryEdit->setPath(m_cmakeRunConfiguration->baseWorkingDirectory());
m_workingDirectoryEdit->setHistoryCompleter(QLatin1String("CMake.WorkingDir.History"));
EnvironmentAspect *aspect
= m_cmakeRunConfiguration->extraAspect<EnvironmentAspect>();
if (aspect) {
connect(aspect, &EnvironmentAspect::environmentChanged,
this, &CMakeRunConfigurationWidget::environmentWasChanged);
environmentWasChanged();
}
m_workingDirectoryEdit->setPromptDialogTitle(tr("Select Working Directory"));
QToolButton *resetButton = new QToolButton(); auto detailsWidget = new QWidget(detailsContainer);
resetButton->setToolTip(tr("Reset to Default")); detailsContainer->setWidget(detailsWidget);
resetButton->setIcon(Core::Icons::RESET.icon()); detailsWidget->setLayout(fl);
QHBoxLayout *boxlayout = new QHBoxLayout(); auto vbx = new QVBoxLayout(this);
boxlayout->addWidget(m_workingDirectoryEdit);
boxlayout->addWidget(resetButton);
fl->addRow(tr("Working directory:"), boxlayout);
m_cmakeRunConfiguration->extraAspect<TerminalAspect>()->addToMainConfigurationWidget(this, fl);
m_detailsContainer = new Utils::DetailsWidget(this);
m_detailsContainer->setState(Utils::DetailsWidget::NoSummary);
QWidget *m_details = new QWidget(m_detailsContainer);
m_detailsContainer->setWidget(m_details);
m_details->setLayout(fl);
QVBoxLayout *vbx = new QVBoxLayout(this);
vbx->setMargin(0); vbx->setMargin(0);
vbx->addWidget(m_detailsContainer); vbx->addWidget(detailsContainer);
connect(m_workingDirectoryEdit, &Utils::PathChooser::rawPathChanged, setEnabled(cmakeRunConfiguration->isEnabled());
this, &CMakeRunConfigurationWidget::setWorkingDirectory);
connect(resetButton, &QToolButton::clicked,
this, &CMakeRunConfigurationWidget::resetWorkingDirectory);
connect(m_cmakeRunConfiguration, &CMakeRunConfiguration::baseWorkingDirectoryChanged,
this, &CMakeRunConfigurationWidget::workingDirectoryChanged);
setEnabled(m_cmakeRunConfiguration->isEnabled());
}
void CMakeRunConfigurationWidget::setWorkingDirectory()
{
if (m_ignoreChange)
return;
m_ignoreChange = true;
m_cmakeRunConfiguration->setUserWorkingDirectory(m_workingDirectoryEdit->rawPath());
m_ignoreChange = false;
}
void CMakeRunConfigurationWidget::workingDirectoryChanged(const QString &workingDirectory)
{
if (!m_ignoreChange) {
m_ignoreChange = true;
m_workingDirectoryEdit->setPath(workingDirectory);
m_ignoreChange = false;
}
}
void CMakeRunConfigurationWidget::resetWorkingDirectory()
{
// This emits a signal connected to workingDirectoryChanged()
// that sets the m_workingDirectoryEdit
m_cmakeRunConfiguration->setUserWorkingDirectory(QString());
}
void CMakeRunConfigurationWidget::environmentWasChanged()
{
EnvironmentAspect *aspect = m_cmakeRunConfiguration->extraAspect<EnvironmentAspect>();
QTC_ASSERT(aspect, return);
m_workingDirectoryEdit->setEnvironment(aspect->environment());
} }
// Factory // Factory

View File

@@ -76,22 +76,16 @@ public:
bool isEnabled() const override; bool isEnabled() const override;
QString disabledReason() const override; QString disabledReason() const override;
signals:
void baseWorkingDirectoryChanged(const QString&);
protected: protected:
CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source); CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source);
virtual bool fromMap(const QVariantMap &map) override; virtual bool fromMap(const QVariantMap &map) override;
QString defaultDisplayName() const; QString defaultDisplayName() const;
private: private:
void setUserWorkingDirectory(const QString &workingDirectory);
QString baseWorkingDirectory() const; QString baseWorkingDirectory() const;
void ctor(); void ctor();
QString m_buildTarget; QString m_buildTarget;
QString m_workingDirectory;
QString m_userWorkingDirectory;
QString m_title; QString m_title;
bool m_enabled; bool m_enabled;
}; };
@@ -99,22 +93,9 @@ private:
class CMakeRunConfigurationWidget : public QWidget class CMakeRunConfigurationWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit CMakeRunConfigurationWidget(CMakeRunConfiguration *cmakeRunConfiguration, QWidget *parent = 0); explicit CMakeRunConfigurationWidget(CMakeRunConfiguration *cmakeRunConfiguration, QWidget *parent = 0);
private slots:
void setWorkingDirectory();
void resetWorkingDirectory();
void environmentWasChanged();
void workingDirectoryChanged(const QString &workingDirectory);
private:
void ctor();
bool m_ignoreChange;
CMakeRunConfiguration *m_cmakeRunConfiguration;
Utils::PathChooser *m_workingDirectoryEdit;
Utils::DetailsWidget *m_detailsContainer;
}; };
class CMakeRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory class CMakeRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory