aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-05-04 15:58:41 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-05-14 07:02:53 +0000
commit3737b6a12468ef4edf3eadf531203914d081e622 (patch)
treeb216522987a6a93c8587132ea31c88530125553f /src
parent6b70c27e3b5116bd27b17b007646836252d69225 (diff)
CppTools: Split diagnostic settings and selection
Now selection is only consists of combobox and a "Manage" button to diagnostic configurations. Diagnostic configurations are moved to the modal dialog which is shown by clicking the mentioned "Manage" button. Change-Id: I607fb923c97e8730448548708f3aaf32ce1983c8 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/clangcodemodel/clangprojectsettingswidget.cpp50
-rw-r--r--src/plugins/clangcodemodel/clangprojectsettingswidget.h10
-rw-r--r--src/plugins/clangcodemodel/clangprojectsettingswidget.ui56
-rw-r--r--src/plugins/clangtools/clangtoolruncontrol.cpp2
-rw-r--r--src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp87
-rw-r--r--src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.h58
-rw-r--r--src/plugins/cpptools/clangdiagnosticconfigswidget.cpp115
-rw-r--r--src/plugins/cpptools/clangdiagnosticconfigswidget.h20
-rw-r--r--src/plugins/cpptools/cppcodemodelsettingspage.cpp38
-rw-r--r--src/plugins/cpptools/cppcodemodelsettingspage.h5
-rw-r--r--src/plugins/cpptools/cppcodemodelsettingspage.ui63
-rw-r--r--src/plugins/cpptools/cpptools.pro4
-rw-r--r--src/plugins/cpptools/cpptools.qbs2
-rw-r--r--src/plugins/cpptools/cpptoolsconstants.h2
14 files changed, 364 insertions, 148 deletions
diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp
index fcee2b1dd8..6b25d99ecf 100644
--- a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp
+++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp
@@ -59,19 +59,14 @@ ClangProjectSettingsWidget::ClangProjectSettingsWidget(ProjectExplorer::Project
using namespace CppTools;
- m_diagnosticConfigWidget = new ClangDiagnosticConfigsWidget;
- refreshDiagnosticConfigsWidgetFromSettings();
-
m_ui.generalConfigurationGroupBox->setVisible(Utils::HostOsInfo::isWindowsHost());
m_ui.clangSettings->setCurrentIndex(m_projectSettings.useGlobalConfig() ? 0 : 1);
- syncOtherWidgetsToComboBox();
- connectToCppCodeModelSettingsChanged();
- connect(m_diagnosticConfigWidget.data(), &ClangDiagnosticConfigsWidget::currentConfigChanged,
+ connect(m_ui.clangDiagnosticConfigsSelectionWidget,
+ &ClangDiagnosticConfigsSelectionWidget::currentConfigChanged,
this, &ClangProjectSettingsWidget::onCurrentWarningConfigChanged);
- connect(m_diagnosticConfigWidget.data(), &ClangDiagnosticConfigsWidget::customConfigsChanged,
- this, &ClangProjectSettingsWidget::onCustomWarningConfigsChanged);
+
connect(m_ui.delayedTemplateParse, &QCheckBox::toggled,
this, &ClangProjectSettingsWidget::onDelayedTemplateParseClicked);
connect(m_ui.clangSettings,
@@ -80,7 +75,12 @@ ClangProjectSettingsWidget::ClangProjectSettingsWidget(ProjectExplorer::Project
connect(project, &ProjectExplorer::Project::aboutToSaveSettings,
this, &ClangProjectSettingsWidget::onAboutToSaveProjectSettings);
- m_ui.diagnosticConfigurationGroupBox->layout()->addWidget(m_diagnosticConfigWidget);
+ connect(CppTools::codeModelSettings().data(), &CppTools::CppCodeModelSettings::changed,
+ this, &ClangProjectSettingsWidget::syncOtherWidgetsToComboBox);
+
+ connectToClangDiagnosticConfigsDialog(m_ui.manageButton);
+
+ syncOtherWidgetsToComboBox();
}
void ClangProjectSettingsWidget::onCurrentWarningConfigChanged(const Core::Id &currentConfigId)
@@ -91,18 +91,6 @@ void ClangProjectSettingsWidget::onCurrentWarningConfigChanged(const Core::Id &c
m_projectSettings.setWarningConfigId(currentConfigId);
}
-void ClangProjectSettingsWidget::onCustomWarningConfigsChanged(
- const CppTools::ClangDiagnosticConfigs &customConfigs)
-{
- disconnectFromCppCodeModelSettingsChanged();
-
- const QSharedPointer<CppTools::CppCodeModelSettings> codeModelSettings
- = CppTools::codeModelSettings();
- codeModelSettings->setClangCustomDiagnosticConfigs(customConfigs);
-
- connectToCppCodeModelSettingsChanged();
-}
-
void ClangProjectSettingsWidget::onDelayedTemplateParseClicked(bool checked)
{
// Don't save it when we reset the global config in code
@@ -137,29 +125,15 @@ void ClangProjectSettingsWidget::syncOtherWidgetsToComboBox()
const bool isCustom = !m_projectSettings.useGlobalConfig();
m_ui.generalConfigurationGroupBox->setEnabled(isCustom);
- m_ui.diagnosticConfigurationGroupBox->setEnabled(isCustom);
+ m_ui.clangDiagnosticsLabel->setEnabled(isCustom);
+ m_ui.clangDiagnosticConfigsSelectionWidget->setEnabled(isCustom);
refreshDiagnosticConfigsWidgetFromSettings();
}
void ClangProjectSettingsWidget::refreshDiagnosticConfigsWidgetFromSettings()
{
- CppTools::ClangDiagnosticConfigsModel configsModel(
- CppTools::codeModelSettings()->clangCustomDiagnosticConfigs());
- m_diagnosticConfigWidget->refresh(configsModel,
- configIdForProject(m_projectSettings));
-}
-
-void ClangProjectSettingsWidget::connectToCppCodeModelSettingsChanged()
-{
- connect(CppTools::codeModelSettings().data(), &CppTools::CppCodeModelSettings::changed,
- this, &ClangProjectSettingsWidget::refreshDiagnosticConfigsWidgetFromSettings);
-}
-
-void ClangProjectSettingsWidget::disconnectFromCppCodeModelSettingsChanged()
-{
- disconnect(CppTools::codeModelSettings().data(), &CppTools::CppCodeModelSettings::changed,
- this, &ClangProjectSettingsWidget::refreshDiagnosticConfigsWidgetFromSettings);
+ m_ui.clangDiagnosticConfigsSelectionWidget->refresh(configIdForProject(m_projectSettings));
}
} // namespace Internal
diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.h b/src/plugins/clangcodemodel/clangprojectsettingswidget.h
index 57d5d1210b..de4c52d798 100644
--- a/src/plugins/clangcodemodel/clangprojectsettingswidget.h
+++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.h
@@ -29,12 +29,9 @@
#include "clangprojectsettings.h"
-#include <cpptools/clangdiagnosticconfigsmodel.h>
-
#include <QPointer>
namespace ProjectExplorer { class Project; }
-namespace CppTools { class ClangDiagnosticConfigsWidget; }
namespace ClangCodeModel {
namespace Internal {
@@ -48,19 +45,16 @@ public:
private:
void onCurrentWarningConfigChanged(const Core::Id &currentConfigId);
- void onCustomWarningConfigsChanged(const CppTools::ClangDiagnosticConfigs &customConfigs);
void onDelayedTemplateParseClicked(bool);
void onClangSettingsChanged(int index);
void onAboutToSaveProjectSettings();
- void refreshDiagnosticConfigsWidgetFromSettings();
- void connectToCppCodeModelSettingsChanged();
- void disconnectFromCppCodeModelSettingsChanged();
void syncOtherWidgetsToComboBox();
+ void refreshDiagnosticConfigsWidgetFromSettings();
+
private:
Ui::ClangProjectSettingsWidget m_ui;
ClangProjectSettings &m_projectSettings;
- QPointer<CppTools::ClangDiagnosticConfigsWidget> m_diagnosticConfigWidget;
};
} // namespace Internal
diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.ui b/src/plugins/clangcodemodel/clangprojectsettingswidget.ui
index 997554b38b..00a0fe4332 100644
--- a/src/plugins/clangcodemodel/clangprojectsettingswidget.ui
+++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.ui
@@ -61,15 +61,61 @@ However, using the relaxed and extended rules means also that no highlighting/co
</widget>
</item>
<item>
- <widget class="QGroupBox" name="diagnosticConfigurationGroupBox">
- <property name="title">
- <string>Warnings</string>
+ <layout class="QHBoxLayout" name="clangDiagnosticsLayout">
+ <item>
+ <widget class="QLabel" name="clangDiagnosticsLabel">
+ <property name="text">
+ <string>Diagnostic Configuration:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="CppTools::ClangDiagnosticConfigsSelectionWidget" name="clangDiagnosticConfigsSelectionWidget" native="true"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="manageButton">
+ <property name="text">
+ <string>Manage...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_2"/>
- </widget>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
</item>
</layout>
</widget>
+ <customwidgets>
+ <customwidget>
+ <class>CppTools::ClangDiagnosticConfigsSelectionWidget</class>
+ <extends>QWidget</extends>
+ <header>cpptools/clangdiagnosticconfigsselectionwidget.h</header>
+ </customwidget>
+ </customwidgets>
<resources/>
<connections/>
</ui>
diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp
index cb6548cdaa..7e53fe3818 100644
--- a/src/plugins/clangtools/clangtoolruncontrol.cpp
+++ b/src/plugins/clangtools/clangtoolruncontrol.cpp
@@ -274,7 +274,7 @@ void ClangToolRunControl::start()
const QString &toolName = tool()->name();
if (m_clangExecutable.isEmpty()) {
- const QString errorMessage = tr("%1 : Can't find clang executable, stop.").arg(toolName);
+ const QString errorMessage = tr("%1: Can't find clang executable, stop.").arg(toolName);
appendMessage(errorMessage, Utils::ErrorMessageFormat);
TaskHub::addTask(Task::Error, errorMessage, Debugger::Constants::ANALYZERTASK_ID);
TaskHub::requestPopup();
diff --git a/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp
new file mode 100644
index 0000000000..e3038d3aa3
--- /dev/null
+++ b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 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 "clangdiagnosticconfigsselectionwidget.h"
+
+#include "cppcodemodelsettings.h"
+#include "cpptoolsreuse.h"
+
+namespace CppTools {
+
+ClangDiagnosticConfigsSelectionWidget::ClangDiagnosticConfigsSelectionWidget(QWidget *parent)
+ : QComboBox(parent)
+{
+ refresh(codeModelSettings()->clangDiagnosticConfigId());
+
+ connectToCurrentIndexChanged();
+}
+
+Core::Id ClangDiagnosticConfigsSelectionWidget::currentConfigId() const
+{
+ return Core::Id::fromSetting(currentData());
+}
+
+void ClangDiagnosticConfigsSelectionWidget::connectToCurrentIndexChanged()
+{
+ m_currentIndexChangedConnection
+ = connect(this,
+ static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+ this,
+ [this]() { emit currentConfigChanged(currentConfigId()); });
+}
+
+void ClangDiagnosticConfigsSelectionWidget::disconnectFromCurrentIndexChanged()
+{
+ disconnect(m_currentIndexChangedConnection);
+}
+
+void ClangDiagnosticConfigsSelectionWidget::refresh(Core::Id id)
+{
+ disconnectFromCurrentIndexChanged();
+
+ int configToSelectIndex = -1;
+ clear();
+ m_diagnosticConfigsModel = ClangDiagnosticConfigsModel(
+ codeModelSettings()->clangCustomDiagnosticConfigs());
+ 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);
+ addItem(displayName, config.id().toSetting());
+
+ if (id == config.id())
+ configToSelectIndex = i;
+ }
+
+ if (configToSelectIndex != -1)
+ setCurrentIndex(configToSelectIndex);
+ else
+ emit currentConfigChanged(currentConfigId());
+
+ connectToCurrentIndexChanged();
+}
+
+} // CppTools namespace
diff --git a/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.h b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.h
new file mode 100644
index 0000000000..597f11918a
--- /dev/null
+++ b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 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 "cpptools_global.h"
+
+#include "clangdiagnosticconfigsmodel.h"
+
+#include <QComboBox>
+
+namespace CppTools {
+
+class CPPTOOLS_EXPORT ClangDiagnosticConfigsSelectionWidget : public QComboBox
+{
+ Q_OBJECT
+
+public:
+ explicit ClangDiagnosticConfigsSelectionWidget(QWidget *parent = nullptr);
+
+ Core::Id currentConfigId() const;
+
+ void refresh(Core::Id id);
+
+signals:
+ void currentConfigChanged(const Core::Id &currentConfigId);
+
+private:
+ void connectToCurrentIndexChanged();
+ void disconnectFromCurrentIndexChanged();
+
+ QMetaObject::Connection m_currentIndexChangedConnection;
+ ClangDiagnosticConfigsModel m_diagnosticConfigsModel;
+};
+
+} // CppTools namespace
diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp
index f9521d4fda..01d5d8fe6d 100644
--- a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp
+++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp
@@ -24,32 +24,39 @@
****************************************************************************/
#include "clangdiagnosticconfigswidget.h"
+
+#include "cppcodemodelsettings.h"
+#include "cpptoolsreuse.h"
#include "ui_clangdiagnosticconfigswidget.h"
#include "ui_clangbasechecks.h"
#include "ui_clazychecks.h"
#include "ui_tidychecks.h"
+#include <coreplugin/icore.h>
+
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
#include <utils/utilsicons.h>
#include <QDebug>
+#include <QDialogButtonBox>
#include <QInputDialog>
+#include <QPushButton>
#include <QUuid>
namespace CppTools {
-ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(
- const ClangDiagnosticConfigsModel &diagnosticConfigsModel,
- const Core::Id &configToSelect,
- QWidget *parent)
+ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(QWidget *parent)
: QWidget(parent)
, m_ui(new Ui::ClangDiagnosticConfigsWidget)
- , m_diagnosticConfigsModel(diagnosticConfigsModel)
+ , m_diagnosticConfigsModel(codeModelSettings()->clangCustomDiagnosticConfigs())
{
m_ui->setupUi(this);
setupTabs();
+ m_selectedConfigIndex = m_diagnosticConfigsModel.indexOfConfig(
+ codeModelSettings()->clangDiagnosticConfigId());
+
connectConfigChooserCurrentIndex();
connect(m_ui->copyButton, &QPushButton::clicked,
this, &ClangDiagnosticConfigsWidget::onCopyButtonClicked);
@@ -57,7 +64,7 @@ ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(
this, &ClangDiagnosticConfigsWidget::onRemoveButtonClicked);
connectDiagnosticOptionsChanged();
- syncWidgetsToModel(configToSelect);
+ syncWidgetsToModel();
}
ClangDiagnosticConfigsWidget::~ClangDiagnosticConfigsWidget()
@@ -65,11 +72,10 @@ ClangDiagnosticConfigsWidget::~ClangDiagnosticConfigsWidget()
delete m_ui;
}
-void ClangDiagnosticConfigsWidget::onCurrentConfigChanged(int)
+void ClangDiagnosticConfigsWidget::onCurrentConfigChanged(int index)
{
+ m_selectedConfigIndex = index;
syncOtherWidgetsToComboBox();
-
- emit currentConfigChanged(currentConfigId());
}
static ClangDiagnosticConfig createCustomConfig(const ClangDiagnosticConfig &config,
@@ -85,7 +91,7 @@ static ClangDiagnosticConfig createCustomConfig(const ClangDiagnosticConfig &con
void ClangDiagnosticConfigsWidget::onCopyButtonClicked()
{
- const ClangDiagnosticConfig &config = currentConfig();
+ const ClangDiagnosticConfig &config = selectedConfig();
bool diaglogAccepted = false;
const QString newName = QInputDialog::getText(this,
@@ -104,9 +110,19 @@ void ClangDiagnosticConfigsWidget::onCopyButtonClicked()
}
}
+const ClangDiagnosticConfig &ClangDiagnosticConfigsWidget::selectedConfig() const
+{
+ return m_diagnosticConfigsModel.at(m_selectedConfigIndex);
+}
+
+Core::Id ClangDiagnosticConfigsWidget::selectedConfigId() const
+{
+ return selectedConfig().id();
+}
+
void ClangDiagnosticConfigsWidget::onRemoveButtonClicked()
{
- m_diagnosticConfigsModel.removeConfigWithId(currentConfigId());
+ m_diagnosticConfigsModel.removeConfigWithId(selectedConfigId());
emit customConfigsChanged(customConfigs());
syncConfigChooserToModel();
@@ -114,7 +130,7 @@ void ClangDiagnosticConfigsWidget::onRemoveButtonClicked()
void ClangDiagnosticConfigsWidget::onClangTidyModeChanged(int index)
{
- ClangDiagnosticConfig config = currentConfig();
+ ClangDiagnosticConfig config = selectedConfig();
config.setClangTidyMode(static_cast<ClangDiagnosticConfig::TidyMode>(index));
updateConfig(config);
syncClangTidyWidgets(config);
@@ -123,7 +139,7 @@ void ClangDiagnosticConfigsWidget::onClangTidyModeChanged(int index)
void ClangDiagnosticConfigsWidget::onClangTidyItemChanged(QListWidgetItem *item)
{
const QString prefix = item->text();
- ClangDiagnosticConfig config = currentConfig();
+ ClangDiagnosticConfig config = selectedConfig();
QString checks = config.clangTidyChecksPrefixes();
item->checkState() == Qt::Checked
? checks.append(',' + prefix)
@@ -134,7 +150,7 @@ void ClangDiagnosticConfigsWidget::onClangTidyItemChanged(QListWidgetItem *item)
void ClangDiagnosticConfigsWidget::onClangTidyLineEdited(const QString &text)
{
- ClangDiagnosticConfig config = currentConfig();
+ ClangDiagnosticConfig config = selectedConfig();
config.setClangTidyChecksString(text);
updateConfig(config);
}
@@ -156,7 +172,7 @@ void ClangDiagnosticConfigsWidget::onClazyRadioButtonChanged(bool checked)
else if (m_clazyChecks->clazyRadioLevel3->isChecked())
checks = "level3";
- ClangDiagnosticConfig config = currentConfig();
+ ClangDiagnosticConfig config = selectedConfig();
config.setClazyChecks(checks);
updateConfig(config);
}
@@ -209,13 +225,13 @@ void ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited()
updateValidityWidgets(errorMessage);
if (!errorMessage.isEmpty()) {
// Remember the entered options in case the user will switch back.
- m_notAcceptedOptions.insert(currentConfigId(), diagnosticOptions);
+ m_notAcceptedOptions.insert(selectedConfigId(), diagnosticOptions);
return;
}
- m_notAcceptedOptions.remove(currentConfigId());
+ m_notAcceptedOptions.remove(selectedConfigId());
// Commit valid changes
- ClangDiagnosticConfig updatedConfig = currentConfig();
+ ClangDiagnosticConfig updatedConfig = selectedConfig();
updatedConfig.setClangOptions(normalizedOptions);
updateConfig(updatedConfig);
}
@@ -230,9 +246,10 @@ void ClangDiagnosticConfigsWidget::syncConfigChooserToModel(const Core::Id &conf
{
disconnectConfigChooserCurrentIndex();
- const int previousCurrentIndex = m_ui->configChooserComboBox->currentIndex();
m_ui->configChooserComboBox->clear();
- int configToSelectIndex = -1;
+ 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) {
@@ -242,17 +259,12 @@ void ClangDiagnosticConfigsWidget::syncConfigChooserToModel(const Core::Id &conf
m_ui->configChooserComboBox->addItem(displayName, config.id().toSetting());
if (configToSelect == config.id())
- configToSelectIndex = i;
+ m_selectedConfigIndex = i;
}
connectConfigChooserCurrentIndex();
- if (configToSelectIndex != -1) {
- m_ui->configChooserComboBox->setCurrentIndex(configToSelectIndex);
- } else if (previousCurrentIndex != m_ui->configChooserComboBox->currentIndex()) {
- syncOtherWidgetsToComboBox();
- emit currentConfigChanged(currentConfigId());
- }
+ m_ui->configChooserComboBox->setCurrentIndex(m_selectedConfigIndex);
}
void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox()
@@ -260,7 +272,7 @@ void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox()
if (isConfigChooserEmpty())
return;
- const ClangDiagnosticConfig &config = currentConfig();
+ const ClangDiagnosticConfig &config = selectedConfig();
// Update main button row
m_ui->removeButton->setEnabled(!config.isReadOnly());
@@ -363,11 +375,6 @@ bool ClangDiagnosticConfigsWidget::isConfigChooserEmpty() const
return m_ui->configChooserComboBox->count() == 0;
}
-const ClangDiagnosticConfig &ClangDiagnosticConfigsWidget::currentConfig() const
-{
- return m_diagnosticConfigsModel.configWithId(currentConfigId());
-}
-
void ClangDiagnosticConfigsWidget::setDiagnosticOptions(const QString &options)
{
if (options != m_clangBaseChecks->diagnosticOptionsTextEdit->document()->toPlainText()) {
@@ -464,11 +471,6 @@ void ClangDiagnosticConfigsWidget::disconnectDiagnosticOptionsChanged()
&ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited);
}
-Core::Id ClangDiagnosticConfigsWidget::currentConfigId() const
-{
- return Core::Id::fromSetting(m_ui->configChooserComboBox->currentData());
-}
-
ClangDiagnosticConfigs ClangDiagnosticConfigsWidget::customConfigs() const
{
const ClangDiagnosticConfigs allConfigs = m_diagnosticConfigsModel.configs();
@@ -478,14 +480,6 @@ ClangDiagnosticConfigs ClangDiagnosticConfigsWidget::customConfigs() const
});
}
-void ClangDiagnosticConfigsWidget::refresh(
- const ClangDiagnosticConfigsModel &diagnosticConfigsModel,
- const Core::Id &configToSelect)
-{
- m_diagnosticConfigsModel = diagnosticConfigsModel;
- syncWidgetsToModel(configToSelect);
-}
-
void ClangDiagnosticConfigsWidget::setupTabs()
{
m_clangBaseChecks.reset(new CppTools::Ui::ClangBaseChecks);
@@ -513,4 +507,33 @@ void ClangDiagnosticConfigsWidget::setupTabs()
m_ui->tabWidget->setCurrentIndex(0);
}
+void connectToClangDiagnosticConfigsDialog(QPushButton *button)
+{
+ QObject::connect(button, &QPushButton::clicked, []() {
+ ClangDiagnosticConfigsWidget *widget = new ClangDiagnosticConfigsWidget;
+ QDialog dialog;
+ dialog.setWindowTitle(widget->tr("Diagnostic Configurations"));
+ dialog.setLayout(new QVBoxLayout);
+ dialog.layout()->setMargin(0);
+ dialog.layout()->setSpacing(0);
+ dialog.layout()->addWidget(widget);
+ auto *buttonsBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+ dialog.layout()->addWidget(buttonsBox);
+ QObject::connect(buttonsBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
+ QObject::connect(buttonsBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject);
+
+ QObject::connect(&dialog, &QDialog::accepted, [widget]() {
+ QSharedPointer<CppCodeModelSettings> settings = codeModelSettings();
+ const ClangDiagnosticConfigs oldDiagnosticConfigs
+ = settings->clangCustomDiagnosticConfigs();
+ const ClangDiagnosticConfigs currentDiagnosticConfigs = widget->customConfigs();
+ if (oldDiagnosticConfigs != currentDiagnosticConfigs) {
+ settings->setClangCustomDiagnosticConfigs(currentDiagnosticConfigs);
+ settings->toSettings(Core::ICore::settings());
+ }
+ });
+ dialog.exec();
+ });
+}
+
} // CppTools namespace
diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.h b/src/plugins/cpptools/clangdiagnosticconfigswidget.h
index 73688a8381..4fbdd2ec40 100644
--- a/src/plugins/cpptools/clangdiagnosticconfigswidget.h
+++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.h
@@ -37,6 +37,7 @@
QT_BEGIN_NAMESPACE
class QListWidgetItem;
+class QPushButton;
class QRadioButton;
QT_END_NAMESPACE
@@ -54,26 +55,18 @@ class CPPTOOLS_EXPORT ClangDiagnosticConfigsWidget : public QWidget
Q_OBJECT
public:
- explicit ClangDiagnosticConfigsWidget(
- const ClangDiagnosticConfigsModel &diagnosticConfigsModel = ClangDiagnosticConfigsModel(),
- const Core::Id &configToSelect = Core::Id(),
- QWidget *parent = nullptr);
+ explicit ClangDiagnosticConfigsWidget(QWidget *parent = nullptr);
~ClangDiagnosticConfigsWidget() override;
- Core::Id currentConfigId() const;
ClangDiagnosticConfigs customConfigs() const;
- void refresh(const ClangDiagnosticConfigsModel &diagnosticConfigsModel,
- const Core::Id &configToSelect);
-
signals:
- void currentConfigChanged(const Core::Id &currentConfigId);
void customConfigsChanged(const CppTools::ClangDiagnosticConfigs &customConfigs);
private:
void setupTabs();
- void onCurrentConfigChanged(int);
+ void onCurrentConfigChanged(int index);
void onCopyButtonClicked();
void onRemoveButtonClicked();
void onClangTidyModeChanged(int index);
@@ -93,7 +86,8 @@ private:
void updateConfig(const CppTools::ClangDiagnosticConfig &config);
bool isConfigChooserEmpty() const;
- const ClangDiagnosticConfig &currentConfig() const;
+ const ClangDiagnosticConfig &selectedConfig() const;
+ Core::Id selectedConfigId() const;
void setDiagnosticOptions(const QString &options);
void updateValidityWidgets(const QString &errorMessage);
@@ -121,6 +115,10 @@ private:
std::unique_ptr<CppTools::Ui::TidyChecks> m_tidyChecks;
QWidget *m_tidyChecksWidget = nullptr;
+
+ int m_selectedConfigIndex = 0;
};
+CPPTOOLS_EXPORT void connectToClangDiagnosticConfigsDialog(QPushButton *button);
+
} // CppTools namespace
diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.cpp b/src/plugins/cpptools/cppcodemodelsettingspage.cpp
index df0a0f924c..91706470fd 100644
--- a/src/plugins/cpptools/cppcodemodelsettingspage.cpp
+++ b/src/plugins/cpptools/cppcodemodelsettingspage.cpp
@@ -43,8 +43,6 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(QWidget *parent)
, m_ui(new Ui::CppCodeModelSettingsPage)
{
m_ui->setupUi(this);
-
- m_ui->clangSettingsGroupBox->setVisible(true);
}
CppCodeModelSettingsWidget::~CppCodeModelSettingsWidget()
@@ -77,13 +75,21 @@ void CppCodeModelSettingsWidget::setupClangCodeModelWidgets()
m_ui->clangCodeModelIsDisabledHint->setVisible(!isClangActive);
m_ui->clangCodeModelIsEnabledHint->setVisible(isClangActive);
- m_ui->clangSettingsGroupBox->setEnabled(isClangActive);
+ for (int i = 0; i < m_ui->clangDiagnosticsLayout->count(); ++i) {
+ QWidget *widget = m_ui->clangDiagnosticsLayout->itemAt(i)->widget();
+ if (widget)
+ widget->setEnabled(isClangActive);
+ }
+
+ connectToClangDiagnosticConfigsDialog(m_ui->manageButton);
- ClangDiagnosticConfigsModel diagnosticConfigsModel(m_settings->clangCustomDiagnosticConfigs());
- m_clangDiagnosticConfigsWidget = new ClangDiagnosticConfigsWidget(
- diagnosticConfigsModel,
- m_settings->clangDiagnosticConfigId());
- m_ui->clangSettingsGroupBox->layout()->addWidget(m_clangDiagnosticConfigsWidget);
+ connect(m_settings.data(), &CppCodeModelSettings::changed,
+ this, [this]() {
+ m_ui->clangDiagnosticConfigsSelectionWidget->refresh(
+ m_ui->clangDiagnosticConfigsSelectionWidget->currentConfigId());
+ if (applyClangCodeModelWidgetsToSettings())
+ m_settings->toSettings(Core::ICore::settings());
+ });
}
void CppCodeModelSettingsWidget::setupGeneralWidgets()
@@ -100,24 +106,14 @@ void CppCodeModelSettingsWidget::setupGeneralWidgets()
bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const
{
- bool settingsChanged = false;
-
const Core::Id oldConfigId = m_settings->clangDiagnosticConfigId();
- const Core::Id currentConfigId = m_clangDiagnosticConfigsWidget->currentConfigId();
+ const Core::Id currentConfigId = m_ui->clangDiagnosticConfigsSelectionWidget->currentConfigId();
if (oldConfigId != currentConfigId) {
m_settings->setClangDiagnosticConfigId(currentConfigId);
- settingsChanged = true;
+ return true;
}
- const ClangDiagnosticConfigs oldDiagnosticConfigs = m_settings->clangCustomDiagnosticConfigs();
- const ClangDiagnosticConfigs currentDiagnosticConfigs
- = m_clangDiagnosticConfigsWidget->customConfigs();
- if (oldDiagnosticConfigs != currentDiagnosticConfigs) {
- m_settings->setClangCustomDiagnosticConfigs(currentDiagnosticConfigs);
- settingsChanged = true;
- }
-
- return settingsChanged;
+ return false;
}
bool CppCodeModelSettingsWidget::applyGeneralWidgetsToSettings() const
diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.h b/src/plugins/cpptools/cppcodemodelsettingspage.h
index 7a56ca174b..54547bc026 100644
--- a/src/plugins/cpptools/cppcodemodelsettingspage.h
+++ b/src/plugins/cpptools/cppcodemodelsettingspage.h
@@ -37,8 +37,6 @@ QT_FORWARD_DECLARE_CLASS(QSettings)
namespace CppTools {
-class ClangDiagnosticConfigsWidget;
-
namespace Internal {
namespace Ui { class CppCodeModelSettingsPage; }
@@ -49,7 +47,7 @@ class CppCodeModelSettingsWidget: public QWidget
public:
explicit CppCodeModelSettingsWidget(QWidget *parent = 0);
- ~CppCodeModelSettingsWidget();
+ ~CppCodeModelSettingsWidget() override;
void setSettings(const QSharedPointer<CppCodeModelSettings> &s);
void applyToSettings() const;
@@ -63,7 +61,6 @@ private:
private:
Ui::CppCodeModelSettingsPage *m_ui = nullptr;
- QPointer<ClangDiagnosticConfigsWidget> m_clangDiagnosticConfigsWidget;
QSharedPointer<CppCodeModelSettings> m_settings;
};
diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.ui b/src/plugins/cpptools/cppcodemodelsettingspage.ui
index 41076fbc24..e706fba256 100644
--- a/src/plugins/cpptools/cppcodemodelsettingspage.ui
+++ b/src/plugins/cpptools/cppcodemodelsettingspage.ui
@@ -98,24 +98,61 @@
</widget>
</item>
<item>
- <widget class="QGroupBox" name="clangSettingsGroupBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title">
- <string>Clang Diagnostics</string>
+ <layout class="QHBoxLayout" name="clangDiagnosticsLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Diagnostic Configuration:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="CppTools::ClangDiagnosticConfigsSelectionWidget" name="clangDiagnosticConfigsSelectionWidget" native="true"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="manageButton">
+ <property name="text">
+ <string>Manage...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
</property>
- <property name="checkable">
- <bool>false</bool>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_3"/>
- </widget>
+ </spacer>
</item>
</layout>
</widget>
+ <customwidgets>
+ <customwidget>
+ <class>CppTools::ClangDiagnosticConfigsSelectionWidget</class>
+ <extends>QWidget</extends>
+ <header>cpptools/clangdiagnosticconfigsselectionwidget.h</header>
+ </customwidget>
+ </customwidgets>
<resources/>
<connections/>
</ui>
diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro
index cb57c97cfc..7666d8521e 100644
--- a/src/plugins/cpptools/cpptools.pro
+++ b/src/plugins/cpptools/cpptools.pro
@@ -13,6 +13,7 @@ HEADERS += \
builtinindexingsupport.h \
clangdiagnosticconfig.h \
clangdiagnosticconfigsmodel.h \
+ clangdiagnosticconfigsselectionwidget.h \
clangdiagnosticconfigswidget.h \
cppcanonicalsymbol.h \
cppchecksymbols.h \
@@ -111,6 +112,7 @@ SOURCES += \
builtinindexingsupport.cpp \
clangdiagnosticconfig.cpp \
clangdiagnosticconfigsmodel.cpp \
+ clangdiagnosticconfigsselectionwidget.cpp \
clangdiagnosticconfigswidget.cpp \
cppcanonicalsymbol.cpp \
cppchecksymbols.cpp \
@@ -184,7 +186,7 @@ SOURCES += \
compileroptionsbuilder.cpp \
cppprojectfilecategorizer.cpp \
cppprojectpartchooser.cpp \
- wrappablelineedit.cpp \
+ wrappablelineedit.cpp
FORMS += \
clangdiagnosticconfigswidget.ui \
diff --git a/src/plugins/cpptools/cpptools.qbs b/src/plugins/cpptools/cpptools.qbs
index 72cc6737b2..80fdfd78b7 100644
--- a/src/plugins/cpptools/cpptools.qbs
+++ b/src/plugins/cpptools/cpptools.qbs
@@ -48,6 +48,8 @@ Project {
"clangdiagnosticconfig.h",
"clangdiagnosticconfigsmodel.cpp",
"clangdiagnosticconfigsmodel.h",
+ "clangdiagnosticconfigsselectionwidget.cpp",
+ "clangdiagnosticconfigsselectionwidget.h",
"clangdiagnosticconfigswidget.cpp",
"clangdiagnosticconfigswidget.h",
"clangdiagnosticconfigswidget.ui",
diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h
index 9190a030be..ce49e21b92 100644
--- a/src/plugins/cpptools/cpptoolsconstants.h
+++ b/src/plugins/cpptools/cpptoolsconstants.h
@@ -66,6 +66,8 @@ const char CPP_FILE_SETTINGS_ID[] = "B.Cpp.File Naming";
const char CPP_FILE_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "File Naming");
const char CPP_CODE_MODEL_SETTINGS_ID[] = "C.Cpp.Code Model";
const char CPP_CODE_MODEL_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Code Model");
+const char CPP_DIAGNOSTIC_CONFIG_SETTINGS_ID[] = "C.Cpp.Diagnostic Config";
+const char CPP_DIAGNOSTIC_CONFIG_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Diagnostic Configurations");
const char CPP_SETTINGS_CATEGORY[] = "I.C++";
const char CPP_CLANG_FIXIT_AVAILABLE_MARKER_ID[] = "ClangFixItAvailableMarker";