diff options
Diffstat (limited to 'src/plugins/cpptools')
10 files changed, 235 insertions, 249 deletions
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 |