From 02d86516c7adb26617bb26dbb50e13da3af7882f Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 24 Apr 2023 17:25:13 +0200 Subject: [PATCH] ProjectExplorer: Optionally show run environment in app output pane Fixes: QTCREATORBUG-28427 Change-Id: I1022a377d3728ad5e91fa62514082110b86db9f4 Reviewed-by: hjk Reviewed-by: Qt CI Bot Reviewed-by: --- .../cmakebuildconfiguration.cpp | 1 + .../projectexplorer/environmentaspect.cpp | 3 +++ .../projectexplorer/environmentaspect.h | 7 +++++++ .../environmentaspectwidget.cpp | 9 +++++++++ .../projectexplorer/runconfiguration.cpp | 7 +++++++ .../projectexplorer/runconfiguration.h | 1 + src/plugins/projectexplorer/runcontrol.cpp | 19 +++++++++++++++++-- src/plugins/projectexplorer/runcontrol.h | 1 + 8 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index eebaada63ba..a56564a8c0a 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -2284,6 +2284,7 @@ public: ConfigureEnvironmentAspect::ConfigureEnvironmentAspect(ProjectExplorer::Target *target) { setIsLocal(true); + setAllowPrintOnRun(false); setConfigWidgetCreator( [this, target] { return new ConfigureEnvironmentAspectWidget(this, target); }); addSupportedBaseEnvironment(Tr::tr("Clean Environment"), {}); diff --git a/src/plugins/projectexplorer/environmentaspect.cpp b/src/plugins/projectexplorer/environmentaspect.cpp index 66a2b3bc990..dc3abedbe74 100644 --- a/src/plugins/projectexplorer/environmentaspect.cpp +++ b/src/plugins/projectexplorer/environmentaspect.cpp @@ -12,6 +12,7 @@ using namespace Utils; namespace ProjectExplorer { +const char PRINT_ON_RUN_KEY[] = "PE.EnvironmentAspect.PrintOnRun"; // -------------------------------------------------------------------- // EnvironmentAspect: @@ -105,12 +106,14 @@ void EnvironmentAspect::fromMap(const QVariantMap &map) { m_base = map.value(QLatin1String(BASE_KEY), -1).toInt(); m_userChanges = Utils::EnvironmentItem::fromStringList(map.value(QLatin1String(CHANGES_KEY)).toStringList()); + m_printOnRun = map.value(PRINT_ON_RUN_KEY).toBool(); } void EnvironmentAspect::toMap(QVariantMap &data) const { data.insert(QLatin1String(BASE_KEY), m_base); data.insert(QLatin1String(CHANGES_KEY), Utils::EnvironmentItem::toStringList(m_userChanges)); + data.insert(PRINT_ON_RUN_KEY, m_printOnRun); } QString EnvironmentAspect::currentDisplayName() const diff --git a/src/plugins/projectexplorer/environmentaspect.h b/src/plugins/projectexplorer/environmentaspect.h index 5b1d0d1c41a..9ba2f8a9835 100644 --- a/src/plugins/projectexplorer/environmentaspect.h +++ b/src/plugins/projectexplorer/environmentaspect.h @@ -48,6 +48,10 @@ public: bool isLocal() const { return m_isLocal; } + bool isPrintOnRunAllowed() const { return m_allowPrintOnRun; } + bool isPrintOnRunEnabled() const { return m_printOnRun; } + void setPrintOnRun(bool enabled) { m_printOnRun = enabled; } + struct Data : BaseAspect::Data { Utils::Environment environment; @@ -66,6 +70,7 @@ protected: void toMap(QVariantMap &map) const override; void setIsLocal(bool local) { m_isLocal = local; } + void setAllowPrintOnRun(bool allow) { m_allowPrintOnRun = allow; } static constexpr char BASE_KEY[] = "PE.EnvironmentAspect.Base"; static constexpr char CHANGES_KEY[] = "PE.EnvironmentAspect.Changes"; @@ -84,6 +89,8 @@ private: QList m_baseEnvironments; int m_base = -1; bool m_isLocal = false; + bool m_allowPrintOnRun = true; + bool m_printOnRun = false; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/environmentaspectwidget.cpp b/src/plugins/projectexplorer/environmentaspectwidget.cpp index 18babfcf615..34e48af42c9 100644 --- a/src/plugins/projectexplorer/environmentaspectwidget.cpp +++ b/src/plugins/projectexplorer/environmentaspectwidget.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -63,6 +64,14 @@ EnvironmentAspectWidget::EnvironmentAspectWidget(EnvironmentAspect *aspect) m_environmentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); topLayout->addWidget(m_environmentWidget); + if (m_aspect->isPrintOnRunAllowed()) { + const auto printOnRunCheckBox = new QCheckBox(Tr::tr("Show in output pane when running")); + printOnRunCheckBox->setChecked(m_aspect->isPrintOnRunEnabled()); + connect(printOnRunCheckBox, &QCheckBox::toggled, + m_aspect, &EnvironmentAspect::setPrintOnRun); + topLayout->addWidget(printOnRunCheckBox); + } + connect(m_environmentWidget, &EnvironmentWidget::userChangesChanged, this, &EnvironmentAspectWidget::userChangesEdited); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 928ca9db58d..32740d6c33c 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -298,6 +298,13 @@ CommandLine RunConfiguration::commandLine() const return m_commandLineGetter(); } +bool RunConfiguration::isPrintEnvironmentEnabled() const +{ + if (const auto envAspect = aspect()) + return envAspect->isPrintOnRunEnabled(); + return false; +} + void RunConfiguration::setRunnableModifier(const RunnableModifier &runnableModifier) { m_runnableModifier = runnableModifier; diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 32f61b5a306..a0d83ebb488 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -116,6 +116,7 @@ public: using CommandLineGetter = std::function; void setCommandLineGetter(const CommandLineGetter &cmdGetter); Utils::CommandLine commandLine() const; + bool isPrintEnvironmentEnabled() const; using RunnableModifier = std::function; void setRunnableModifier(const RunnableModifier &extraModifier); diff --git a/src/plugins/projectexplorer/runcontrol.cpp b/src/plugins/projectexplorer/runcontrol.cpp index 96bbc302ac5..b43c7fe3e83 100644 --- a/src/plugins/projectexplorer/runcontrol.cpp +++ b/src/plugins/projectexplorer/runcontrol.cpp @@ -255,9 +255,9 @@ public: // A handle to the actual application process. ProcessHandle applicationProcessHandle; - RunControlState state = RunControlState::Initialized; - QList> m_workers; + RunControlState state = RunControlState::Initialized; + bool printEnvironment = false; }; class RunControlPrivate : public QObject, public RunControlPrivateData @@ -334,6 +334,7 @@ void RunControl::copyDataFromRunConfiguration(RunConfiguration *runConfig) d->buildKey = runConfig->buildKey(); d->settingsData = runConfig->settingsData(); d->aspectData = runConfig->aspectData(); + d->printEnvironment = runConfig->isPrintEnvironmentEnabled(); setTarget(runConfig->target()); @@ -817,6 +818,11 @@ Utils::Id RunControl::runMode() const return d->runMode; } +bool RunControl::isPrintEnvironmentEnabled() const +{ + return d->printEnvironment; +} + const Runnable &RunControl::runnable() const { return d->runnable; @@ -1436,6 +1442,15 @@ void SimpleTargetRunner::start() const QString msg = Tr::tr("Starting %1...").arg(d->m_command.displayName()); appendMessage(msg, NormalMessageFormat); + if (runControl()->isPrintEnvironmentEnabled()) { + appendMessage(Tr::tr("Environment:"), NormalMessageFormat); + runControl()->runnable().environment + .forEachEntry([this](const QString &key, const QString &value, bool enabled) { + if (enabled) + appendMessage(key + '=' + value, StdOutFormat); + }); + appendMessage({}, StdOutFormat); + } const bool isDesktop = !d->m_command.executable().needsDevice(); if (isDesktop && d->m_command.isEmpty()) { diff --git a/src/plugins/projectexplorer/runcontrol.h b/src/plugins/projectexplorer/runcontrol.h index d779b693a84..d33d7071625 100644 --- a/src/plugins/projectexplorer/runcontrol.h +++ b/src/plugins/projectexplorer/runcontrol.h @@ -205,6 +205,7 @@ public: void setupFormatter(Utils::OutputFormatter *formatter) const; Utils::Id runMode() const; + bool isPrintEnvironmentEnabled() const; const Runnable &runnable() const;