From ad48f2639c80ece9b8a271a8809d44561177995a Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 9 Nov 2020 15:57:47 +0100 Subject: [PATCH] ProjectExplorer: Consider build environment ... in "Open Terminal Here" action in the build configuration. Change-Id: I0b1b15d4f1097cf48eb5a977f2ca5951b2f78377 Reviewed-by: hjk --- src/libs/utils/aspects.cpp | 9 +++++++++ src/libs/utils/aspects.h | 2 ++ src/libs/utils/pathchooser.cpp | 11 +++++++++++ src/libs/utils/pathchooser.h | 3 +++ src/plugins/coreplugin/coreplugin.cpp | 5 ++++- src/plugins/projectexplorer/buildaspects.cpp | 8 +++++++- src/plugins/projectexplorer/buildaspects.h | 3 ++- src/plugins/projectexplorer/buildconfiguration.cpp | 2 +- 8 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 23bdb989f7c..4a42c1086d1 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -278,6 +278,7 @@ public: FilePath m_baseFileName; StringAspect::ValueAcceptor m_valueAcceptor; FancyLineEdit::ValidationFunction m_validator; + std::function m_openTerminal; bool m_readOnly = false; bool m_undoRedoEnabled = false; @@ -613,6 +614,13 @@ void StringAspect::setValidationFunction(const FancyLineEdit::ValidationFunction d->m_lineEditDisplay->setValidationFunction(d->m_validator); } +void StringAspect::setOpenTerminalHandler(const std::function &openTerminal) +{ + d->m_openTerminal = openTerminal; + if (d->m_pathChooserDisplay) + d->m_pathChooserDisplay->setOpenTerminalHandler(openTerminal); +} + void StringAspect::validateInput() { if (d->m_pathChooserDisplay) @@ -667,6 +675,7 @@ void StringAspect::addToLayout(LayoutBuilder &builder) this, &StringAspect::setValue); builder.addItem(d->m_pathChooserDisplay.data()); d->m_pathChooserDisplay->setFileDialogOnly(d->m_fileDialogOnly); + d->m_pathChooserDisplay->setOpenTerminalHandler(d->m_openTerminal); break; case LineEditDisplay: d->m_lineEditDisplay = new FancyLineEdit; diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index dc6e640c281..28a49c855f5 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -32,6 +32,7 @@ #include "optional.h" #include "pathchooser.h" +#include #include namespace Utils { @@ -235,6 +236,7 @@ public: void setUndoRedoEnabled(bool readOnly); void setMacroExpanderProvider(const Utils::MacroExpanderProvider &expanderProvider); void setValidationFunction(const Utils::FancyLineEdit::ValidationFunction &validator); + void setOpenTerminalHandler(const std::function &openTerminal); void validateInput(); diff --git a/src/libs/utils/pathchooser.cpp b/src/libs/utils/pathchooser.cpp index 594a8342460..3ee14ab466c 100644 --- a/src/libs/utils/pathchooser.cpp +++ b/src/libs/utils/pathchooser.cpp @@ -195,6 +195,7 @@ public: BinaryVersionToolTipEventFilter *m_binaryVersionToolTipEventFilter = nullptr; QList m_buttons; MacroExpander *m_macroExpander = globalMacroExpander(); + std::function m_openTerminal; bool m_isReadOnly = false; bool m_isFileDialogOnly = false; @@ -522,6 +523,16 @@ void PathChooser::setAboutToShowContextMenuHandler(PathChooser::AboutToShowConte s_aboutToShowContextMenuHandler = handler; } +void PathChooser::setOpenTerminalHandler(const std::function &openTerminal) +{ + d->m_openTerminal = openTerminal; +} + +std::function PathChooser::openTerminalHandler() const +{ + return d->m_openTerminal; +} + void PathChooser::setDefaultValue(const QString &defaultValue) { d->m_defaultValue = defaultValue; diff --git a/src/libs/utils/pathchooser.h b/src/libs/utils/pathchooser.h index b7320d6c5d3..75625691808 100644 --- a/src/libs/utils/pathchooser.h +++ b/src/libs/utils/pathchooser.h @@ -148,6 +148,9 @@ public: using AboutToShowContextMenuHandler = std::function; static void setAboutToShowContextMenuHandler(AboutToShowContextMenuHandler handler); + void setOpenTerminalHandler(const std::function &openTerminal); + std::function openTerminalHandler() const; + // Deprecated. Use filePath().toString() or better suitable conversions. QString path() const { return filePath().toString(); } // Deprecated. Use filePath() diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index b2a61550777..68fc94db9a1 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -285,7 +285,10 @@ void CorePlugin::addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QM auto *showInTerminal = new QAction(Core::FileUtils::msgTerminalHereAction(), menu); connect(showInTerminal, &QAction::triggered, pathChooser, [pathChooser]() { - Core::FileUtils::openTerminal(pathChooser->filePath().toString()); + if (pathChooser->openTerminalHandler()) + pathChooser->openTerminalHandler()(); + else + FileUtils::openTerminal(pathChooser->filePath().toString()); }); menu->insertAction(firstAction, showInTerminal); diff --git a/src/plugins/projectexplorer/buildaspects.cpp b/src/plugins/projectexplorer/buildaspects.cpp index f9aa281e2e9..f3a84246124 100644 --- a/src/plugins/projectexplorer/buildaspects.cpp +++ b/src/plugins/projectexplorer/buildaspects.cpp @@ -25,9 +25,12 @@ #include "buildaspects.h" +#include "buildconfiguration.h" #include "buildpropertiessettings.h" #include "projectexplorer.h" +#include + #include #include #include @@ -47,12 +50,15 @@ public: QPointer problemLabel; }; -BuildDirectoryAspect::BuildDirectoryAspect() : d(new Private) +BuildDirectoryAspect::BuildDirectoryAspect(const BuildConfiguration *bc) : d(new Private) { setSettingsKey("ProjectExplorer.BuildConfiguration.BuildDirectory"); setLabelText(tr("Build directory:")); setDisplayStyle(PathChooserDisplay); setExpectedKind(Utils::PathChooser::Directory); + setOpenTerminalHandler([this, bc] { + Core::FileUtils::openTerminal(value(), bc->environment()); + }); } BuildDirectoryAspect::~BuildDirectoryAspect() diff --git a/src/plugins/projectexplorer/buildaspects.h b/src/plugins/projectexplorer/buildaspects.h index a40e27009b7..978fcd2e616 100644 --- a/src/plugins/projectexplorer/buildaspects.h +++ b/src/plugins/projectexplorer/buildaspects.h @@ -32,12 +32,13 @@ namespace Utils { class FilePath; } namespace ProjectExplorer { +class BuildConfiguration; class PROJECTEXPLORER_EXPORT BuildDirectoryAspect : public Utils::StringAspect { Q_OBJECT public: - BuildDirectoryAspect(); + explicit BuildDirectoryAspect(const BuildConfiguration *bc); ~BuildDirectoryAspect() override; void allowInSourceBuilds(const Utils::FilePath &sourceDir); diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index ad0723ac08f..1733ac9236c 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -197,7 +197,7 @@ BuildConfiguration::BuildConfiguration(Target *target, Utils::Id id) connect(ProjectTree::instance(), &ProjectTree::currentProjectChanged, this, &BuildConfiguration::updateCacheAndEmitEnvironmentChanged); - d->m_buildDirectoryAspect = addAspect(); + d->m_buildDirectoryAspect = addAspect(this); d->m_buildDirectoryAspect->setBaseFileName(target->project()->projectDirectory()); d->m_buildDirectoryAspect->setEnvironment(environment()); d->m_buildDirectoryAspect->setMacroExpanderProvider([this] { return macroExpander(); });