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); }