From 4750969c2b0c5574ed4d4ae23d5c69b5d97e1a87 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 13 Sep 2019 10:49:14 +0200 Subject: ClangTools: Move run settings to projects mode Make the global run settings available per project in project mode and thus remove the diagnostic config selection from the selectable-files-dialog: * Extract the classes RunSettings and RunSettingsWidget instead of duplicating stuff. * Ensure to pick up the old settings * Add some convenience buttons/links in projects mode allowing to restore the global settings, to open the global settings and to navigate (back) to the analyzer mode. Change-Id: I1b91b6f8e58a87a025774e4643c46e176b2a8885 Reviewed-by: Cristian Adam Reviewed-by: Nikolai Kosjar --- src/plugins/clangtools/CMakeLists.txt | 1 + .../clangtools/clangselectablefilesdialog.cpp | 54 ------ .../clangtools/clangselectablefilesdialog.ui | 67 +------- src/plugins/clangtools/clangtidyclazytool.cpp | 28 +--- src/plugins/clangtools/clangtidyclazytool.h | 2 + src/plugins/clangtools/clangtoolruncontrol.cpp | 32 ++-- src/plugins/clangtools/clangtoolruncontrol.h | 13 +- src/plugins/clangtools/clangtools.pro | 3 + src/plugins/clangtools/clangtools.qbs | 3 + src/plugins/clangtools/clangtoolsplugin.cpp | 13 +- .../clangtools/clangtoolsprojectsettings.cpp | 87 ++++++---- src/plugins/clangtools/clangtoolsprojectsettings.h | 16 +- .../clangtools/clangtoolsprojectsettingswidget.cpp | 46 ++++++ .../clangtools/clangtoolsprojectsettingswidget.h | 2 + .../clangtools/clangtoolsprojectsettingswidget.ui | 134 ++++++++++----- src/plugins/clangtools/clangtoolssettings.cpp | 182 ++++++++------------- src/plugins/clangtools/clangtoolssettings.h | 66 ++++---- src/plugins/clangtools/clangtoolsunittests.cpp | 13 +- src/plugins/clangtools/runsettingswidget.cpp | 87 ++++++++++ src/plugins/clangtools/runsettingswidget.h | 58 +++++++ src/plugins/clangtools/runsettingswidget.ui | 93 +++++++++++ src/plugins/clangtools/settingswidget.cpp | 60 ++----- src/plugins/clangtools/settingswidget.h | 3 + src/plugins/clangtools/settingswidget.ui | 61 +------ 24 files changed, 623 insertions(+), 501 deletions(-) create mode 100644 src/plugins/clangtools/runsettingswidget.cpp create mode 100644 src/plugins/clangtools/runsettingswidget.h create mode 100644 src/plugins/clangtools/runsettingswidget.ui diff --git a/src/plugins/clangtools/CMakeLists.txt b/src/plugins/clangtools/CMakeLists.txt index 93195bdfb9..fe34b67948 100644 --- a/src/plugins/clangtools/CMakeLists.txt +++ b/src/plugins/clangtools/CMakeLists.txt @@ -29,6 +29,7 @@ add_qtc_plugin(ClangTools clangtoolsprojectsettingswidget.cpp clangtoolsprojectsettingswidget.h clangtoolsprojectsettingswidget.ui clangtoolssettings.cpp clangtoolssettings.h clangtoolsutils.cpp clangtoolsutils.h + runsettingswidget.cpp runsettingswidget.h runsettingswidget.ui settingswidget.cpp settingswidget.h settingswidget.ui ) diff --git a/src/plugins/clangtools/clangselectablefilesdialog.cpp b/src/plugins/clangtools/clangselectablefilesdialog.cpp index c9fce5552f..6541ca46bc 100644 --- a/src/plugins/clangtools/clangselectablefilesdialog.cpp +++ b/src/plugins/clangtools/clangselectablefilesdialog.cpp @@ -266,16 +266,6 @@ private: } }; -enum { GlobalSettings , CustomSettings }; - -static Core::Id diagnosticConfiguration(ClangToolsProjectSettings *settings) -{ - Core::Id id = settings->diagnosticConfig(); - if (id.isValid()) - return id; - return ClangToolsSettings::instance()->savedDiagnosticConfigId(); -} - SelectableFilesDialog::SelectableFilesDialog(const ProjectInfo &projectInfo, const FileInfos &allFileInfos) : QDialog(nullptr) @@ -292,36 +282,7 @@ SelectableFilesDialog::SelectableFilesDialog(const ProjectInfo &projectInfo, m_ui->buttons->setStandardButtons(QDialogButtonBox::Cancel); m_ui->buttons->addButton(m_analyzeButton, QDialogButtonBox::AcceptRole); - CppTools::ClangDiagnosticConfigsSelectionWidget *diagnosticWidget = m_ui->diagnosticWidget; - ClangToolsProjectSettings *settings = ClangToolsProjectSettingsManager::getSettings(m_project); - m_customDiagnosticConfig = diagnosticConfiguration(settings); - - if (settings->useGlobalSettings()) { - m_ui->globalOrCustom->setCurrentIndex(GlobalSettings); - diagnosticWidget->refresh(ClangToolsSettings::instance()->savedDiagnosticConfigId()); - diagnosticWidget->setEnabled(false); - } else { - m_ui->globalOrCustom->setCurrentIndex(CustomSettings); - diagnosticWidget->refresh(m_customDiagnosticConfig); - diagnosticWidget->setEnabled(true); - } - - connect(m_ui->globalOrCustom, - QOverload::of(&QComboBox::currentIndexChanged), - [=](int index){ - diagnosticWidget->setEnabled(index == CustomSettings); - if (index == CustomSettings) - diagnosticWidget->refresh(m_customDiagnosticConfig); - else - diagnosticWidget->refresh(ClangToolsSettings::instance()->savedDiagnosticConfigId()); - }); - connect(diagnosticWidget, - &ClangDiagnosticConfigsSelectionWidget::currentConfigChanged, - [this](const Core::Id ¤tConfigId) { - if (m_ui->globalOrCustom->currentIndex() == CustomSettings) - m_customDiagnosticConfig = currentConfigId; - }); // Restore selection if (settings->selectedDirs().isEmpty() && settings->selectedFiles().isEmpty()) @@ -333,16 +294,6 @@ SelectableFilesDialog::SelectableFilesDialog(const ProjectInfo &projectInfo, connect(m_filesModel.get(), &QAbstractItemModel::dataChanged, [this]() { m_analyzeButton->setEnabled(m_filesModel->hasCheckedFiles()); }); - - connect(CppTools::codeModelSettings().data(), &CppTools::CppCodeModelSettings::changed, - this, [=]() { - if (m_ui->globalOrCustom->currentIndex() == CustomSettings) { - diagnosticWidget->refresh(m_customDiagnosticConfig); - } else { - diagnosticWidget->refresh( - ClangToolsSettings::instance()->savedDiagnosticConfigId()); - } - }); } SelectableFilesDialog::~SelectableFilesDialog() = default; @@ -356,11 +307,6 @@ void SelectableFilesDialog::accept() { ClangToolsProjectSettings *settings = ClangToolsProjectSettingsManager::getSettings(m_project); - // Save diagnostic configuration - settings->setUseGlobalSettings(m_ui->globalOrCustom->currentIndex() == GlobalSettings); - settings->setDiagnosticConfig(m_customDiagnosticConfig); - - // Save file selection QSet checkedDirs; QSet checkedFiles; m_filesModel->minimalSelection(checkedDirs, checkedFiles); diff --git a/src/plugins/clangtools/clangselectablefilesdialog.ui b/src/plugins/clangtools/clangselectablefilesdialog.ui index 267b36364a..834f3fc189 100644 --- a/src/plugins/clangtools/clangselectablefilesdialog.ui +++ b/src/plugins/clangtools/clangselectablefilesdialog.ui @@ -11,66 +11,14 @@ - Analyzer Configuration + Files to Analyze - - - General + + + true - - - - - - - - Global Settings - - - - - Custom Settings - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - Files to Analyze - - - - - - true - - - - @@ -85,13 +33,6 @@ - - - CppTools::ClangDiagnosticConfigsSelectionWidget - QWidget -
cpptools/clangdiagnosticconfigsselectionwidget.h
-
-
diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index 85be64da49..a5196765c6 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -40,11 +40,6 @@ #include #include -#include -#include -#include -#include - #include #include @@ -362,22 +357,17 @@ ClangTidyClazyTool *ClangTidyClazyTool::instance() return s_instance; } -static ClangDiagnosticConfig getDiagnosticConfig(Project *project) +void ClangTidyClazyTool::selectPerspective() { - ClangToolsProjectSettings *projectSettings = ClangToolsProjectSettingsManager::getSettings( - project); + m_perspective.select(); +} - Core::Id diagnosticConfigId; +static RunSettings runSettings(Project *project) +{ + auto *projectSettings = ClangToolsProjectSettingsManager::getSettings(project); if (projectSettings->useGlobalSettings()) - diagnosticConfigId = ClangToolsSettings::instance()->savedDiagnosticConfigId(); - else - diagnosticConfigId = projectSettings->diagnosticConfig(); - - const ClangDiagnosticConfigsModel configsModel( - CppTools::codeModelSettings()->clangCustomDiagnosticConfigs()); - - QTC_ASSERT(configsModel.hasConfigWithId(diagnosticConfigId), return ClangDiagnosticConfig()); - return configsModel.configWithId(diagnosticConfigId); + return ClangToolsSettings::instance()->runSettings(); + return projectSettings->runSettings(); } void ClangTidyClazyTool::startTool(FileSelection fileSelection) @@ -397,7 +387,7 @@ void ClangTidyClazyTool::startTool(FileSelection fileSelection) const bool preventBuild = fileSelection == FileSelection::CurrentFile; auto clangTool = new ClangToolRunWorker(runControl, - getDiagnosticConfig(project), + runSettings(project), fileInfos, preventBuild); diff --git a/src/plugins/clangtools/clangtidyclazytool.h b/src/plugins/clangtools/clangtidyclazytool.h index be96438117..5ae11ff440 100644 --- a/src/plugins/clangtools/clangtidyclazytool.h +++ b/src/plugins/clangtools/clangtidyclazytool.h @@ -51,6 +51,8 @@ public: static ClangTidyClazyTool *instance(); + void selectPerspective(); + void startTool(FileSelection fileSelection) final; Diagnostics read(OutputFileFormat outputFileFormat, diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index dc22e7a39b..9581fef4eb 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -29,6 +29,7 @@ #include "clangtidyclazytool.h" #include "clangtool.h" #include "clangtoolslogfilereader.h" +#include "clangtoolsprojectsettings.h" #include "clangtoolssettings.h" #include "clangtoolsutils.h" @@ -40,7 +41,9 @@ #include #include +#include #include +#include #include #include #include @@ -219,19 +222,28 @@ static QDebug operator<<(QDebug debug, const AnalyzeUnits &analyzeUnits) return debug; } +static ClangDiagnosticConfig diagnosticConfig(const Core::Id &diagConfigId) +{ + const ClangDiagnosticConfigsModel configsModel( + CppTools::codeModelSettings()->clangCustomDiagnosticConfigs()); + + QTC_ASSERT(configsModel.hasConfigWithId(diagConfigId), return ClangDiagnosticConfig()); + return configsModel.configWithId(diagConfigId); +} + ClangToolRunWorker::ClangToolRunWorker(RunControl *runControl, - const ClangDiagnosticConfig &diagnosticConfig, + const RunSettings &runSettings, const FileInfos &fileInfos, bool preventBuild) : RunWorker(runControl) - , m_temporaryDir("clangtools-XXXXXX") - , m_diagnosticConfig(diagnosticConfig) + , m_diagnosticConfig(diagnosticConfig(runSettings.diagnosticConfigId())) , m_fileInfos(fileInfos) + , m_temporaryDir("clangtools-XXXXXX") { setId("ClangTidyClazyRunner"); setSupportsReRunning(false); - if (!preventBuild && ClangToolsSettings::instance()->savedBuildBeforeAnalysis()) { + if (!preventBuild && runSettings.buildBeforeAnalysis()) { m_projectBuilder = new ProjectBuilder(runControl); addStartDependency(m_projectBuilder); } @@ -272,11 +284,9 @@ void ClangToolRunWorker::start() TaskHub::clearTasks(Debugger::Constants::ANALYZERTASK_ID); ProjectExplorerPlugin::saveModifiedFiles(); - if (ClangToolsSettings::instance()->savedBuildBeforeAnalysis()) { - if (m_projectBuilder && !m_projectBuilder->success()) { - reportFailure(); - return; - } + if (m_projectBuilder && !m_projectBuilder->success()) { + reportFailure(); + return; } const QString &toolName = tool()->name(); @@ -337,7 +347,7 @@ void ClangToolRunWorker::start() // Start process(es) qCDebug(LOG) << "Environment:" << m_environment; m_runners.clear(); - const int parallelRuns = ClangToolsSettings::instance()->savedSimultaneousProcesses(); + const int parallelRuns = m_runSettings.parallelJobs(); QTC_ASSERT(parallelRuns >= 1, reportFailure(); return); m_success = true; @@ -491,7 +501,7 @@ void ClangToolRunWorker::finalize() TaskHub::addTask(Task::Error, msg, Debugger::Constants::ANALYZERTASK_ID); Target *target = runControl()->target(); if (target && !target->activeBuildConfiguration()->buildDirectory().exists() - && !ClangToolsSettings::instance()->savedBuildBeforeAnalysis()) { + && !m_runSettings.buildBeforeAnalysis()) { msg = tr("%1: You might need to build the project to generate or update source " "files. To build automatically, enable \"Build the project before starting " "analysis\".") diff --git a/src/plugins/clangtools/clangtoolruncontrol.h b/src/plugins/clangtools/clangtoolruncontrol.h index 842350a7f4..bfada9e502 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.h +++ b/src/plugins/clangtools/clangtoolruncontrol.h @@ -26,6 +26,7 @@ #pragma once #include "clangfileinfo.h" +#include "clangtoolssettings.h" #include #include @@ -66,7 +67,7 @@ class ClangToolRunWorker : public ProjectExplorer::RunWorker public: ClangToolRunWorker(ProjectExplorer::RunControl *runControl, - const CppTools::ClangDiagnosticConfig &diagnosticConfig, + const RunSettings &runSettings, const FileInfos &fileInfos, bool preventBuild); @@ -93,15 +94,15 @@ private: void finalize(); -protected: - ProjectBuilder *m_projectBuilder = nullptr; - Utils::Environment m_environment; - Utils::TemporaryDirectory m_temporaryDir; - private: + RunSettings m_runSettings; CppTools::ClangDiagnosticConfig m_diagnosticConfig; FileInfos m_fileInfos; + ProjectBuilder *m_projectBuilder = nullptr; + Utils::Environment m_environment; + Utils::TemporaryDirectory m_temporaryDir; + CppTools::ProjectInfo m_projectInfoBeforeBuild; CppTools::ProjectInfo m_projectInfo; QString m_targetTriple; diff --git a/src/plugins/clangtools/clangtools.pro b/src/plugins/clangtools/clangtools.pro index a089f1edb7..49d4cf83a5 100644 --- a/src/plugins/clangtools/clangtools.pro +++ b/src/plugins/clangtools/clangtools.pro @@ -32,6 +32,7 @@ SOURCES += \ clangtoolsprojectsettings.cpp \ clangtoolssettings.cpp \ clangtoolsutils.cpp \ + runsettingswidget.cpp \ settingswidget.cpp \ HEADERS += \ @@ -54,11 +55,13 @@ HEADERS += \ clangtoolsprojectsettings.h \ clangtoolssettings.h \ clangtoolsutils.h \ + runsettingswidget.h \ settingswidget.h \ FORMS += \ clangselectablefilesdialog.ui \ clangtoolsprojectsettingswidget.ui \ + runsettingswidget.ui \ settingswidget.ui \ equals(TEST, 1) { diff --git a/src/plugins/clangtools/clangtools.qbs b/src/plugins/clangtools/clangtools.qbs index 32146f87c0..e0742256d5 100644 --- a/src/plugins/clangtools/clangtools.qbs +++ b/src/plugins/clangtools/clangtools.qbs @@ -68,6 +68,9 @@ QtcPlugin { "clangtoolsutils.h", "clangtoolsplugin.cpp", "clangtoolsplugin.h", + "runsettingswidget.cpp", + "runsettingswidget.h", + "runsettingswidget.ui", "settingswidget.cpp", "settingswidget.h", "settingswidget.ui", diff --git a/src/plugins/clangtools/clangtoolsplugin.cpp b/src/plugins/clangtools/clangtoolsplugin.cpp index fed9cb2150..b432891110 100644 --- a/src/plugins/clangtools/clangtoolsplugin.cpp +++ b/src/plugins/clangtools/clangtoolsplugin.cpp @@ -88,18 +88,11 @@ public: return m_widget; } - void apply() override - { - ClangToolsSettings::instance()->writeSettings(); - } - - void finish() override - { - delete m_widget; - } + void apply() override { m_widget->apply(); } + void finish() override { delete m_widget; } private: - QPointer m_widget; + QPointer m_widget; }; class ClangToolsPluginPrivate diff --git a/src/plugins/clangtools/clangtoolsprojectsettings.cpp b/src/plugins/clangtools/clangtoolsprojectsettings.cpp index 6c2597789d..005897b49c 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettings.cpp +++ b/src/plugins/clangtools/clangtoolsprojectsettings.cpp @@ -34,8 +34,9 @@ namespace ClangTools { namespace Internal { +static const char SETTINGS_KEY_MAIN[] = "ClangTools"; +static const char SETTINGS_PREFIX[] = "ClangTools."; static const char SETTINGS_KEY_USE_GLOBAL_SETTINGS[] = "ClangTools.UseGlobalSettings"; -static const char SETTINGS_KEY_DIAGNOSTIC_CONFIG[] = "ClangTools.DiagnosticConfig"; static const char SETTINGS_KEY_SELECTED_DIRS[] = "ClangTools.SelectedDirs"; static const char SETTINGS_KEY_SELECTED_FILES[] = "ClangTools.SelectedFiles"; static const char SETTINGS_KEY_SUPPRESSED_DIAGS[] = "ClangTools.SuppressedDiagnostics"; @@ -78,22 +79,53 @@ void ClangToolsProjectSettings::removeAllSuppressedDiagnostics() emit suppressedDiagnosticsChanged(); } +static QVariantMap convertToMapFromVersionBefore410(ProjectExplorer::Project *p) +{ + // These keys haven't changed. + const QStringList keys = { + SETTINGS_KEY_SELECTED_DIRS, + SETTINGS_KEY_SELECTED_FILES, + SETTINGS_KEY_SUPPRESSED_DIAGS, + SETTINGS_KEY_USE_GLOBAL_SETTINGS, + "ClangTools.BuildBeforeAnalysis", + }; + + QVariantMap map; + for (const QString &key : keys) + map.insert(key, p->namedSettings(key)); + + map.insert(SETTINGS_PREFIX + QString(diagnosticConfigIdKey), + p->namedSettings("ClangTools.DiagnosticConfig")); + + return map; +} + void ClangToolsProjectSettings::load() { - const QVariant useGlobalVariant = m_project->namedSettings(SETTINGS_KEY_USE_GLOBAL_SETTINGS); - m_useGlobalSettings = useGlobalVariant.isValid() ? useGlobalVariant.toBool() : true; - m_diagnosticConfig = Core::Id::fromSetting( - m_project->namedSettings(SETTINGS_KEY_DIAGNOSTIC_CONFIG)); + // Load map + QVariantMap map = m_project->namedSettings(SETTINGS_KEY_MAIN).toMap(); + + bool write; + if (map.isEmpty()) { + if (!m_project->namedSettings(SETTINGS_KEY_SELECTED_DIRS).isNull()) { + map = convertToMapFromVersionBefore410(m_project); + write = true; + } else { + return; // Use defaults + } + } - auto toFileName = [](const QString &s) { return Utils::FilePath::fromString(s); }; + // Read map + m_useGlobalSettings = map.value(SETTINGS_KEY_USE_GLOBAL_SETTINGS).toBool(); - const QStringList dirs = m_project->namedSettings(SETTINGS_KEY_SELECTED_DIRS).toStringList(); + auto toFileName = [](const QString &s) { return Utils::FilePath::fromString(s); }; + const QStringList dirs = map.value(SETTINGS_KEY_SELECTED_DIRS).toStringList(); m_selectedDirs = Utils::transform(dirs, toFileName); - const QStringList files = m_project->namedSettings(SETTINGS_KEY_SELECTED_FILES).toStringList(); + const QStringList files = map.value(SETTINGS_KEY_SELECTED_FILES).toStringList(); m_selectedFiles = Utils::transform(files, toFileName); - const QVariantList list = m_project->namedSettings(SETTINGS_KEY_SUPPRESSED_DIAGS).toList(); + const QVariantList list = map.value(SETTINGS_KEY_SUPPRESSED_DIAGS).toList(); foreach (const QVariant &v, list) { const QVariantMap diag = v.toMap(); const QString fp = diag.value(SETTINGS_KEY_SUPPRESSED_DIAGS_FILEPATH).toString(); @@ -113,48 +145,37 @@ void ClangToolsProjectSettings::load() uniquifier); } emit suppressedDiagnosticsChanged(); + + m_runSettings.fromMap(map, SETTINGS_PREFIX); + + if (write) + store(); // Store new settings format } void ClangToolsProjectSettings::store() { - m_project->setNamedSettings(SETTINGS_KEY_USE_GLOBAL_SETTINGS, m_useGlobalSettings); - m_project->setNamedSettings(SETTINGS_KEY_DIAGNOSTIC_CONFIG, m_diagnosticConfig.toSetting()); + QVariantMap map; + map.insert(SETTINGS_KEY_USE_GLOBAL_SETTINGS, m_useGlobalSettings); const QStringList dirs = Utils::transform(m_selectedDirs, &Utils::FilePath::toString); - m_project->setNamedSettings(SETTINGS_KEY_SELECTED_DIRS, dirs); + map.insert(SETTINGS_KEY_SELECTED_DIRS, dirs); const QStringList files = Utils::transform(m_selectedFiles, &Utils::FilePath::toString); - m_project->setNamedSettings(SETTINGS_KEY_SELECTED_FILES, files); + map.insert(SETTINGS_KEY_SELECTED_FILES, files); QVariantList list; - foreach (const SuppressedDiagnostic &diag, m_suppressedDiagnostics) { + for (const SuppressedDiagnostic &diag : m_suppressedDiagnostics) { QVariantMap diagMap; diagMap.insert(SETTINGS_KEY_SUPPRESSED_DIAGS_FILEPATH, diag.filePath.toString()); diagMap.insert(SETTINGS_KEY_SUPPRESSED_DIAGS_MESSAGE, diag.description); diagMap.insert(SETTINGS_KEY_SUPPRESSED_DIAGS_UNIQIFIER, diag.uniquifier); list << diagMap; } - m_project->setNamedSettings(SETTINGS_KEY_SUPPRESSED_DIAGS, list); -} + map.insert(SETTINGS_KEY_SUPPRESSED_DIAGS, list); -bool ClangToolsProjectSettings::useGlobalSettings() const -{ - return m_useGlobalSettings; -} - -void ClangToolsProjectSettings::setUseGlobalSettings(bool useGlobalSettings) -{ - m_useGlobalSettings = useGlobalSettings; -} + m_runSettings.toMap(map, SETTINGS_PREFIX); -Core::Id ClangToolsProjectSettings::diagnosticConfig() const -{ - return m_diagnosticConfig; -} - -void ClangToolsProjectSettings::setDiagnosticConfig(const Core::Id &diagnosticConfig) -{ - m_diagnosticConfig = diagnosticConfig; + m_project->setNamedSettings(SETTINGS_KEY_MAIN, map); } ClangToolsProjectSettingsManager::ClangToolsProjectSettingsManager() diff --git a/src/plugins/clangtools/clangtoolsprojectsettings.h b/src/plugins/clangtools/clangtoolsprojectsettings.h index 0a6aa477d3..aaf045f056 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettings.h +++ b/src/plugins/clangtools/clangtoolsprojectsettings.h @@ -25,7 +25,7 @@ #pragma once -#include +#include "clangtoolssettings.h" #include #include @@ -70,11 +70,11 @@ public: ClangToolsProjectSettings(ProjectExplorer::Project *project); ~ClangToolsProjectSettings() override; - bool useGlobalSettings() const; - void setUseGlobalSettings(bool useGlobalSettings); + bool useGlobalSettings() const { return m_useGlobalSettings; } + void setUseGlobalSettings(bool useGlobalSettings) { m_useGlobalSettings = useGlobalSettings; } - Core::Id diagnosticConfig() const; - void setDiagnosticConfig(const Core::Id &diagnosticConfig); + RunSettings runSettings() const { return m_runSettings; } + void setRunSettings(const RunSettings &settings) { m_runSettings = settings; } QSet selectedDirs() const { return m_selectedDirs; } void setSelectedDirs(const QSet &value) { m_selectedDirs = value; } @@ -95,10 +95,14 @@ private: void store(); ProjectExplorer::Project *m_project; + bool m_useGlobalSettings = true; - Core::Id m_diagnosticConfig; + + RunSettings m_runSettings; + QSet m_selectedDirs; QSet m_selectedFiles; + SuppressedDiagnosticsList m_suppressedDiagnostics; }; diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp index 3e380aa9af..765cd34012 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp @@ -26,8 +26,12 @@ #include "clangtoolsprojectsettingswidget.h" #include "ui_clangtoolsprojectsettingswidget.h" +#include "clangtidyclazytool.h" +#include "clangtoolsconstants.h" #include "clangtoolsprojectsettings.h" +#include + #include #include @@ -56,12 +60,46 @@ private: SuppressedDiagnosticsList m_diagnostics; }; +enum { UseGlobalSettings, UseCustomSettings }; // Values in sync with m_ui->globalCustomComboBox + ProjectSettingsWidget::ProjectSettingsWidget(ProjectExplorer::Project *project, QWidget *parent) : QWidget(parent), m_ui(new Ui::ProjectSettingsWidget) , m_projectSettings(ClangToolsProjectSettingsManager::getSettings(project)) { m_ui->setupUi(this); + + // Use global/custom settings + const int globalOrCustomIndex = m_projectSettings->useGlobalSettings() ? UseGlobalSettings + : UseCustomSettings; + m_ui->globalCustomComboBox->setCurrentIndex(globalOrCustomIndex); + onGlobalCustomChanged(globalOrCustomIndex); + connect(m_ui->globalCustomComboBox, + QOverload::of(&QComboBox::currentIndexChanged), + this, + &ProjectSettingsWidget::onGlobalCustomChanged); + + // Restore global settings + connect(m_ui->restoreGlobal, &QPushButton::clicked, this, [this]() { + m_ui->runSettingsWidget->fromSettings(ClangToolsSettings::instance()->runSettings()); + }); + + // Links + connect(m_ui->gotoGlobalSettingsLabel, &QLabel::linkActivated, [](const QString &){ + Core::ICore::showOptionsDialog(ClangTools::Constants::SETTINGS_PAGE_ID); + }); + + connect(m_ui->gotoAnalyzerModeLabel, &QLabel::linkActivated, [](const QString &){ + ClangTidyClazyTool::instance()->selectPerspective(); + }); + + // Run options + m_ui->runSettingsWidget->fromSettings(m_projectSettings->runSettings()); + connect(m_ui->runSettingsWidget, &RunSettingsWidget::changed, [this]() { + m_projectSettings->setRunSettings(m_ui->runSettingsWidget->toSettings()); + }); + + // Suppressed diagnostics auto * const model = new SuppressedDiagnosticsModel(this); model->setDiagnostics(m_projectSettings->suppressedDiagnostics()); connect(m_projectSettings, &ClangToolsProjectSettings::suppressedDiagnosticsChanged, @@ -86,6 +124,14 @@ ProjectSettingsWidget::~ProjectSettingsWidget() delete m_ui; } +void ProjectSettingsWidget::onGlobalCustomChanged(int index) +{ + const bool useGlobal = index == UseGlobalSettings; + m_ui->runSettingsWidget->setEnabled(!useGlobal); + m_ui->restoreGlobal->setEnabled(!useGlobal); + m_projectSettings->setUseGlobalSettings(useGlobal); +} + void ProjectSettingsWidget::updateButtonStates() { updateButtonStateRemoveSelected(); diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.h b/src/plugins/clangtools/clangtoolsprojectsettingswidget.h index f9153f75a6..680431cc6e 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.h +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.h @@ -44,6 +44,8 @@ public: ~ProjectSettingsWidget() override; private: + void onGlobalCustomChanged(int index); + void updateButtonStates(); void updateButtonStateRemoveSelected(); void updateButtonStateRemoveAll(); diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.ui b/src/plugins/clangtools/clangtoolsprojectsettingswidget.ui index c120d3bb95..b8263a450a 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.ui +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.ui @@ -6,20 +6,41 @@ 0 0 - 400 - 300 + 615 + 399 - + - + + + + Use Global Settings + + + + + Use Customized Settings + + + + + + - Suppressed diagnostics: + Restore Global Settings + + + + + + + <a href="target">Show Global Settings</a> @@ -36,52 +57,79 @@ - - - - - - - QAbstractItemView::SingleSelection + + + <a href="target">Go to Analyzer</a> - - - - - - Remove Selected - - - - - - - Remove All - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - + + + + + + + Suppressed diagnostics + + + + + + + + QAbstractItemView::SingleSelection + + + + + + + + + Remove Selected + + + + + + + Remove All + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + ClangTools::Internal::RunSettingsWidget + QWidget +
clangtools/runsettingswidget.h
+ 1 +
+
diff --git a/src/plugins/clangtools/clangtoolssettings.cpp b/src/plugins/clangtools/clangtoolssettings.cpp index 86f152f660..07b9592a8e 100644 --- a/src/plugins/clangtools/clangtoolssettings.cpp +++ b/src/plugins/clangtools/clangtoolssettings.cpp @@ -29,160 +29,112 @@ #include -#include -#include - -#include #include -static const char simultaneousProcessesKey[] = "simultaneousProcesses"; -static const char buildBeforeAnalysisKey[] = "buildBeforeAnalysis"; -static const char diagnosticConfigIdKey[] = "diagnosticConfigId"; -static const char clangTidyExecutableKey[] = "clangTidyExecutable"; -static const char clazyStandaloneExecutableKey[] = "clazyStandaloneExecutable"; +static const char clangTidyExecutableKey[] = "ClangTidyExecutable"; +static const char clazyStandaloneExecutableKey[] = "ClazyStandaloneExecutable"; -namespace ClangTools { -namespace Internal { +static const char parallelJobsKey[] = "ParallelJobs"; +static const char buildBeforeAnalysisKey[] = "BuildBeforeAnalysis"; -ClangToolsSettings::ClangToolsSettings() -{ - readSettings(); -} +static const char oldDiagnosticConfigIdKey[] = "diagnosticConfigId"; -ClangToolsSettings *ClangToolsSettings::instance() -{ - static ClangToolsSettings instance; - return &instance; -} +namespace ClangTools { +namespace Internal { -int ClangToolsSettings::savedSimultaneousProcesses() const +RunSettings::RunSettings() + : m_parallelJobs(qMax(0, QThread::idealThreadCount() / 2)) { - return m_savedSimultaneousProcesses; } -int ClangToolsSettings::simultaneousProcesses() const +void RunSettings::fromMap(const QVariantMap &map, const QString &prefix) { - return m_simultaneousProcesses; + m_diagnosticConfigId = Core::Id::fromSetting(map.value(prefix + diagnosticConfigIdKey)); + m_parallelJobs = map.value(prefix + parallelJobsKey).toInt(); + m_buildBeforeAnalysis = map.value(prefix + buildBeforeAnalysisKey).toBool(); } -void ClangToolsSettings::setSimultaneousProcesses(int processes) +void RunSettings::toMap(QVariantMap &map, const QString &prefix) const { - m_simultaneousProcesses = processes; + map.insert(prefix + diagnosticConfigIdKey, m_diagnosticConfigId.toSetting()); + map.insert(prefix + parallelJobsKey, m_parallelJobs); + map.insert(prefix + buildBeforeAnalysisKey, m_buildBeforeAnalysis); } -bool ClangToolsSettings::savedBuildBeforeAnalysis() const +ClangToolsSettings::ClangToolsSettings() { - return m_savedBuildBeforeAnalysis; + readSettings(); } -bool ClangToolsSettings::buildBeforeAnalysis() const +ClangToolsSettings *ClangToolsSettings::instance() { - return m_buildBeforeAnalysis; + static ClangToolsSettings instance; + return &instance; } -void ClangToolsSettings::setBuildBeforeAnalysis(bool build) +static QVariantMap convertToMapFromVersionBefore410(QSettings *s) { - m_buildBeforeAnalysis = build; -} + const char oldParallelJobsKey[] = "simultaneousProcesses"; + const char oldBuildBeforeAnalysisKey[] = "buildBeforeAnalysis"; -Core::Id ClangToolsSettings::savedDiagnosticConfigId() const -{ - return m_savedDiagnosticConfigId; -} + QVariantMap map; + map.insert(diagnosticConfigIdKey, s->value(oldDiagnosticConfigIdKey)); + map.insert(parallelJobsKey, s->value(oldParallelJobsKey)); + map.insert(buildBeforeAnalysisKey, s->value(oldBuildBeforeAnalysisKey)); -Core::Id ClangToolsSettings::diagnosticConfigId() const -{ - return m_diagnosticConfigId; -} + s->remove(oldDiagnosticConfigIdKey); + s->remove(oldParallelJobsKey); + s->remove(oldBuildBeforeAnalysisKey); -void ClangToolsSettings::setDiagnosticConfigId(Core::Id id) -{ - m_diagnosticConfigId = id; + return map; } -void ClangToolsSettings::updateSavedBuildBeforeAnalysiIfRequired() -{ - if (m_savedBuildBeforeAnalysis == m_buildBeforeAnalysis) - return; - m_savedBuildBeforeAnalysis = m_buildBeforeAnalysis; - emit buildBeforeAnalysisChanged(m_savedBuildBeforeAnalysis); -} - -QString ClangToolsSettings::savedClazyStandaloneExecutable() const +void ClangToolsSettings::readSettings() { - return m_savedClazyStandaloneExecutable; -} + QSettings *s = Core::ICore::settings(); + s->beginGroup(Constants::SETTINGS_ID); + m_clangTidyExecutable = s->value(clangTidyExecutableKey).toString(); + m_clazyStandaloneExecutable = s->value(clazyStandaloneExecutableKey).toString(); -QString ClangToolsSettings::savedClangTidyExecutable() const -{ - return m_savedClangTidyExecutable; -} + bool write = false; -QString ClangToolsSettings::clazyStandaloneExecutable() const -{ - return m_clazyStandaloneExecutable; -} + QVariantMap map; + if (!s->value(oldDiagnosticConfigIdKey).isNull()) { + map = convertToMapFromVersionBefore410(s); + write = true; + } else { + QVariantMap defaults; + defaults.insert(diagnosticConfigIdKey, m_runSettings.diagnosticConfigId().toSetting()); + defaults.insert(parallelJobsKey, m_runSettings.parallelJobs()); + defaults.insert(buildBeforeAnalysisKey, m_runSettings.buildBeforeAnalysis()); + map = defaults; + for (QVariantMap::ConstIterator it = defaults.constBegin(); it != defaults.constEnd(); ++it) + map.insert(it.key(), s->value(it.key(), it.value())); + } -void ClangToolsSettings::setClazyStandaloneExecutable(const QString &path) -{ - m_clazyStandaloneExecutable = path; -} + // Run settings + m_runSettings.fromMap(map); -QString ClangToolsSettings::clangTidyExecutable() const -{ - return m_clangTidyExecutable; -} + s->endGroup(); -void ClangToolsSettings::setClangTidyExecutable(const QString &path) -{ - m_clangTidyExecutable = path; + if (write) + writeSettings(); } -void ClangToolsSettings::readSettings() +void ClangToolsSettings::writeSettings() { - QSettings *settings = Core::ICore::settings(); - settings->beginGroup(QLatin1String(Constants::SETTINGS_ID)); - - const int defaultSimultaneousProcesses = qMax(0, QThread::idealThreadCount() / 2); - m_savedSimultaneousProcesses = m_simultaneousProcesses - = settings->value(QString(simultaneousProcessesKey), - defaultSimultaneousProcesses).toInt(); - - m_buildBeforeAnalysis = settings->value(QString(buildBeforeAnalysisKey), true).toBool(); + QSettings *s = Core::ICore::settings(); + s->beginGroup(Constants::SETTINGS_ID); - m_savedClangTidyExecutable = m_clangTidyExecutable - = settings->value(QLatin1String(clangTidyExecutableKey)).toString(); - m_savedClazyStandaloneExecutable = m_clazyStandaloneExecutable - = settings->value(QLatin1String(clazyStandaloneExecutableKey)).toString(); + s->setValue(clangTidyExecutableKey, m_clangTidyExecutable); + s->setValue(clazyStandaloneExecutableKey, m_clazyStandaloneExecutable); - m_diagnosticConfigId = Core::Id::fromSetting(settings->value(QString(diagnosticConfigIdKey))); - if (!m_diagnosticConfigId.isValid()) - m_diagnosticConfigId = "Builtin.TidyAndClazy"; + QVariantMap map; + m_runSettings.toMap(map); + for (QVariantMap::ConstIterator it = map.constBegin(); it != map.constEnd(); ++it) + s->setValue(it.key(), it.value()); - m_savedDiagnosticConfigId = m_diagnosticConfigId; - - updateSavedBuildBeforeAnalysiIfRequired(); - - settings->endGroup(); -} - -void ClangToolsSettings::writeSettings() -{ - QSettings *settings = Core::ICore::settings(); - settings->beginGroup(QString(Constants::SETTINGS_ID)); - settings->setValue(QString(simultaneousProcessesKey), m_simultaneousProcesses); - settings->setValue(QString(buildBeforeAnalysisKey), m_buildBeforeAnalysis); - settings->setValue(QString(clangTidyExecutableKey), m_clangTidyExecutable); - settings->setValue(QString(clazyStandaloneExecutableKey), m_clazyStandaloneExecutable); - settings->setValue(QString(diagnosticConfigIdKey), m_diagnosticConfigId.toSetting()); - - m_savedSimultaneousProcesses = m_simultaneousProcesses; - m_savedDiagnosticConfigId = m_diagnosticConfigId; - m_savedClangTidyExecutable = m_clangTidyExecutable; - m_savedClazyStandaloneExecutable = m_clazyStandaloneExecutable; - updateSavedBuildBeforeAnalysiIfRequired(); - - settings->endGroup(); + s->endGroup(); } } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolssettings.h b/src/plugins/clangtools/clangtoolssettings.h index 402845d20f..893dbd23f9 100644 --- a/src/plugins/clangtools/clangtoolssettings.h +++ b/src/plugins/clangtools/clangtoolssettings.h @@ -27,61 +27,61 @@ #include -#include #include namespace ClangTools { namespace Internal { -// TODO: Remove need for "saved* members -class ClangToolsSettings : public QObject +const char diagnosticConfigIdKey[] = "DiagnosticConfigId"; + +class RunSettings { - Q_OBJECT public: - static ClangToolsSettings *instance(); + RunSettings(); - void writeSettings(); + void fromMap(const QVariantMap &map, const QString &prefix = QString()); + void toMap(QVariantMap &map, const QString &prefix = QString()) const; - int savedSimultaneousProcesses() const; - bool savedBuildBeforeAnalysis() const; - Core::Id savedDiagnosticConfigId() const; - QString savedClangTidyExecutable() const; - QString savedClazyStandaloneExecutable() const; + Core::Id diagnosticConfigId() const { return m_diagnosticConfigId; } + void setDiagnosticConfigId(const Core::Id &id) { m_diagnosticConfigId = id; } - int simultaneousProcesses() const; - void setSimultaneousProcesses(int processes); + bool buildBeforeAnalysis() const { return m_buildBeforeAnalysis; } + void setBuildBeforeAnalysis(bool yesno) { m_buildBeforeAnalysis = yesno; } - bool buildBeforeAnalysis() const; - void setBuildBeforeAnalysis(bool build); + int parallelJobs() const { return m_parallelJobs; } + void setParallelJobs(int jobs) { m_parallelJobs = jobs; } + +private: + Core::Id m_diagnosticConfigId = "Builtin.TidyAndClazy"; // TODO + int m_parallelJobs = -1; + bool m_buildBeforeAnalysis = true; +}; - Core::Id diagnosticConfigId() const; - void setDiagnosticConfigId(Core::Id id); +class ClangToolsSettings +{ +public: + static ClangToolsSettings *instance(); + void writeSettings(); - QString clangTidyExecutable() const; - void setClangTidyExecutable(const QString &path); + QString clangTidyExecutable() const { return m_clangTidyExecutable; } + void setClangTidyExecutable(const QString &path) { m_clangTidyExecutable = path; } - QString clazyStandaloneExecutable() const; - void setClazyStandaloneExecutable(const QString &path); + QString clazyStandaloneExecutable() const { return m_clazyStandaloneExecutable; } + void setClazyStandaloneExecutable(const QString &path) { m_clazyStandaloneExecutable = path; } -signals: - void buildBeforeAnalysisChanged(bool checked) const; + RunSettings runSettings() const { return m_runSettings; } + void setRunSettings(const RunSettings &settings) { m_runSettings = settings; } private: ClangToolsSettings(); void readSettings(); - void updateSavedBuildBeforeAnalysiIfRequired(); - - int m_simultaneousProcesses = -1; - int m_savedSimultaneousProcesses = -1; - bool m_buildBeforeAnalysis = false; - bool m_savedBuildBeforeAnalysis= false; + // Executables QString m_clangTidyExecutable; - QString m_savedClangTidyExecutable; QString m_clazyStandaloneExecutable; - QString m_savedClazyStandaloneExecutable; - Core::Id m_diagnosticConfigId; - Core::Id m_savedDiagnosticConfigId; + + // Run settings + RunSettings m_runSettings; }; } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolsunittests.cpp b/src/plugins/clangtools/clangtoolsunittests.cpp index b8546c58bd..5a034c61b6 100644 --- a/src/plugins/clangtools/clangtoolsunittests.cpp +++ b/src/plugins/clangtools/clangtoolsunittests.cpp @@ -87,7 +87,8 @@ static CppTools::ClangDiagnosticConfig configFor(const QString &tidyChecks, config.setIsReadOnly(true); config.setClangOptions(QStringList{QStringLiteral("-Wno-everything")}); config.setClangTidyMode(CppTools::ClangDiagnosticConfig::TidyMode::ChecksPrefixList); - config.setClangTidyChecks("-*," + tidyChecks); + const QString theTidyChecks = tidyChecks.isEmpty() ? tidyChecks : "-*," + tidyChecks; + config.setClangTidyChecks(theTidyChecks); config.setClazyChecks(clazyChecks); return config; } @@ -115,7 +116,7 @@ void ClangToolsUnitTests::testProject() ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance(); const CppTools::ClangDiagnosticConfigs originalConfigs = cppToolsSettings ->clangCustomDiagnosticConfigs(); - const Core::Id originalId = clangToolsSettings->diagnosticConfigId(); + const Core::Id originalId = clangToolsSettings->runSettings().diagnosticConfigId(); CppTools::ClangDiagnosticConfigs modifiedConfigs = originalConfigs; modifiedConfigs.push_back(diagnosticConfig); @@ -123,12 +124,16 @@ void ClangToolsUnitTests::testProject() ExecuteOnDestruction executeOnDestruction([=]() { // Restore configs cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs); - clangToolsSettings->setDiagnosticConfigId(originalId); + RunSettings runSettings = clangToolsSettings->runSettings(); + runSettings.setDiagnosticConfigId(originalId); + clangToolsSettings->setRunSettings(runSettings); clangToolsSettings->writeSettings(); }); cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs); - clangToolsSettings->setDiagnosticConfigId(diagnosticConfig.id()); + RunSettings runSettings = clangToolsSettings->runSettings(); + runSettings.setDiagnosticConfigId(diagnosticConfig.id()); + clangToolsSettings->setRunSettings(runSettings); clangToolsSettings->writeSettings(); tool->startTool(ClangTidyClazyTool::FileSelection::AllFiles); diff --git a/src/plugins/clangtools/runsettingswidget.cpp b/src/plugins/clangtools/runsettingswidget.cpp new file mode 100644 index 0000000000..1a26d2e7d0 --- /dev/null +++ b/src/plugins/clangtools/runsettingswidget.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "runsettingswidget.h" + +#include "ui_runsettingswidget.h" + +#include "clangtoolssettings.h" +#include "clangtoolsutils.h" + +#include + +namespace ClangTools { +namespace Internal { + +RunSettingsWidget::RunSettingsWidget(QWidget *parent) + : QWidget(parent) + , m_ui(new Ui::RunSettingsWidget) +{ + m_ui->setupUi(this); + + connect(m_ui->diagnosticWidget, + &CppTools::ClangDiagnosticConfigsSelectionWidget::currentConfigChanged, + [this](const Core::Id &) { emit changed(); }); + // m_ui->buildBeforeAnalysis is handled in fromSettings() + connect(m_ui->parallelJobsSpinBox, + QOverload::of(&QSpinBox::valueChanged), + [this](int) { emit changed(); }); +} + +RunSettingsWidget::~RunSettingsWidget() +{ + delete m_ui; +} + +void RunSettingsWidget::fromSettings(const RunSettings &s) +{ + m_ui->diagnosticWidget->refresh(s.diagnosticConfigId()); + + disconnect(m_ui->buildBeforeAnalysis, 0, 0, 0); + m_ui->buildBeforeAnalysis->setToolTip(hintAboutBuildBeforeAnalysis()); + m_ui->buildBeforeAnalysis->setCheckState(s.buildBeforeAnalysis() ? Qt::Checked : Qt::Unchecked); + connect(m_ui->buildBeforeAnalysis, &QCheckBox::toggled, [this](bool checked) { + if (!checked) + showHintAboutBuildBeforeAnalysis(); + emit changed(); + }); + + m_ui->parallelJobsSpinBox->setValue(s.parallelJobs()); + m_ui->parallelJobsSpinBox->setMinimum(1); + m_ui->parallelJobsSpinBox->setMaximum(QThread::idealThreadCount()); +} + +RunSettings RunSettingsWidget::toSettings() const +{ + RunSettings s; + s.setDiagnosticConfigId(m_ui->diagnosticWidget->currentConfigId()); + s.setBuildBeforeAnalysis(m_ui->buildBeforeAnalysis->checkState() == Qt::CheckState::Checked); + s.setParallelJobs(m_ui->parallelJobsSpinBox->value()); + + return s; +} + +} // namespace Internal +} // namespace ClangTools diff --git a/src/plugins/clangtools/runsettingswidget.h b/src/plugins/clangtools/runsettingswidget.h new file mode 100644 index 0000000000..c49bc88f75 --- /dev/null +++ b/src/plugins/clangtools/runsettingswidget.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include + +namespace ClangTools { +namespace Internal { + +class RunSettings; + +namespace Ui { +class RunSettingsWidget; +} + +class RunSettingsWidget : public QWidget +{ + Q_OBJECT + +public: + explicit RunSettingsWidget(QWidget *parent = nullptr); + ~RunSettingsWidget(); + + void fromSettings(const RunSettings &s); + RunSettings toSettings() const; + +signals: + void changed(); + +private: + Ui::RunSettingsWidget *m_ui; +}; + +} // namespace Internal +} // namespace ClangTools diff --git a/src/plugins/clangtools/runsettingswidget.ui b/src/plugins/clangtools/runsettingswidget.ui new file mode 100644 index 0000000000..e7ad362c84 --- /dev/null +++ b/src/plugins/clangtools/runsettingswidget.ui @@ -0,0 +1,93 @@ + + + ClangTools::Internal::RunSettingsWidget + + + + 0 + 0 + 383 + 125 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Run Options + + + + + + + + + Build the project before analysis + + + + + + + + + Parallel jobs: + + + + + + + 1 + + + 32 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + CppTools::ClangDiagnosticConfigsSelectionWidget + QWidget +
cpptools/clangdiagnosticconfigsselectionwidget.h
+
+
+ + +
diff --git a/src/plugins/clangtools/settingswidget.cpp b/src/plugins/clangtools/settingswidget.cpp index de5976a04f..110135a779 100644 --- a/src/plugins/clangtools/settingswidget.cpp +++ b/src/plugins/clangtools/settingswidget.cpp @@ -30,17 +30,6 @@ #include "clangtoolsconstants.h" #include "clangtoolsutils.h" -#include - -#include -#include -#include - -#include -#include - -#include - namespace ClangTools { namespace Internal { @@ -48,15 +37,13 @@ static void setupPathChooser(Utils::PathChooser *const chooser, const QString &promptDiaglogTitle, const QString &placeHolderText, const QString &pathFromSettings, - const QString &historyCompleterId, - std::function savePath) + const QString &historyCompleterId) { chooser->setPromptDialogTitle(promptDiaglogTitle); chooser->lineEdit()->setPlaceholderText(placeHolderText); chooser->setPath(pathFromSettings); chooser->setExpectedKind(Utils::PathChooser::ExistingCommand); chooser->setHistoryCompleter(historyCompleterId); - QObject::connect(chooser, &Utils::PathChooser::rawPathChanged, savePath), chooser->setValidationFunction([chooser](Utils::FancyLineEdit *edit, QString *errorMessage) { const QString currentFilePath = chooser->fileName().toString(); Utils::PathChooser pc; @@ -92,8 +79,7 @@ SettingsWidget::SettingsWidget(ClangToolsSettings *settings, QWidget *parent) tr("Clang-Tidy Executable"), placeHolderText, path, - "ClangTools.ClangTidyExecutable.History", - [settings](const QString &path) { settings->setClangTidyExecutable(path); }); + "ClangTools.ClangTidyExecutable.History"); if (qEnvironmentVariable("QTC_USE_CLAZY_STANDALONE_PATH").isEmpty()) { m_ui->clazyStandalonePathChooser->setVisible(false); @@ -107,47 +93,23 @@ SettingsWidget::SettingsWidget(ClangToolsSettings *settings, QWidget *parent) tr("Clazy Executable"), placeHolderText, path, - "ClangTools.ClazyStandaloneExecutable.History", - [settings](const QString &path) { - settings->setClazyStandaloneExecutable(path); - }); + "ClangTools.ClazyStandaloneExecutable.History"); } // // Group box "Run Options" // - m_ui->simultaneousProccessesSpinBox->setValue(settings->savedSimultaneousProcesses()); - m_ui->simultaneousProccessesSpinBox->setMinimum(1); - m_ui->simultaneousProccessesSpinBox->setMaximum(QThread::idealThreadCount()); - connect(m_ui->simultaneousProccessesSpinBox, - QOverload::of(&QSpinBox::valueChanged), - [settings](int count) { settings->setSimultaneousProcesses(count); }); - - QCheckBox *buildBeforeAnalysis = m_ui->buildBeforeAnalysis; - buildBeforeAnalysis->setToolTip(hintAboutBuildBeforeAnalysis()); - buildBeforeAnalysis->setCheckState(settings->savedBuildBeforeAnalysis() - ? Qt::Checked : Qt::Unchecked); - connect(buildBeforeAnalysis, &QCheckBox::toggled, [settings](bool checked) { - if (!checked) - showHintAboutBuildBeforeAnalysis(); - settings->setBuildBeforeAnalysis(checked); - }); - CppTools::ClangDiagnosticConfigsSelectionWidget *diagnosticWidget = m_ui->diagnosticWidget; - diagnosticWidget->refresh(settings->savedDiagnosticConfigId()); + m_ui->runSettingsWidget->fromSettings(m_settings->runSettings()); +} - connect(diagnosticWidget, - &CppTools::ClangDiagnosticConfigsSelectionWidget::currentConfigChanged, - this, [this](const Core::Id ¤tConfigId) { - m_settings->setDiagnosticConfigId(currentConfigId); - }); +void SettingsWidget::apply() +{ + m_settings->setClangTidyExecutable(m_ui->clangTidyPathChooser->rawPath()); + m_settings->setClazyStandaloneExecutable(m_ui->clazyStandalonePathChooser->rawPath()); + m_settings->setRunSettings(m_ui->runSettingsWidget->toSettings()); - connect(CppTools::codeModelSettings().data(), &CppTools::CppCodeModelSettings::changed, - this, [=]() { - // Settings were applied so apply also the current selection if possible. - diagnosticWidget->refresh(m_settings->diagnosticConfigId()); - m_settings->writeSettings(); - }); + m_settings->writeSettings(); } SettingsWidget::~SettingsWidget() = default; diff --git a/src/plugins/clangtools/settingswidget.h b/src/plugins/clangtools/settingswidget.h index 6eeaeb5d98..2002f32eec 100644 --- a/src/plugins/clangtools/settingswidget.h +++ b/src/plugins/clangtools/settingswidget.h @@ -43,6 +43,9 @@ class SettingsWidget : public QWidget public: SettingsWidget(ClangToolsSettings *settings, QWidget *parent = nullptr); ~SettingsWidget() override; + + void apply(); + private: std::unique_ptr m_ui; ClangToolsSettings *m_settings; diff --git a/src/plugins/clangtools/settingswidget.ui b/src/plugins/clangtools/settingswidget.ui index c73148d0da..6ef3d09297 100644 --- a/src/plugins/clangtools/settingswidget.ui +++ b/src/plugins/clangtools/settingswidget.ui @@ -44,57 +44,7 @@ - - - Run Options - - - - - - - - - Build the project before analysis - - - - - - - - - Simultaneous processes: - - - - - - - 1 - - - 32 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - + @@ -113,14 +63,15 @@ - CppTools::ClangDiagnosticConfigsSelectionWidget + Utils::PathChooser QWidget -
cpptools/clangdiagnosticconfigsselectionwidget.h
+
utils/pathchooser.h
+ 1
- Utils::PathChooser + ClangTools::Internal::RunSettingsWidget QWidget -
utils/pathchooser.h
+
clangtools/runsettingswidget.h
1
-- cgit v1.2.3