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>
This commit is contained in:
Ivan Donchevskii
2018-05-04 15:58:41 +02:00
parent 6b70c27e3b
commit 3737b6a124
14 changed files with 364 additions and 148 deletions

View File

@@ -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