From 8c0037af5233ff2e7b2e3e546ec25f0de231adda Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 12 Mar 2019 15:19:56 +0100 Subject: [PATCH] ProjectExplorer: Let user provide default for "run in terminal" We enable the "Run in terminal" checkbox for all applications that declare themselves console apps, but that's not necessarily what the user wants. So let them opt out of this mechanism via a global setting. [ChangeLog] There now is a global setting for "Run in terminal". Change-Id: Ieeed72fdd01144d9aec0a7c7d4a12b9e5a94cd1d Reviewed-by: Joerg Bornemann Reviewed-by: Leena Miettinen Reviewed-by: hjk --- .../cmakerunconfiguration.cpp | 3 +- .../projectexplorer/projectexplorer.cpp | 6 + .../projectexplorer/projectexplorersettings.h | 4 + .../projectexplorersettingspage.cpp | 2 + .../projectexplorersettingspage.ui | 267 ++++++++++-------- .../runconfigurationaspects.cpp | 29 +- .../projectexplorer/runconfigurationaspects.h | 5 +- .../qbsprojectmanager/qbsrunconfiguration.cpp | 3 +- .../desktopqmakerunconfiguration.cpp | 3 +- 9 files changed, 199 insertions(+), 123 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index 66a307e6c91..f9184d6e5ce 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -84,8 +84,7 @@ void CMakeRunConfiguration::updateTargetInformation() aspect()->buildEnvironmentHasChanged(); auto terminalAspect = aspect(); - if (!terminalAspect->isUserSet()) - terminalAspect->setUseTerminal(bti.usesTerminal); + terminalAspect->setUseTerminalHint(bti.usesTerminal); } // Factory diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 5d7d296e70d..667fd6323d6 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -246,6 +246,8 @@ const char PROJECT_OPEN_LOCATIONS_CONTEXT_MENU[] = "Project.P.OpenLocation.CtxM const char DEFAULT_BUILD_DIRECTORY_TEMPLATE[] = "../%{JS: Util.asciify(\"build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}\")}"; const char DEFAULT_BUILD_DIRECTORY_TEMPLATE_KEY[] = "Directories/BuildDirectory.Template"; +const char TERMINAL_MODE_SETTINGS_KEY[] = "ProjectExplorer/Settings/TerminalMode"; + } // namespace Constants @@ -1325,6 +1327,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er if (tmp < 0 || tmp > ProjectExplorerSettings::StopSameBuildDir) tmp = Utils::HostOsInfo::isWindowsHost() ? 1 : 0; dd->m_projectExplorerSettings.stopBeforeBuild = ProjectExplorerSettings::StopBeforeBuild(tmp); + dd->m_projectExplorerSettings.terminalMode = static_cast(s->value( + Constants::TERMINAL_MODE_SETTINGS_KEY, int(TerminalMode::Smart)).toInt()); dd->m_projectExplorerSettings.buildDirectoryTemplate = s->value(Constants::DEFAULT_BUILD_DIRECTORY_TEMPLATE_KEY).toString(); if (dd->m_projectExplorerSettings.buildDirectoryTemplate.isEmpty()) @@ -1908,6 +1912,8 @@ void ProjectExplorerPluginPrivate::savePersistentSettings() s->setValue(QLatin1String("ProjectExplorer/Settings/AutoRestoreLastSession"), dd->m_projectExplorerSettings.autorestoreLastSession); s->setValue(QLatin1String("ProjectExplorer/Settings/AddLibraryPathsToRunEnv"), dd->m_projectExplorerSettings.addLibraryPathsToRunEnv); s->setValue(QLatin1String("ProjectExplorer/Settings/PromptToStopRunControl"), dd->m_projectExplorerSettings.prompToStopRunControl); + s->setValue(Constants::TERMINAL_MODE_SETTINGS_KEY, + int(dd->m_projectExplorerSettings.terminalMode)); s->setValue(QLatin1String("ProjectExplorer/Settings/AutomaticallyCreateRunConfigurations"), dd->m_projectExplorerSettings.automaticallyCreateRunConfigurations); s->setValue(QLatin1String("ProjectExplorer/Settings/EnvironmentId"), dd->m_projectExplorerSettings.environmentId.toByteArray()); diff --git a/src/plugins/projectexplorer/projectexplorersettings.h b/src/plugins/projectexplorer/projectexplorersettings.h index f0ddf6fa112..b6a18926bef 100644 --- a/src/plugins/projectexplorer/projectexplorersettings.h +++ b/src/plugins/projectexplorer/projectexplorersettings.h @@ -33,6 +33,8 @@ namespace ProjectExplorer { namespace Internal { +enum class TerminalMode { On, Off, Smart }; + class ProjectExplorerSettings { public: @@ -47,6 +49,7 @@ public: bool automaticallyCreateRunConfigurations = true; bool addLibraryPathsToRunEnv = true; StopBeforeBuild stopBeforeBuild = StopBeforeBuild::StopNone; + TerminalMode terminalMode = TerminalMode::Smart; QString buildDirectoryTemplate; // Add a UUid which is used to identify the development environment. @@ -67,6 +70,7 @@ inline bool operator==(const ProjectExplorerSettings &p1, const ProjectExplorerS && p1.addLibraryPathsToRunEnv == p2.addLibraryPathsToRunEnv && p1.environmentId == p2.environmentId && p1.stopBeforeBuild == p2.stopBeforeBuild + && p1.terminalMode == p2.terminalMode && p1.buildDirectoryTemplate == p2.buildDirectoryTemplate; } diff --git a/src/plugins/projectexplorer/projectexplorersettingspage.cpp b/src/plugins/projectexplorer/projectexplorersettingspage.cpp index 8f2ea84986f..6ee8e4063c8 100644 --- a/src/plugins/projectexplorer/projectexplorersettingspage.cpp +++ b/src/plugins/projectexplorer/projectexplorersettingspage.cpp @@ -105,6 +105,7 @@ ProjectExplorerSettings ProjectExplorerSettingsWidget::settings() const m_settings.prompToStopRunControl = m_ui.promptToStopRunControlCheckBox->isChecked(); m_settings.automaticallyCreateRunConfigurations = m_ui.automaticallyCreateRunConfiguration->isChecked(); m_settings.stopBeforeBuild = static_cast(m_ui.stopBeforeBuildComboBox->currentIndex()); + m_settings.terminalMode = static_cast(m_ui.terminalModeComboBox->currentIndex()); m_settings.buildDirectoryTemplate = buildDirectoryTemplate(); return m_settings; } @@ -120,6 +121,7 @@ void ProjectExplorerSettingsWidget::setSettings(const ProjectExplorerSettings & m_ui.promptToStopRunControlCheckBox->setChecked(m_settings.prompToStopRunControl); m_ui.automaticallyCreateRunConfiguration->setChecked(m_settings.automaticallyCreateRunConfigurations); m_ui.stopBeforeBuildComboBox->setCurrentIndex(static_cast(m_settings.stopBeforeBuild)); + m_ui.terminalModeComboBox->setCurrentIndex(static_cast(m_settings.terminalMode)); setBuildDirectoryTemplate(pes.buildDirectoryTemplate); } diff --git a/src/plugins/projectexplorer/projectexplorersettingspage.ui b/src/plugins/projectexplorer/projectexplorersettingspage.ui index 1f9239e789b..6652854ef1d 100644 --- a/src/plugins/projectexplorer/projectexplorersettingspage.ui +++ b/src/plugins/projectexplorer/projectexplorersettingspage.ui @@ -6,8 +6,8 @@ 0 0 - 963 - 564 + 987 + 684 @@ -51,8 +51,54 @@ Build and Run - - + + + + + Save all files before build + + + + + + + Always build project before deploying it + + + + + + + Always deploy project before running it + + + + + + + Add linker library search paths to run environment + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Asks before terminating the running application in response to clicking the stop button in Application Output. @@ -62,7 +108,112 @@ - + + + + Creates suitable run configurations automatically when setting up a new kit. + + + Create suitable run configurations automatically + + + + + + + + + Stop applications before building: + + + + + + + + + + None + + + + + Same Project + + + + + All + + + + + Same Build Directory + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Default for "Run in terminal": + + + + + + + + + + Enabled + + + + + Disabled + + + + + Deduced From Project + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 @@ -95,72 +246,7 @@ - - - - - - Stop applications before building: - - - - - - - - None - - - - - Same Project - - - - - All - - - - - Same Build Directory - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Add linker library search paths to run environment - - - - - - - Creates suitable run configurations automatically when setting up a new kit. - - - Create suitable run configurations automatically - - - - + 12 @@ -184,45 +270,6 @@ - - - - Always build project before deploying it - - - - - - - Save all files before build - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - Always deploy project before running it - - - widget_1 automaticallyCreateRunConfiguration diff --git a/src/plugins/projectexplorer/runconfigurationaspects.cpp b/src/plugins/projectexplorer/runconfigurationaspects.cpp index 06aa1e583ed..74428b4e086 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/runconfigurationaspects.cpp @@ -56,6 +56,9 @@ TerminalAspect::TerminalAspect() setDisplayName(tr("Terminal")); setId("TerminalAspect"); setSettingsKey("RunConfiguration.UseTerminal"); + calculateUseTerminal(); + connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged, + this, &TerminalAspect::calculateUseTerminal); } void TerminalAspect::addToConfigurationLayout(QFormLayout *layout) @@ -90,13 +93,16 @@ void TerminalAspect::toMap(QVariantMap &data) const data.insert(settingsKey(), m_useTerminal); } -bool TerminalAspect::useTerminal() const -{ - return m_useTerminal; -} - -void TerminalAspect::setUseTerminal(bool useTerminal) +void TerminalAspect::calculateUseTerminal() { + if (m_userSet) + return; + bool useTerminal; + switch (ProjectExplorerPlugin::projectExplorerSettings().terminalMode) { + case Internal::TerminalMode::On: useTerminal = true; break; + case Internal::TerminalMode::Off: useTerminal = false; break; + case Internal::TerminalMode::Smart: useTerminal = m_useTerminalHint; + } if (m_useTerminal != useTerminal) { m_useTerminal = useTerminal; emit changed(); @@ -105,6 +111,17 @@ void TerminalAspect::setUseTerminal(bool useTerminal) m_checkBox->setChecked(m_useTerminal); } +bool TerminalAspect::useTerminal() const +{ + return m_useTerminal; +} + +void TerminalAspect::setUseTerminalHint(bool hint) +{ + m_useTerminalHint = hint; + calculateUseTerminal(); +} + bool TerminalAspect::isUserSet() const { return m_userSet; diff --git a/src/plugins/projectexplorer/runconfigurationaspects.h b/src/plugins/projectexplorer/runconfigurationaspects.h index be40af6d292..659138710d8 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.h +++ b/src/plugins/projectexplorer/runconfigurationaspects.h @@ -46,7 +46,7 @@ public: void addToConfigurationLayout(QFormLayout *layout) override; bool useTerminal() const; - void setUseTerminal(bool useTerminal); + void setUseTerminalHint(bool useTerminal); bool isUserSet() const; @@ -54,6 +54,9 @@ private: void fromMap(const QVariantMap &map) override; void toMap(QVariantMap &map) const override; + void calculateUseTerminal(); + + bool m_useTerminalHint = false; bool m_useTerminal = false; bool m_userSet = false; QPointer m_checkBox; // Owned by RunConfigWidget diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 5a2c32ecae3..09312bca79e 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -145,8 +145,7 @@ void QbsRunConfiguration::updateTargetInformation() BuildTargetInfo bti = buildTargetInfo(); const FileName executable = executableToRun(bti); auto terminalAspect = aspect(); - if (!terminalAspect->isUserSet()) - terminalAspect->setUseTerminal(bti.usesTerminal); + terminalAspect->setUseTerminalHint(bti.usesTerminal); aspect()->setExecutable(executable); diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp index 81c79c4d9b8..0cb01cf15a3 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp @@ -107,8 +107,7 @@ void DesktopQmakeRunConfiguration::updateTargetInformation() wda->pathChooser()->setBaseFileName(target()->project()->projectDirectory()); auto terminalAspect = aspect(); - if (!terminalAspect->isUserSet()) - terminalAspect->setUseTerminal(bti.usesTerminal); + terminalAspect->setUseTerminalHint(bti.usesTerminal); aspect()->setExecutable(bti.targetFilePath); }