| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** 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"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  | #include "clangdiagnosticconfigswidget.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  | #include "cppcodemodelsettings.h"
 | 
					
						
							|  |  |  | #include "cpptoolsreuse.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  | #include <coreplugin/icore.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QComboBox>
 | 
					
						
							|  |  |  | #include <QDialog>
 | 
					
						
							|  |  |  | #include <QDialogButtonBox>
 | 
					
						
							|  |  |  | #include <QHBoxLayout>
 | 
					
						
							|  |  |  | #include <QPushButton>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  | namespace CppTools { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  | static void connectToClangDiagnosticConfigsDialog(QPushButton *button) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QObject::connect(button, &QPushButton::clicked, []() { | 
					
						
							|  |  |  |         ClangDiagnosticConfigsWidget *widget = new ClangDiagnosticConfigsWidget; | 
					
						
							|  |  |  |         widget->layout()->setMargin(0); | 
					
						
							|  |  |  |         QDialog dialog; | 
					
						
							|  |  |  |         dialog.setWindowTitle(widget->tr("Diagnostic Configurations")); | 
					
						
							|  |  |  |         dialog.setLayout(new QVBoxLayout); | 
					
						
							|  |  |  |         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(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  | ClangDiagnosticConfigsSelectionWidget::ClangDiagnosticConfigsSelectionWidget(QWidget *parent) | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |     : QWidget(parent) | 
					
						
							| 
									
										
										
										
											2018-05-14 11:40:40 +02:00
										 |  |  |     , m_label(new QLabel(tr("Diagnostic Configuration:"), this)) | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |     , m_selectionComboBox(new QComboBox(this)) | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |     auto *layout = new QHBoxLayout(this); | 
					
						
							|  |  |  |     layout->setMargin(0); | 
					
						
							|  |  |  |     setLayout(layout); | 
					
						
							| 
									
										
										
										
											2018-05-14 11:40:40 +02:00
										 |  |  |     layout->addWidget(m_label); | 
					
						
							| 
									
										
										
										
											2018-05-15 13:03:18 +02:00
										 |  |  |     layout->addWidget(m_selectionComboBox, 1); | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |     auto *manageButton = new QPushButton(tr("Manage..."), this); | 
					
						
							|  |  |  |     layout->addWidget(manageButton); | 
					
						
							|  |  |  |     layout->addStretch(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     connectToClangDiagnosticConfigsDialog(manageButton); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  |     refresh(codeModelSettings()->clangDiagnosticConfigId()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     connectToCurrentIndexChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Core::Id ClangDiagnosticConfigsSelectionWidget::currentConfigId() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |     return Core::Id::fromSetting(m_selectionComboBox->currentData()); | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ClangDiagnosticConfigsSelectionWidget::connectToCurrentIndexChanged() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_currentIndexChangedConnection | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |             = connect(m_selectionComboBox, | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  |                       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; | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |     m_selectionComboBox->clear(); | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |         m_selectionComboBox->addItem(displayName, config.id().toSetting()); | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (id == config.id()) | 
					
						
							|  |  |  |             configToSelectIndex = i; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (configToSelectIndex != -1) | 
					
						
							| 
									
										
										
										
											2018-05-14 10:30:09 +02:00
										 |  |  |         m_selectionComboBox->setCurrentIndex(configToSelectIndex); | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |         emit currentConfigChanged(currentConfigId()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     connectToCurrentIndexChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 11:40:40 +02:00
										 |  |  | void ClangDiagnosticConfigsSelectionWidget::showLabel(bool show) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_label->setVisible(show); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:41 +02:00
										 |  |  | } // CppTools namespace
 |