diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-10-01 16:53:01 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-12-03 13:22:28 +0000 |
commit | 3090e744c2cdfc29b95f5fdf71ad2e385bb7d3c2 (patch) | |
tree | ee7044ba5694843bbf2af41fd830f9096bd72141 | |
parent | 0a15b001dd71d86ecfd06669cfe55bcd20afe305 (diff) | |
download | qt-creator-3090e744c2cdfc29b95f5fdf71ad2e385bb7d3c2.tar.gz |
ClangTools: Polish ClangDiagnosticConfigsWidget
* Improve distinction between built-in and custom configs by introducing
corresponding parent nodes
* Add button to rename a config
* Make closing the dialog apply the selected config.
* Adapt also the related ClangDiagnosticConfigsSelectionWidget showing a
combo box of the diagnostic configs and a "Manage..." button: Remove
the combo box and show the current config as the button text.
Change-Id: Ic015df37f2532f84bd7da6cd20bfce07799a97b8
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
21 files changed, 315 insertions, 338 deletions
diff --git a/src/plugins/clangcodemodel/clangprojectsettings.cpp b/src/plugins/clangcodemodel/clangprojectsettings.cpp index 698447cc4b..c081203669 100644 --- a/src/plugins/clangcodemodel/clangprojectsettings.cpp +++ b/src/plugins/clangcodemodel/clangprojectsettings.cpp @@ -25,6 +25,9 @@ #include "clangprojectsettings.h" +#include <cpptools/cppcodemodelsettings.h> +#include <cpptools/cpptoolsreuse.h> + #include <utils/qtcassert.h> #include <utils/hostosinfo.h> @@ -74,6 +77,9 @@ ClangProjectSettings::ClangProjectSettings(ProjectExplorer::Project *project) Core::Id ClangProjectSettings::warningConfigId() const { + const CppTools::ClangDiagnosticConfigsModel model = CppTools::diagnosticConfigsModel(); + if (!model.hasConfigWithId(m_warningConfigId)) + return CppTools::codeModelSettings()->defaultClangDiagnosticConfigId(); return m_warningConfigId; } diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp index a0a980829f..785f15778c 100644 --- a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp +++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp @@ -44,12 +44,7 @@ static Core::Id configIdForProject(ClangProjectSettings &projectSettings) { if (projectSettings.useGlobalConfig()) return CppTools::codeModelSettings()->clangDiagnosticConfigId(); - Core::Id configId = projectSettings.warningConfigId(); - if (!configId.isValid()) { - configId = CppTools::codeModelSettings()->clangDiagnosticConfigId(); - projectSettings.setWarningConfigId(configId); - } - return configId; + return projectSettings.warningConfigId(); } ClangProjectSettingsWidget::ClangProjectSettingsWidget(ProjectExplorer::Project *project) @@ -62,19 +57,20 @@ ClangProjectSettingsWidget::ClangProjectSettingsWidget(ProjectExplorer::Project m_ui.delayedTemplateParseCheckBox->setVisible(Utils::HostOsInfo::isWindowsHost()); connect(m_ui.clangDiagnosticConfigsSelectionWidget, - &ClangDiagnosticConfigsSelectionWidget::currentConfigChanged, - this, &ClangProjectSettingsWidget::onCurrentWarningConfigChanged); - connect(m_ui.clangDiagnosticConfigsSelectionWidget, - &ClangDiagnosticConfigsSelectionWidget::diagnosticConfigsEdited, - this, [this](const ClangDiagnosticConfigs &configs){ - QSharedPointer<CppCodeModelSettings> cmSettings = CppTools::codeModelSettings(); - const ClangDiagnosticConfigsModel configsModel = CppTools::diagnosticConfigsModel(configs); - if (!configsModel.hasConfigWithId(cmSettings->clangDiagnosticConfigId())) - cmSettings->resetClangDiagnosticConfigId(); - cmSettings->setClangCustomDiagnosticConfigs(configs); - cmSettings->toSettings(Core::ICore::settings()); - refreshDiagnosticConfigsWidgetFromSettings(); - }); + &ClangDiagnosticConfigsSelectionWidget::changed, + this, + [this]() { + // Save project's config id + const Core::Id currentConfigId = m_ui.clangDiagnosticConfigsSelectionWidget + ->currentConfigId(); + m_projectSettings.setWarningConfigId(currentConfigId); + + // Save global custom configs + const ClangDiagnosticConfigs configs = m_ui.clangDiagnosticConfigsSelectionWidget + ->customConfigs(); + CppTools::codeModelSettings()->setClangCustomDiagnosticConfigs(configs); + CppTools::codeModelSettings()->toSettings(Core::ICore::settings()); + }); connect(m_ui.delayedTemplateParseCheckBox, &QCheckBox::toggled, this, &ClangProjectSettingsWidget::onDelayedTemplateParseClicked); @@ -92,14 +88,6 @@ ClangProjectSettingsWidget::ClangProjectSettingsWidget(ProjectExplorer::Project syncWidgets(); } -void ClangProjectSettingsWidget::onCurrentWarningConfigChanged(const Core::Id ¤tConfigId) -{ - // Don't save it when we reset the global config in code - if (m_projectSettings.useGlobalConfig()) - return; - m_projectSettings.setWarningConfigId(currentConfigId); -} - void ClangProjectSettingsWidget::onDelayedTemplateParseClicked(bool checked) { // Don't save it when we reset the global config in code @@ -152,11 +140,6 @@ void ClangProjectSettingsWidget::syncOtherWidgetsToComboBox() widget->setEnabled(isCustom); } - refreshDiagnosticConfigsWidgetFromSettings(); -} - -void ClangProjectSettingsWidget::refreshDiagnosticConfigsWidgetFromSettings() -{ m_ui.clangDiagnosticConfigsSelectionWidget->refresh(CppTools::diagnosticConfigsModel(), configIdForProject(m_projectSettings), /*showTidyClazyUi=*/false); diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.h b/src/plugins/clangcodemodel/clangprojectsettingswidget.h index be57a67a13..c1127ee6cb 100644 --- a/src/plugins/clangcodemodel/clangprojectsettingswidget.h +++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.h @@ -44,7 +44,6 @@ public: explicit ClangProjectSettingsWidget(ProjectExplorer::Project *project); private: - void onCurrentWarningConfigChanged(const Core::Id ¤tConfigId); void onDelayedTemplateParseClicked(bool); void onGlobalCustomChanged(int index); void onAboutToSaveProjectSettings(); @@ -53,8 +52,6 @@ private: void syncGlobalCustomComboBox(); void syncOtherWidgetsToComboBox(); - void refreshDiagnosticConfigsWidgetFromSettings(); - private: Ui::ClangProjectSettingsWidget m_ui; ClangProjectSettings &m_projectSettings; diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp index 15a86e9d32..b7a8c14a42 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp @@ -29,9 +29,11 @@ #include "clangtool.h" #include "clangtoolsconstants.h" #include "clangtoolsprojectsettings.h" +#include "clangtoolssettings.h" #include "clangtoolsutils.h" #include <coreplugin/icore.h> +#include <cpptools/clangdiagnosticconfigsselectionwidget.h> #include <utils/qtcassert.h> @@ -72,7 +74,7 @@ ProjectSettingsWidget::ProjectSettingsWidget(ProjectExplorer::Project *project, { m_ui->setupUi(this); - // Use global/custom settings + // Use global/custom settings combo box const int globalOrCustomIndex = m_projectSettings->useGlobalSettings() ? UseGlobalSettings : UseCustomSettings; m_ui->globalCustomComboBox->setCurrentIndex(globalOrCustomIndex); @@ -80,45 +82,36 @@ ProjectSettingsWidget::ProjectSettingsWidget(ProjectExplorer::Project *project, connect(m_ui->globalCustomComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, - &ProjectSettingsWidget::onGlobalCustomChanged); + QOverload<int>::of(&ProjectSettingsWidget::onGlobalCustomChanged)); - // Restore global settings + // Global settings + connect(ClangToolsSettings::instance(), + &ClangToolsSettings::changed, + this, + QOverload<>::of(&ProjectSettingsWidget::onGlobalCustomChanged)); connect(m_ui->restoreGlobal, &QPushButton::clicked, this, [this]() { m_ui->runSettingsWidget->fromSettings(ClangToolsSettings::instance()->runSettings()); }); // Links - connect(m_ui->gotoGlobalSettingsLabel, &QLabel::linkActivated, [](const QString &){ + connect(m_ui->gotoGlobalSettingsLabel, &QLabel::linkActivated, [](const QString &) { Core::ICore::showOptionsDialog(ClangTools::Constants::SETTINGS_PAGE_ID); }); - connect(m_ui->gotoAnalyzerModeLabel, &QLabel::linkActivated, [](const QString &){ + connect(m_ui->gotoAnalyzerModeLabel, &QLabel::linkActivated, [](const QString &) { ClangTool::instance()->selectPerspective(); }); // Run options - m_ui->runSettingsWidget->fromSettings(m_projectSettings->runSettings()); connect(m_ui->runSettingsWidget, &RunSettingsWidget::changed, [this]() { + // Save project run settings m_projectSettings->setRunSettings(m_ui->runSettingsWidget->toSettings()); - }); - connect(m_ui->runSettingsWidget, - &RunSettingsWidget::diagnosticConfigsEdited, - this, - [this](const CppTools::ClangDiagnosticConfigs &configs) { - const CppTools::ClangDiagnosticConfigsModel configsModel = diagnosticConfigsModel( - configs); - RunSettings runSettings = m_projectSettings->runSettings(); - if (!configsModel.hasConfigWithId(runSettings.diagnosticConfigId())) { - runSettings.resetDiagnosticConfigId(); - m_projectSettings->setRunSettings(runSettings); - } - ClangToolsSettings::instance()->setDiagnosticConfigs(configs); - ClangToolsSettings::instance()->writeSettings(); - m_ui->runSettingsWidget->fromSettings(runSettings); - }); - connect(ClangToolsSettings::instance(), &ClangToolsSettings::changed, - this, [this](){ - m_ui->runSettingsWidget->fromSettings(m_projectSettings->runSettings()); + + // Save global custom configs + const CppTools::ClangDiagnosticConfigs configs + = m_ui->runSettingsWidget->diagnosticSelectionWidget()->customConfigs(); + ClangToolsSettings::instance()->setDiagnosticConfigs(configs); + ClangToolsSettings::instance()->writeSettings(); }); // Suppressed diagnostics @@ -146,11 +139,20 @@ ProjectSettingsWidget::~ProjectSettingsWidget() delete m_ui; } +void ProjectSettingsWidget::onGlobalCustomChanged() +{ + onGlobalCustomChanged(m_ui->globalCustomComboBox->currentIndex()); +} + void ProjectSettingsWidget::onGlobalCustomChanged(int index) { const bool useGlobal = index == UseGlobalSettings; + const RunSettings runSettings = useGlobal ? ClangToolsSettings::instance()->runSettings() + : m_projectSettings->runSettings(); + m_ui->runSettingsWidget->fromSettings(runSettings); m_ui->runSettingsWidget->setEnabled(!useGlobal); m_ui->restoreGlobal->setEnabled(!useGlobal); + m_projectSettings->setUseGlobalSettings(useGlobal); } @@ -181,7 +183,6 @@ void ProjectSettingsWidget::removeSelected() m_projectSettings->removeSuppressedDiagnostic(model->diagnosticAt(selectedRows.first().row())); } - void SuppressedDiagnosticsModel::setDiagnostics(const SuppressedDiagnosticsList &diagnostics) { beginResetModel(); diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.h b/src/plugins/clangtools/clangtoolsprojectsettingswidget.h index a014dd804e..b26fee90e3 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.h +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.h @@ -44,6 +44,7 @@ public: ~ProjectSettingsWidget() override; private: + void onGlobalCustomChanged(); void onGlobalCustomChanged(int index); void updateButtonStates(); diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.ui b/src/plugins/clangtools/clangtoolsprojectsettingswidget.ui index b8263a450a..68d4aa217c 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.ui +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>615</width> + <width>634</width> <height>399</height> </rect> </property> @@ -40,7 +40,7 @@ <item> <widget class="QLabel" name="gotoGlobalSettingsLabel"> <property name="text"> - <string><a href="target">Show Global Settings</a></string> + <string><a href="target">Open Global Settings</a></string> </property> </widget> </item> diff --git a/src/plugins/clangtools/clangtoolssettings.cpp b/src/plugins/clangtools/clangtoolssettings.cpp index 2e71d3cf62..6b817fec4f 100644 --- a/src/plugins/clangtools/clangtoolssettings.cpp +++ b/src/plugins/clangtools/clangtoolssettings.cpp @@ -26,6 +26,7 @@ #include "clangtoolssettings.h" #include "clangtoolsconstants.h" +#include "clangtoolsutils.h" #include <coreplugin/icore.h> #include <cpptools/clangdiagnosticconfig.h> @@ -74,9 +75,11 @@ void RunSettings::toMap(QVariantMap &map, const QString &prefix) const map.insert(prefix + buildBeforeAnalysisKey, m_buildBeforeAnalysis); } -void RunSettings::resetDiagnosticConfigId() +Core::Id RunSettings::diagnosticConfigId() const { - m_diagnosticConfigId = defaultDiagnosticId(); + if (!diagnosticConfigsModel().hasConfigWithId(m_diagnosticConfigId)) + return defaultDiagnosticId(); + return m_diagnosticConfigId; } ClangToolsSettings::ClangToolsSettings() @@ -148,7 +151,7 @@ void ClangToolsSettings::readSettings() write = true; } else { QVariantMap defaults; - defaults.insert(diagnosticConfigIdKey, m_runSettings.diagnosticConfigId().toSetting()); + defaults.insert(diagnosticConfigIdKey, defaultDiagnosticId().toSetting()); defaults.insert(parallelJobsKey, m_runSettings.parallelJobs()); defaults.insert(buildBeforeAnalysisKey, m_runSettings.buildBeforeAnalysis()); map = defaults; diff --git a/src/plugins/clangtools/clangtoolssettings.h b/src/plugins/clangtools/clangtoolssettings.h index aaa52011b1..fd7022ba6c 100644 --- a/src/plugins/clangtools/clangtoolssettings.h +++ b/src/plugins/clangtools/clangtoolssettings.h @@ -44,9 +44,8 @@ public: void fromMap(const QVariantMap &map, const QString &prefix = QString()); void toMap(QVariantMap &map, const QString &prefix = QString()) const; - Core::Id diagnosticConfigId() const { return m_diagnosticConfigId; } + Core::Id diagnosticConfigId() const; void setDiagnosticConfigId(const Core::Id &id) { m_diagnosticConfigId = id; } - void resetDiagnosticConfigId(); bool buildBeforeAnalysis() const { return m_buildBeforeAnalysis; } void setBuildBeforeAnalysis(bool yesno) { m_buildBeforeAnalysis = yesno; } diff --git a/src/plugins/clangtools/runsettingswidget.cpp b/src/plugins/clangtools/runsettingswidget.cpp index 381d29ea19..2c02354c0e 100644 --- a/src/plugins/clangtools/runsettingswidget.cpp +++ b/src/plugins/clangtools/runsettingswidget.cpp @@ -47,6 +47,11 @@ RunSettingsWidget::~RunSettingsWidget() delete m_ui; } +CppTools::ClangDiagnosticConfigsSelectionWidget *RunSettingsWidget::diagnosticSelectionWidget() +{ + return m_ui->diagnosticWidget; +} + void RunSettingsWidget::fromSettings(const RunSettings &s) { disconnect(m_ui->diagnosticWidget, 0, 0, 0); @@ -54,12 +59,9 @@ void RunSettingsWidget::fromSettings(const RunSettings &s) s.diagnosticConfigId(), /*showTidyClazyUi=*/true); connect(m_ui->diagnosticWidget, - &CppTools::ClangDiagnosticConfigsSelectionWidget::diagnosticConfigsEdited, + &CppTools::ClangDiagnosticConfigsSelectionWidget::changed, this, - &RunSettingsWidget::diagnosticConfigsEdited); - connect(m_ui->diagnosticWidget, - &CppTools::ClangDiagnosticConfigsSelectionWidget::currentConfigChanged, - [this](const Core::Id &) { emit changed(); }); + &RunSettingsWidget::changed); disconnect(m_ui->buildBeforeAnalysis, 0, 0, 0); m_ui->buildBeforeAnalysis->setToolTip(hintAboutBuildBeforeAnalysis()); diff --git a/src/plugins/clangtools/runsettingswidget.h b/src/plugins/clangtools/runsettingswidget.h index 615348c38a..07f5090702 100644 --- a/src/plugins/clangtools/runsettingswidget.h +++ b/src/plugins/clangtools/runsettingswidget.h @@ -29,6 +29,10 @@ #include <QWidget> +namespace CppTools { +class ClangDiagnosticConfigsSelectionWidget; +} + namespace ClangTools { namespace Internal { @@ -46,11 +50,12 @@ public: explicit RunSettingsWidget(QWidget *parent = nullptr); ~RunSettingsWidget(); + CppTools::ClangDiagnosticConfigsSelectionWidget *diagnosticSelectionWidget(); + void fromSettings(const RunSettings &s); RunSettings toSettings() const; signals: - void diagnosticConfigsEdited(const CppTools::ClangDiagnosticConfigs &configs); void changed(); private: diff --git a/src/plugins/clangtools/settingswidget.cpp b/src/plugins/clangtools/settingswidget.cpp index ba619b9f45..d676d57b47 100644 --- a/src/plugins/clangtools/settingswidget.cpp +++ b/src/plugins/clangtools/settingswidget.cpp @@ -31,6 +31,7 @@ #include "clangtoolsutils.h" #include <cpptools/clangdiagnosticconfigsmodel.h> +#include <cpptools/clangdiagnosticconfigsselectionwidget.h> #include <utils/optional.h> @@ -105,29 +106,22 @@ SettingsWidget::SettingsWidget(ClangToolsSettings *settings, QWidget *parent) // m_ui->runSettingsWidget->fromSettings(m_settings->runSettings()); - connect(m_ui->runSettingsWidget, - &RunSettingsWidget::diagnosticConfigsEdited, - this, - [this](const CppTools::ClangDiagnosticConfigs &configs) { - const CppTools::ClangDiagnosticConfigsModel configsModel = diagnosticConfigsModel( - configs); - RunSettings runSettings = m_settings->runSettings(); - if (!configsModel.hasConfigWithId(m_settings->runSettings().diagnosticConfigId())) { - runSettings.resetDiagnosticConfigId(); - m_settings->setRunSettings(runSettings); - } - m_settings->setDiagnosticConfigs(configs); - m_settings->writeSettings(); - m_ui->runSettingsWidget->fromSettings(runSettings); - }); } void SettingsWidget::apply() { + // Executables m_settings->setClangTidyExecutable(m_ui->clangTidyPathChooser->rawPath()); m_settings->setClazyStandaloneExecutable(m_ui->clazyStandalonePathChooser->rawPath()); + + // Run options m_settings->setRunSettings(m_ui->runSettingsWidget->toSettings()); + // Custom configs + const CppTools::ClangDiagnosticConfigs customConfigs + = m_ui->runSettingsWidget->diagnosticSelectionWidget()->customConfigs(); + m_settings->setDiagnosticConfigs(customConfigs); + m_settings->writeSettings(); } diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp index 9a47c3d2f9..b137630274 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp @@ -87,15 +87,6 @@ const ClangDiagnosticConfig &ClangDiagnosticConfigsModel::configWithId(const Cor return m_diagnosticConfigs.at(indexOfConfig(id)); } -QString -ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(const ClangDiagnosticConfig &config) -{ - return config.isReadOnly() - ? QCoreApplication::translate("ClangDiagnosticConfigsModel", "%1 [built-in]") - .arg(config.displayName()) - : config.displayName(); -} - QVector<Core::Id> ClangDiagnosticConfigsModel::changedOrRemovedConfigs( const ClangDiagnosticConfigs &oldConfigs, const ClangDiagnosticConfigs &newConfigs) { diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.h b/src/plugins/cpptools/clangdiagnosticconfigsmodel.h index dab70f0bd7..33b94b6f13 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.h +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.h @@ -52,7 +52,6 @@ public: const ClangDiagnosticConfig &configWithId(const Core::Id &id) const; int indexOfConfig(const Core::Id &id) const; - static QString displayNameWithBuiltinIndication(const ClangDiagnosticConfig &config); static QVector<Core::Id> changedOrRemovedConfigs(const ClangDiagnosticConfigs &oldConfigs, const ClangDiagnosticConfigs &newConfigs); static ClangDiagnosticConfig createCustomConfig(const ClangDiagnosticConfig &config, diff --git a/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp index 29491c9126..184482f037 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp @@ -31,27 +31,30 @@ #include <coreplugin/icore.h> -#include <QComboBox> #include <QDialog> #include <QDialogButtonBox> #include <QHBoxLayout> +#include <QLabel> #include <QPushButton> namespace CppTools { ClangDiagnosticConfigsSelectionWidget::ClangDiagnosticConfigsSelectionWidget(QWidget *parent) : QWidget(parent) - , m_label(new QLabel(tr("Diagnostic Configuration:"), this)) - , m_selectionComboBox(new QComboBox(this)) + , m_label(new QLabel(tr("Diagnostic Configuration:"))) + , m_button(new QPushButton) { auto *layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); layout->addWidget(m_label); - layout->addWidget(m_selectionComboBox, 1); - m_manageButton = new QPushButton(tr("Manage..."), this); - layout->addWidget(m_manageButton); + layout->addWidget(m_button, 1); layout->addStretch(); + + connect(m_button, + &QPushButton::clicked, + this, + &ClangDiagnosticConfigsSelectionWidget::onButtonClicked); } void ClangDiagnosticConfigsSelectionWidget::refresh(const ClangDiagnosticConfigsModel &model, @@ -60,82 +63,50 @@ void ClangDiagnosticConfigsSelectionWidget::refresh(const ClangDiagnosticConfigs { m_showTidyClazyUi = showTidyClazyUi; m_diagnosticConfigsModel = model; + m_currentConfigId = configToSelect; - disconnect(m_manageButton, 0, 0, 0); - connectToClangDiagnosticConfigsDialog(); - - disconnectFromCurrentIndexChanged(); - refresh(configToSelect); - connectToCurrentIndexChanged(); + const ClangDiagnosticConfig config = m_diagnosticConfigsModel.configWithId(configToSelect); + m_button->setText(config.displayName()); } Core::Id ClangDiagnosticConfigsSelectionWidget::currentConfigId() const { - return Core::Id::fromSetting(m_selectionComboBox->currentData()); -} - -void ClangDiagnosticConfigsSelectionWidget::connectToCurrentIndexChanged() -{ - m_currentIndexChangedConnection - = connect(m_selectionComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), - this, [this]() { emit currentConfigChanged(currentConfigId()); }); + return m_currentConfigId; } -void ClangDiagnosticConfigsSelectionWidget::disconnectFromCurrentIndexChanged() +ClangDiagnosticConfigs ClangDiagnosticConfigsSelectionWidget::customConfigs() const { - disconnect(m_currentIndexChangedConnection); + return m_diagnosticConfigsModel.customConfigs(); } -void ClangDiagnosticConfigsSelectionWidget::refresh(Core::Id id) +void ClangDiagnosticConfigsSelectionWidget::onButtonClicked() { - disconnectFromCurrentIndexChanged(); - - int configToSelectIndex = -1; - m_selectionComboBox->clear(); - const int size = m_diagnosticConfigsModel.size(); - for (int i = 0; i < size; ++i) { - const ClangDiagnosticConfig &config = m_diagnosticConfigsModel.at(i); - const QString displayName - = ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(config); - m_selectionComboBox->addItem(displayName, config.id().toSetting()); - - if (id == config.id()) - configToSelectIndex = i; + ClangDiagnosticConfigsWidget *widget + = new ClangDiagnosticConfigsWidget(m_diagnosticConfigsModel.allConfigs(), + m_currentConfigId, + m_showTidyClazyUi); + widget->layout()->setContentsMargins(0, 0, 0, 0); + QDialog dialog; + dialog.setWindowTitle(ClangDiagnosticConfigsWidget::tr("Diagnostic Configurations")); + dialog.setLayout(new QVBoxLayout); + dialog.layout()->addWidget(widget); + auto *buttonsBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + dialog.layout()->addWidget(buttonsBox); + + connect(buttonsBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(buttonsBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + + const bool previousEnableLowerClazyLevels = codeModelSettings()->enableLowerClazyLevels(); + if (dialog.exec() == QDialog::Accepted) { + if (previousEnableLowerClazyLevels != codeModelSettings()->enableLowerClazyLevels()) + codeModelSettings()->toSettings(Core::ICore::settings()); + + m_diagnosticConfigsModel = ClangDiagnosticConfigsModel(widget->configs()); + m_currentConfigId = widget->currentConfig().id(); + m_button->setText(widget->currentConfig().displayName()); + + emit changed(); } - - if (configToSelectIndex != -1) - m_selectionComboBox->setCurrentIndex(configToSelectIndex); - else - emit currentConfigChanged(currentConfigId()); - - connectToCurrentIndexChanged(); -} - -void ClangDiagnosticConfigsSelectionWidget::connectToClangDiagnosticConfigsDialog() -{ - connect(m_manageButton, &QPushButton::clicked, [this]() { - ClangDiagnosticConfigsWidget *widget - = new ClangDiagnosticConfigsWidget(m_diagnosticConfigsModel, - currentConfigId(), - m_showTidyClazyUi); - widget->layout()->setContentsMargins(0, 0, 0, 0); - QDialog dialog; - dialog.setWindowTitle(ClangDiagnosticConfigsWidget::tr("Diagnostic Configurations")); - dialog.setLayout(new QVBoxLayout); - dialog.layout()->addWidget(widget); - auto *buttonsBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - dialog.layout()->addWidget(buttonsBox); - connect(buttonsBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); - connect(buttonsBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); - - const bool previousEnableLowerClazyLevels = codeModelSettings()->enableLowerClazyLevels(); - connect(&dialog, &QDialog::accepted, [this, widget, previousEnableLowerClazyLevels]() { - if (previousEnableLowerClazyLevels != codeModelSettings()->enableLowerClazyLevels()) - codeModelSettings()->toSettings(Core::ICore::settings()); - emit diagnosticConfigsEdited(widget->customConfigs()); - }); - dialog.exec(); - }); } } // CppTools namespace diff --git a/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.h b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.h index d3e5badd27..f650a252da 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.h +++ b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.h @@ -32,7 +32,6 @@ #include <QWidget> QT_BEGIN_NAMESPACE -class QComboBox; class QLabel; class QPushButton; QT_END_NAMESPACE @@ -51,25 +50,20 @@ public: bool showTidyClazyUi); Core::Id currentConfigId() const; + ClangDiagnosticConfigs customConfigs() const; signals: - void diagnosticConfigsEdited(const ClangDiagnosticConfigs &configs); - void currentConfigChanged(const Core::Id ¤tConfigId); + void changed(); private: - void connectToClangDiagnosticConfigsDialog(); - void connectToCurrentIndexChanged(); - void disconnectFromCurrentIndexChanged(); + void onButtonClicked(); - void refresh(Core::Id id); - - QMetaObject::Connection m_currentIndexChangedConnection; - bool m_showTidyClazyUi = true; ClangDiagnosticConfigsModel m_diagnosticConfigsModel; + Core::Id m_currentConfigId; + bool m_showTidyClazyUi = true; QLabel *m_label = nullptr; - QPushButton *m_manageButton = nullptr; - QComboBox *m_selectionComboBox = nullptr; + QPushButton *m_button = nullptr; }; } // CppTools namespace diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp index 7caa9996ee..502ce8c8e2 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp @@ -40,6 +40,7 @@ #include <utils/algorithm.h> #include <utils/executeondestruction.h> #include <utils/qtcassert.h> +#include <utils/treemodel.h> #include <utils/utilsicons.h> #include <QDebug> @@ -568,23 +569,124 @@ private: QStringList m_topics; }; -ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget( - const ClangDiagnosticConfigsModel &configsModel, - const Core::Id &configToSelect, - bool showTidyClazyTabs, - QWidget *parent) +class ConfigNode : public Utils::TreeItem +{ +public: + ConfigNode(const ClangDiagnosticConfig &config) + : config(config) + {} + + QVariant data(int, int role) const override + { + if (role == Qt::DisplayRole) + return config.displayName(); + return QVariant(); + } + + ClangDiagnosticConfig config; +}; + +class GroupNode : public Utils::StaticTreeItem +{ +public: + GroupNode(const QString &text) + : Utils::StaticTreeItem(text) + {} + + Qt::ItemFlags flags(int) const { return 0; } + QVariant data(int column, int role) const + { + if (role == Qt::ForegroundRole) { + // Avoid disabled color. + return QApplication::palette().color(QPalette::ColorGroup::Normal, + QPalette::ColorRole::Text); + } + return Utils::StaticTreeItem::data(column, role); + } +}; + +class ConfigsModel : public Utils::TreeModel<Utils::TreeItem, GroupNode, ConfigNode> +{ + Q_OBJECT + +public: + ConfigsModel(const ClangDiagnosticConfigs &configs) + { + m_builtinRoot = new GroupNode(tr("Built-in")); + m_customRoot = new GroupNode(tr("Custom")); + rootItem()->appendChild(m_builtinRoot); + rootItem()->appendChild(m_customRoot); + + for (const ClangDiagnosticConfig &config : configs) { + Utils::TreeItem *parent = config.isReadOnly() ? m_builtinRoot : m_customRoot; + parent->appendChild(new ConfigNode(config)); + } + } + + int customConfigsCount() const { return m_customRoot->childCount(); } + QModelIndex fallbackConfigIndex() const { return m_builtinRoot->lastChild()->index(); } + + ClangDiagnosticConfigs configs() const + { + ClangDiagnosticConfigs configs; + forItemsAtLevel<2>([&configs](const ConfigNode *node) { + configs << node->config; + }); + return configs; + } + + void appendCustomConfig(const ClangDiagnosticConfig &config) + { + m_customRoot->appendChild(new ConfigNode(config)); + } + + void removeConfig(const Core::Id &id) + { + ConfigNode *node = itemForConfigId(id); + node->parent()->removeChildAt(node->indexInParent()); + } + + ConfigNode *itemForConfigId(const Core::Id &id) const + { + return findItemAtLevel<2>([id](const ConfigNode *node) { + return node->config.id() == id; + }); + } + +private: + Utils::TreeItem *m_builtinRoot = nullptr; + Utils::TreeItem *m_customRoot = nullptr; +}; + +ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(const ClangDiagnosticConfigs &configs, + const Core::Id &configToSelect, + bool showTidyClazyTabs, + QWidget *parent) : QWidget(parent) , m_ui(new Ui::ClangDiagnosticConfigsWidget) - , m_diagnosticConfigsModel(configsModel) - , m_clazyTreeModel(new ClazyChecksTreeModel()) - , m_tidyTreeModel(new TidyChecksTreeModel()) + , m_configsModel(new ConfigsModel(configs)) + , m_clazyTreeModel(new ClazyChecksTreeModel) + , m_tidyTreeModel(new TidyChecksTreeModel) { m_ui->setupUi(this); + m_ui->configsView->setHeaderHidden(true); + m_ui->configsView->setUniformRowHeights(true); + m_ui->configsView->setRootIsDecorated(false); + m_ui->configsView->setModel(m_configsModel); + m_ui->configsView->setCurrentIndex(m_configsModel->itemForConfigId(configToSelect)->index()); + m_ui->configsView->setItemsExpandable(false); + m_ui->configsView->expandAll(); + connect(m_ui->configsView->selectionModel(), + &QItemSelectionModel::currentChanged, + this, + &ClangDiagnosticConfigsWidget::syncToConfigsView); + setupTabs(showTidyClazyTabs); - connectConfigChooserCurrentIndex(); connect(m_ui->copyButton, &QPushButton::clicked, this, &ClangDiagnosticConfigsWidget::onCopyButtonClicked); + connect(m_ui->renameButton, &QPushButton::clicked, + this, &ClangDiagnosticConfigsWidget::onRenameButtonClicked); connect(m_ui->removeButton, &QPushButton::clicked, this, &ClangDiagnosticConfigsWidget::onRemoveButtonClicked); connectClangOnlyOptionsChanged(); @@ -596,7 +698,7 @@ ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget( &QTreeView::clicked, [model = m_clazySortFilterProxyModel](const QModelIndex &index) { openUrl(model, index); }); - syncWidgetsToModel(configToSelect); + syncToConfigsView(); } ClangDiagnosticConfigsWidget::~ClangDiagnosticConfigsWidget() @@ -604,55 +706,62 @@ ClangDiagnosticConfigsWidget::~ClangDiagnosticConfigsWidget() delete m_ui; } -void ClangDiagnosticConfigsWidget::onCurrentConfigChanged(int index) -{ - m_selectedConfigIndex = index; - syncOtherWidgetsToComboBox(); -} - void ClangDiagnosticConfigsWidget::onCopyButtonClicked() { - const ClangDiagnosticConfig &config = selectedConfig(); + const ClangDiagnosticConfig &config = currentConfig(); - bool diaglogAccepted = false; + bool dialogAccepted = false; const QString newName = QInputDialog::getText(this, tr("Copy Diagnostic Configuration"), tr("Diagnostic configuration name:"), QLineEdit::Normal, tr("%1 (Copy)").arg(config.displayName()), - &diaglogAccepted); - if (diaglogAccepted) { + &dialogAccepted); + if (dialogAccepted) { const ClangDiagnosticConfig customConfig = ClangDiagnosticConfigsModel::createCustomConfig(config, newName); - m_diagnosticConfigsModel.appendOrUpdate(customConfig); - emit customConfigsChanged(customConfigs()); - - syncConfigChooserToModel(customConfig.id()); + m_configsModel->appendCustomConfig(customConfig); + m_ui->configsView->setCurrentIndex(m_configsModel->itemForConfigId(customConfig.id())->index()); + syncToConfigsView(); m_clangBaseChecks->diagnosticOptionsTextEdit->setFocus(); } } -const ClangDiagnosticConfig &ClangDiagnosticConfigsWidget::selectedConfig() const +void ClangDiagnosticConfigsWidget::onRenameButtonClicked() { - return m_diagnosticConfigsModel.at(m_selectedConfigIndex); + const ClangDiagnosticConfig &config = currentConfig(); + + bool dialogAccepted = false; + const QString newName = QInputDialog::getText(this, + tr("Rename Diagnostic Configuration"), + tr("New Name:"), + QLineEdit::Normal, + config.displayName(), + &dialogAccepted); + if (dialogAccepted) { + ConfigNode *configNode = m_configsModel->itemForConfigId(config.id()); + configNode->config.setDisplayName(newName); + } } -Core::Id ClangDiagnosticConfigsWidget::selectedConfigId() const +const ClangDiagnosticConfig ClangDiagnosticConfigsWidget::currentConfig() const { - return selectedConfig().id(); + Utils::TreeItem *item = m_configsModel->itemForIndex(m_ui->configsView->currentIndex()); + return static_cast<ConfigNode *>(item)->config; } void ClangDiagnosticConfigsWidget::onRemoveButtonClicked() { - m_diagnosticConfigsModel.removeConfigWithId(selectedConfigId()); - emit customConfigsChanged(customConfigs()); - - syncConfigChooserToModel(); + const Core::Id configToRemove = currentConfig().id(); + if (m_configsModel->customConfigsCount() == 1) + m_ui->configsView->setCurrentIndex(m_configsModel->fallbackConfigIndex()); + m_configsModel->removeConfig(configToRemove); + syncToConfigsView(); } void ClangDiagnosticConfigsWidget::onClangTidyModeChanged(int index) { - ClangDiagnosticConfig config = selectedConfig(); + ClangDiagnosticConfig config = currentConfig(); config.setClangTidyMode(static_cast<ClangDiagnosticConfig::TidyMode>(index)); updateConfig(config); syncClangTidyWidgets(config); @@ -660,7 +769,7 @@ void ClangDiagnosticConfigsWidget::onClangTidyModeChanged(int index) void ClangDiagnosticConfigsWidget::onClangTidyTreeChanged() { - ClangDiagnosticConfig config = selectedConfig(); + ClangDiagnosticConfig config = currentConfig(); config.setClangTidyChecks(m_tidyTreeModel->selectedChecks()); updateConfig(config); } @@ -669,7 +778,7 @@ void ClangDiagnosticConfigsWidget::onClazyTreeChanged() { syncClazyChecksGroupBox(); - ClangDiagnosticConfig config = selectedConfig(); + ClangDiagnosticConfig config = currentConfig(); config.setClazyChecks(m_clazyTreeModel->enabledChecks().join(",")); updateConfig(config); } @@ -725,61 +834,30 @@ void ClangDiagnosticConfigsWidget::onClangOnlyOptionsChanged() updateValidityWidgets(errorMessage); if (!errorMessage.isEmpty()) { // Remember the entered options in case the user will switch back. - m_notAcceptedOptions.insert(selectedConfigId(), diagnosticOptions); + m_notAcceptedOptions.insert(currentConfig().id(), diagnosticOptions); return; } - m_notAcceptedOptions.remove(selectedConfigId()); + m_notAcceptedOptions.remove(currentConfig().id()); // Commit valid changes - ClangDiagnosticConfig updatedConfig = selectedConfig(); + ClangDiagnosticConfig updatedConfig = currentConfig(); updatedConfig.setClangOptions(normalizedOptions); updatedConfig.setUseBuildSystemWarnings(useBuildSystemWarnings); updateConfig(updatedConfig); } -void ClangDiagnosticConfigsWidget::syncWidgetsToModel(const Core::Id &configToSelect) +void ClangDiagnosticConfigsWidget::syncToConfigsView() { - syncConfigChooserToModel(configToSelect); - syncOtherWidgetsToComboBox(); -} - -void ClangDiagnosticConfigsWidget::syncConfigChooserToModel(const Core::Id &configToSelect) -{ - disconnectConfigChooserCurrentIndex(); - - m_ui->configChooserList->clear(); - m_selectedConfigIndex = std::max(std::min(m_selectedConfigIndex, - m_diagnosticConfigsModel.size() - 1), - 0); - - const int size = m_diagnosticConfigsModel.size(); - for (int i = 0; i < size; ++i) { - const ClangDiagnosticConfig &config = m_diagnosticConfigsModel.at(i); - const QString displayName - = ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(config); - m_ui->configChooserList->addItem(displayName); - - if (configToSelect == config.id()) - m_selectedConfigIndex = i; - } - - connectConfigChooserCurrentIndex(); - - m_ui->configChooserList->setCurrentRow(m_selectedConfigIndex); -} - -void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox() -{ - if (isConfigChooserEmpty()) + if (!m_ui->configsView->currentIndex().isValid()) return; disconnectClangOnlyOptionsChanged(); Utils::ExecuteOnDestruction e([this]() { connectClangOnlyOptionsChanged(); }); - const ClangDiagnosticConfig &config = selectedConfig(); - // Update main button row + const ClangDiagnosticConfig &config = currentConfig(); m_ui->removeButton->setEnabled(!config.isReadOnly()); + m_ui->renameButton->setEnabled(!config.isReadOnly()); // Update check box m_clangBaseChecks->useFlagsFromBuildSystemCheckBox->setChecked(config.useBuildSystemWarnings()); @@ -869,13 +947,7 @@ void ClangDiagnosticConfigsWidget::syncClazyChecksGroupBox() void ClangDiagnosticConfigsWidget::updateConfig(const ClangDiagnosticConfig &config) { - m_diagnosticConfigsModel.appendOrUpdate(config); - emit customConfigsChanged(customConfigs()); -} - -bool ClangDiagnosticConfigsWidget::isConfigChooserEmpty() const -{ - return m_ui->configChooserList->count() == 0; + m_configsModel->itemForConfigId(config.id())->config = config; } void ClangDiagnosticConfigsWidget::setDiagnosticOptions(const QString &options) @@ -939,18 +1011,6 @@ void ClangDiagnosticConfigsWidget::disconnectClazyItemChanged() this, &ClangDiagnosticConfigsWidget::onClazyTreeChanged); } -void ClangDiagnosticConfigsWidget::connectConfigChooserCurrentIndex() -{ - connect(m_ui->configChooserList, &QListWidget::currentRowChanged, - this, &ClangDiagnosticConfigsWidget::onCurrentConfigChanged); -} - -void ClangDiagnosticConfigsWidget::disconnectConfigChooserCurrentIndex() -{ - disconnect(m_ui->configChooserList, &QListWidget::currentRowChanged, - this, &ClangDiagnosticConfigsWidget::onCurrentConfigChanged); -} - void ClangDiagnosticConfigsWidget::connectClangOnlyOptionsChanged() { connect(m_clangBaseChecks->useFlagsFromBuildSystemCheckBox, @@ -975,9 +1035,9 @@ void ClangDiagnosticConfigsWidget::disconnectClangOnlyOptionsChanged() &ClangDiagnosticConfigsWidget::onClangOnlyOptionsChanged); } -ClangDiagnosticConfigs ClangDiagnosticConfigsWidget::customConfigs() const +ClangDiagnosticConfigs ClangDiagnosticConfigsWidget::configs() const { - return m_diagnosticConfigsModel.customConfigs(); + return m_configsModel->configs(); } static void setupTreeView(QTreeView *view, QAbstractItemModel *model, int expandToDepth = 0) @@ -1038,7 +1098,7 @@ void ClangDiagnosticConfigsWidget::setupTabs(bool showTidyClazyTabs) setupTreeView(m_tidyChecks->checksPrefixesTree, m_tidyTreeModel.get()); connect(m_tidyChecks->plainTextEditButton, &QPushButton::clicked, this, [this]() { - const bool readOnly = selectedConfig().isReadOnly(); + const bool readOnly = currentConfig().isReadOnly(); QDialog dialog; dialog.setWindowTitle(tr("Checks")); diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.h b/src/plugins/cpptools/clangdiagnosticconfigswidget.h index 412170ba59..76adb1c012 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.h +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.h @@ -28,7 +28,6 @@ #include "cpptools_global.h" #include "clangdiagnosticconfig.h" -#include "clangdiagnosticconfigsmodel.h" #include <QHash> #include <QWidget> @@ -49,6 +48,7 @@ class ClazyChecks; class TidyChecks; } +class ConfigsModel; class TidyChecksTreeModel; class ClazyChecksTreeModel; class ClazyChecksSortFilterModel; @@ -58,22 +58,20 @@ class CPPTOOLS_EXPORT ClangDiagnosticConfigsWidget : public QWidget Q_OBJECT public: - explicit ClangDiagnosticConfigsWidget(const ClangDiagnosticConfigsModel &configsModel, + explicit ClangDiagnosticConfigsWidget(const ClangDiagnosticConfigs &configs, const Core::Id &configToSelect, bool showTidyClazyTabs, QWidget *parent = nullptr); ~ClangDiagnosticConfigsWidget() override; - ClangDiagnosticConfigs customConfigs() const; - -signals: - void customConfigsChanged(const CppTools::ClangDiagnosticConfigs &customConfigs); + ClangDiagnosticConfigs configs() const; + const ClangDiagnosticConfig currentConfig() const; private: void setupTabs(bool showTidyClazyTabs); - void onCurrentConfigChanged(int index); void onCopyButtonClicked(); + void onRenameButtonClicked(); void onRemoveButtonClicked(); void onClangTidyModeChanged(int index); void onClangTidyTreeChanged(); @@ -82,9 +80,7 @@ private: void onClangOnlyOptionsChanged(); - void syncWidgetsToModel(const Core::Id &configToSelect = Core::Id()); - void syncConfigChooserToModel(const Core::Id &configToSelect = Core::Id()); - void syncOtherWidgetsToComboBox(); + void syncToConfigsView(); void syncClangTidyWidgets(const ClangDiagnosticConfig &config); void syncClazyWidgets(const ClangDiagnosticConfig &config); void syncClazyChecksGroupBox(); @@ -92,10 +88,6 @@ private: void updateConfig(const CppTools::ClangDiagnosticConfig &config); - bool isConfigChooserEmpty() const; - const ClangDiagnosticConfig &selectedConfig() const; - Core::Id selectedConfigId() const; - void setDiagnosticOptions(const QString &options); void updateValidityWidgets(const QString &errorMessage); @@ -105,14 +97,12 @@ private: void connectClazyItemChanged(); void disconnectClazyItemChanged(); - void connectConfigChooserCurrentIndex(); - void disconnectConfigChooserCurrentIndex(); void connectClangOnlyOptionsChanged(); void disconnectClangOnlyOptionsChanged(); private: Ui::ClangDiagnosticConfigsWidget *m_ui; - ClangDiagnosticConfigsModel m_diagnosticConfigsModel; + ConfigsModel *m_configsModel = nullptr; QHash<Core::Id, QString> m_notAcceptedOptions; std::unique_ptr<CppTools::Ui::ClangBaseChecks> m_clangBaseChecks; @@ -126,8 +116,6 @@ private: std::unique_ptr<CppTools::Ui::TidyChecks> m_tidyChecks; QWidget *m_tidyChecksWidget = nullptr; std::unique_ptr<TidyChecksTreeModel> m_tidyTreeModel; - - int m_selectedConfigIndex = 0; }; } // CppTools namespace diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.ui b/src/plugins/cpptools/clangdiagnosticconfigswidget.ui index e80ccef4fe..b2b62f955a 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.ui +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.ui @@ -17,20 +17,7 @@ <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> - <widget class="QListWidget" name="configChooserList"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>156</height> - </size> - </property> - </widget> + <widget class="QTreeView" name="configsView"/> </item> <item> <layout class="QVBoxLayout" name="verticalLayout_3"> @@ -42,6 +29,13 @@ </widget> </item> <item> + <widget class="QPushButton" name="renameButton"> + <property name="text"> + <string>Rename...</string> + </property> + </widget> + </item> + <item> <widget class="QPushButton" name="removeButton"> <property name="text"> <string>Remove</string> @@ -53,13 +47,10 @@ <property name="orientation"> <enum>Qt::Vertical</enum> </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> - <height>100</height> + <height>40</height> </size> </property> </spacer> @@ -69,9 +60,6 @@ </layout> </item> <item> - <layout class="QHBoxLayout" name="horizontalLayout"/> - </item> - <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index a4fe8fd088..8b8874c958 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -196,6 +196,8 @@ void CppCodeModelSettings::toSettings(QSettings *s) Core::Id CppCodeModelSettings::clangDiagnosticConfigId() const { + if (!diagnosticConfigsModel().hasConfigWithId(m_clangDiagnosticConfigId)) + return defaultClangDiagnosticConfigId(); return m_clangDiagnosticConfigId; } @@ -204,9 +206,9 @@ void CppCodeModelSettings::setClangDiagnosticConfigId(const Core::Id &configId) m_clangDiagnosticConfigId = configId; } -void CppCodeModelSettings::resetClangDiagnosticConfigId() +Core::Id CppCodeModelSettings::defaultClangDiagnosticConfigId() { - m_clangDiagnosticConfigId = initialClangDiagnosticConfigId(); + return initialClangDiagnosticConfigId(); } const ClangDiagnosticConfig CppCodeModelSettings::clangDiagnosticConfig() const diff --git a/src/plugins/cpptools/cppcodemodelsettings.h b/src/plugins/cpptools/cppcodemodelsettings.h index b19d6e3e62..99b7e35dbb 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.h +++ b/src/plugins/cpptools/cppcodemodelsettings.h @@ -55,7 +55,7 @@ public: public: Core::Id clangDiagnosticConfigId() const; void setClangDiagnosticConfigId(const Core::Id &configId); - void resetClangDiagnosticConfigId(); + static Core::Id defaultClangDiagnosticConfigId() ; const ClangDiagnosticConfig clangDiagnosticConfig() const; ClangDiagnosticConfigs clangCustomDiagnosticConfigs() const; diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.cpp b/src/plugins/cpptools/cppcodemodelsettingspage.cpp index c700899f00..d1717c0de0 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.cpp +++ b/src/plugins/cpptools/cppcodemodelsettingspage.cpp @@ -75,23 +75,6 @@ void CppCodeModelSettingsWidget::setupClangCodeModelWidgets() m_settings->clangDiagnosticConfigId(), /*showTidyClazyUi=*/false); - connect(m_ui->clangDiagnosticConfigsSelectionWidget, - &ClangDiagnosticConfigsSelectionWidget::diagnosticConfigsEdited, - this, - [this](const ClangDiagnosticConfigs &configs) { - const ClangDiagnosticConfigsModel configsModel = diagnosticConfigsModel(configs); - if (!configsModel.hasConfigWithId(m_settings->clangDiagnosticConfigId())) - m_settings->resetClangDiagnosticConfigId(); - m_settings->setClangCustomDiagnosticConfigs(configs); - applyClangCodeModelWidgetsToSettings(); - m_settings->toSettings(Core::ICore::settings()); - - m_ui->clangDiagnosticConfigsSelectionWidget - ->refresh(configsModel, - m_settings->clangDiagnosticConfigId(), - /*showTidyClazyUi=*/false); - }); - const bool isClangActive = CppModelManager::instance()->isClangCodeModelActive(); m_ui->clangCodeModelIsDisabledHint->setVisible(!isClangActive); m_ui->clangCodeModelIsEnabledHint->setVisible(isClangActive); @@ -116,14 +99,24 @@ void CppCodeModelSettingsWidget::setupGeneralWidgets() bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const { + bool changed = false; + const Core::Id oldConfigId = m_settings->clangDiagnosticConfigId(); const Core::Id currentConfigId = m_ui->clangDiagnosticConfigsSelectionWidget->currentConfigId(); if (oldConfigId != currentConfigId) { m_settings->setClangDiagnosticConfigId(currentConfigId); - return true; + changed = true; + } + + const ClangDiagnosticConfigs oldConfigs = m_settings->clangCustomDiagnosticConfigs(); + const ClangDiagnosticConfigs currentConfigs = m_ui->clangDiagnosticConfigsSelectionWidget + ->customConfigs(); + if (oldConfigs != currentConfigs) { + m_settings->setClangCustomDiagnosticConfigs(currentConfigs); + changed = true; } - return false; + return changed; } bool CppCodeModelSettingsWidget::applyGeneralWidgetsToSettings() const |