From e755094480b1775c2b7b794766a8170ae03c85f6 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 16 Nov 2020 16:40:12 +0100 Subject: [PATCH] Add option for globally changing the base environment for tools Fixes: QTCREATORBUG-22123 Change-Id: I00a5bbdf92e5dab513cb12f3518a2abb1adbb9cd Reviewed-by: Christian Kandeler Reviewed-by: Leena Miettinen --- src/libs/utils/environment.cpp | 5 + src/libs/utils/environment.h | 1 + src/plugins/coreplugin/coreplugin.cpp | 34 ++ src/plugins/coreplugin/coreplugin.h | 8 + src/plugins/coreplugin/icore.h | 1 + src/plugins/coreplugin/systemsettings.cpp | 28 + src/plugins/coreplugin/systemsettings.ui | 510 ++++++++++-------- .../projectexplorer/buildconfiguration.cpp | 3 + 8 files changed, 370 insertions(+), 220 deletions(-) diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 56f60307362..df61ac61b5f 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -313,6 +313,11 @@ void Environment::modifySystemEnvironment(const EnvironmentItems &list) staticSystemEnvironment->modify(list); } +void Environment::setSystemEnvironment(const Environment &environment) +{ + *staticSystemEnvironment = environment; +} + /** Expand environment variables in a string. * * Environment variables are accepted in the following forms: diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index 7596a708eb4..b182100d6f0 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -82,6 +82,7 @@ public: QStringList expandVariables(const QStringList &input) const; static void modifySystemEnvironment(const EnvironmentItems &list); // use with care!!! + static void setSystemEnvironment(const Environment &environment); // don't use at all!!! private: FilePath searchInDirectory(const QStringList &execs, const FilePath &directory, diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 395861101c0..937e18c7649 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -75,6 +75,16 @@ using namespace Utils; static CorePlugin *m_instance = nullptr; +const char kEnvironmentChanges[] = "Core/EnvironmentChanges"; + +void CorePlugin::setupSystemEnvironment() +{ + m_instance->m_startupSystemEnvironment = Environment::systemEnvironment(); + const EnvironmentItems changes = EnvironmentItem::fromStringList( + ICore::settings()->value(kEnvironmentChanges).toStringList()); + setEnvironmentChanges(changes); +} + CorePlugin::CorePlugin() { qRegisterMetaType(); @@ -82,6 +92,7 @@ CorePlugin::CorePlugin() qRegisterMetaType(); qRegisterMetaType(); m_instance = this; + setupSystemEnvironment(); } CorePlugin::~CorePlugin() @@ -266,6 +277,29 @@ QObject *CorePlugin::remoteCommand(const QStringList & /* options */, return res; } +Environment CorePlugin::startupSystemEnvironment() +{ + return m_instance->m_startupSystemEnvironment; +} + +EnvironmentItems CorePlugin::environmentChanges() +{ + return m_instance->m_environmentChanges; +} + +void CorePlugin::setEnvironmentChanges(const EnvironmentItems &changes) +{ + if (m_instance->m_environmentChanges == changes) + return; + m_instance->m_environmentChanges = changes; + Environment systemEnv = m_instance->m_startupSystemEnvironment; + systemEnv.modify(changes); + Environment::setSystemEnvironment(systemEnv); + ICore::settings()->setValue(kEnvironmentChanges, EnvironmentItem::toStringList(changes)); + if (ICore::instance()) + emit ICore::instance()->systemEnvironmentChanged(); +} + void CorePlugin::fileOpenRequest(const QString &f) { remoteCommand(QStringList(), QString(), QStringList(f)); diff --git a/src/plugins/coreplugin/coreplugin.h b/src/plugins/coreplugin/coreplugin.h index 596b84e4379..75097510ff0 100644 --- a/src/plugins/coreplugin/coreplugin.h +++ b/src/plugins/coreplugin/coreplugin.h @@ -29,6 +29,7 @@ #include "reaper_p.h" #include +#include QT_BEGIN_NAMESPACE class QMenu; @@ -64,6 +65,10 @@ public: const QString &workingDirectory, const QStringList &args) override; + static Utils::Environment startupSystemEnvironment(); + static Utils::EnvironmentItems environmentChanges(); + static void setEnvironmentChanges(const Utils::EnvironmentItems &changes); + public slots: void fileOpenRequest(const QString&); @@ -82,12 +87,15 @@ private slots: private: static void addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QMenu *menu); + void setupSystemEnvironment(); void checkSettings(); MainWindow *m_mainWindow = nullptr; EditMode *m_editMode = nullptr; Locator *m_locator = nullptr; ProcessReapers m_reaper; + Utils::Environment m_startupSystemEnvironment; + Utils::EnvironmentItems m_environmentChanges; }; } // namespace Internal diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h index 3b012018c6d..0dda6a90a7b 100644 --- a/src/plugins/coreplugin/icore.h +++ b/src/plugins/coreplugin/icore.h @@ -148,6 +148,7 @@ signals: void coreAboutToClose(); void contextAboutToChange(const QList &context); void contextChanged(const Core::Context &context); + void systemEnvironmentChanged(); public: /* internal use */ diff --git a/src/plugins/coreplugin/systemsettings.cpp b/src/plugins/coreplugin/systemsettings.cpp index 109ce4fc9fe..a3586393e36 100644 --- a/src/plugins/coreplugin/systemsettings.cpp +++ b/src/plugins/coreplugin/systemsettings.cpp @@ -25,6 +25,7 @@ #include "systemsettings.h" #include "coreconstants.h" +#include "coreplugin.h" #include "editormanager/editormanager_p.h" #include "fileutils.h" #include "icore.h" @@ -37,6 +38,7 @@ #include #include #include +#include #include #include @@ -153,6 +155,20 @@ public: updatePath(); + m_ui.environmentChangesLabel->setElideMode(Qt::ElideRight); + m_environmentChanges = CorePlugin::environmentChanges(); + updateEnvironmentChangesLabel(); + connect(m_ui.environmentButton, &QPushButton::clicked, [this] { + Utils::optional changes + = Utils::EnvironmentDialog::getEnvironmentItems(m_ui.environmentButton, + m_environmentChanges); + if (!changes) + return; + m_environmentChanges = *changes; + updateEnvironmentChangesLabel(); + updatePath(); + }); + connect(VcsManager::instance(), &VcsManager::configurationChanged, this, &SystemSettingsWidget::updatePath); } @@ -165,10 +181,12 @@ private: void resetTerminal(); void updateTerminalUi(const Utils::TerminalCommand &term); void updatePath(); + void updateEnvironmentChangesLabel(); void variableHelpDialogCreator(const QString &helpText); Ui::SystemSettings m_ui; QPointer m_dialog; + EnvironmentItems m_environmentChanges; }; void SystemSettingsWidget::apply() @@ -206,6 +224,8 @@ void SystemSettingsWidget::apply() else HostOsInfo::setOverrideFileNameCaseSensitivity(selectedSensitivity); } + + CorePlugin::setEnvironmentChanges(m_environmentChanges); } void SystemSettingsWidget::resetTerminal() @@ -235,6 +255,14 @@ void SystemSettingsWidget::updatePath() m_ui.patchChooser->setEnvironment(env); } +void SystemSettingsWidget::updateEnvironmentChangesLabel() +{ + const QString shortSummary = Utils::EnvironmentItem::toStringList(m_environmentChanges) + .join("; "); + m_ui.environmentChangesLabel->setText(shortSummary.isEmpty() ? tr("No changes to apply.") + : shortSummary); +} + void SystemSettingsWidget::variableHelpDialogCreator(const QString &helpText) { if (m_dialog) { diff --git a/src/plugins/coreplugin/systemsettings.ui b/src/plugins/coreplugin/systemsettings.ui index 1e9a2f9d857..3cb48bd9354 100644 --- a/src/plugins/coreplugin/systemsettings.ui +++ b/src/plugins/coreplugin/systemsettings.ui @@ -17,112 +17,7 @@ System - - - - Terminal: - - - - - - - - - - 3 - 0 - - - - - 100 - 0 - - - - true - - - - - - - - - - Command line arguments used for "Run in terminal". - - - - - - - Reset to default. - - - Reset - - - - - - - - - External file browser: - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - Reset to default. - - - Reset - - - - - - - ? - - - - - - - - - - Patch command: - - - - - - - + Influences how file names are matched to decide if they are the same. @@ -132,7 +27,20 @@ - + + + + Automatically free resources of old documents that are not visible and not modified. They stay visible in the list of open documents. + + + Auto-suspend unmodified files + + + true + + + + @@ -166,110 +74,14 @@ - - + + - When files are externally modified: + Terminal: - - - - - - 0 - - - - Always Ask - - - - - Reload All Unchanged Editors - - - - - Ignore Modifications - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Auto-save modified files - - - true - - - - - - - - - Interval: - - - - - - - min - - - 1 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Automatically free resources of old documents that are not visible and not modified. They stay visible in the list of open documents. - - - Auto-suspend unmodified files - - - true - - - - + @@ -309,7 +121,95 @@ - + + + + Maximum number of entries in "Recent Files": + + + + + + + Auto-save modified files + + + true + + + + + + + When files are externally modified: + + + + + + + External file browser: + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Interval: + + + + + + + min + + + 1 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + @@ -352,20 +252,32 @@ - - - - Maximum number of entries in "Recent Files": - - - - - + + - + + + 0 + + + + Always Ask + + + + + Reload All Unchanged Editors + + + + + Ignore Modifications + + + - + Qt::Horizontal @@ -379,7 +291,14 @@ - + + + + Patch command: + + + + @@ -390,6 +309,152 @@ + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + Reset to default. + + + Reset + + + + + + + ? + + + + + + + + + + Environment: + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 3 + 0 + + + + + 100 + 0 + + + + true + + + + + + + + + + Command line arguments used for "Run in terminal". + + + + + + + Reset to default. + + + Reset + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 5 + 0 + + + + + + + + + + + + 0 + 0 + + + + Change... + + + + + + @@ -419,6 +484,11 @@ browsingFinished() + + Utils::ElidingLabel + QLabel +
utils/elidinglabel.h
+
resetTerminalButton diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 84935ded478..750b1363a47 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -45,6 +45,7 @@ #include "target.h" #include "toolchain.h" +#include #include #include @@ -188,6 +189,8 @@ BuildConfiguration::BuildConfiguration(Target *target, Utils::Id id) [this](const QString &var) { return environment().expandedValueForKey(var); }); updateCacheAndEmitEnvironmentChanged(); + connect(Core::ICore::instance(), &Core::ICore::systemEnvironmentChanged, + this, &BuildConfiguration::updateCacheAndEmitEnvironmentChanged); connect(target, &Target::kitChanged, this, &BuildConfiguration::updateCacheAndEmitEnvironmentChanged); connect(this, &BuildConfiguration::environmentChanged,