| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file LICENSE.rst or https://cmake.org/licensing for details. */ |
| #include "WarningMessagesDialog.h" |
| |
| #include "cm/string_view" |
| |
| #include <QButtonGroup> |
| #include <QHeaderView> |
| #include <QRadioButton> |
| #include <QToolButton> |
| #include <QTreeWidget> |
| #include <QTreeWidgetItem> |
| |
| #include "cmDiagnostics.h" |
| |
| #include "QCMake.h" |
| #include "QCMakeSizeType.h" |
| |
| WarningMessagesDialog::WarningMessagesDialog(QWidget* prnt, QCMake* instance) |
| : QDialog(prnt) |
| , cmakeInstance(instance) |
| { |
| this->setupUi(this); |
| this->setInitialValues(); |
| this->setupSignals(); |
| } |
| |
| void WarningMessagesDialog::setInitialValues() |
| { |
| QHeaderView* const header = this->treeWidget->header(); |
| header->setSectionResizeMode(0, QHeaderView::Stretch); |
| header->setSectionResizeMode(1, QHeaderView::ResizeToContents); |
| header->setSectionResizeMode(2, QHeaderView::ResizeToContents); |
| header->setSectionResizeMode(3, QHeaderView::ResizeToContents); |
| |
| std::map<unsigned, QTreeWidgetItem*> items = { |
| { 0, this->treeWidget->invisibleRootItem() }, |
| }; |
| |
| for (unsigned i = 1; i < cmDiagnostics::CategoryCount; ++i) { |
| auto const category = static_cast<cmDiagnosticCategory>(i); |
| cm::string_view const cname = |
| cmDiagnostics::GetCategoryString(category).substr(4); |
| QTreeWidgetItem* const parent = |
| items[cmDiagnostics::CategoryInfo[category].Parent]; |
| |
| QTreeWidgetItem* const item = new QTreeWidgetItem(parent); |
| item->setText(0, |
| QString::fromUtf8(cname.data(), |
| static_cast<cm_qsizetype>(cname.size()))); |
| |
| auto makeButton = [](QString const& text) { |
| QToolButton* const button = new QToolButton; |
| button->setCheckable(true); |
| button->setText(text); |
| return button; |
| }; |
| QAbstractButton* const ignore = makeButton(tr("Ignore")); |
| QAbstractButton* const warn = makeButton(tr("Warn")); |
| QAbstractButton* const error = makeButton(tr("Error")); |
| |
| QButtonGroup* const buttonGroup = new QButtonGroup(treeWidget); |
| buttonGroup->addButton(ignore, cmDiagnosticAction::Ignore); |
| buttonGroup->addButton(warn, cmDiagnosticAction::Warn); |
| buttonGroup->addButton(error, cmDiagnosticAction::SendError); |
| buttonGroup->setExclusive(true); |
| this->buttons.emplace(i, buttonGroup); |
| |
| treeWidget->setItemWidget(item, 1, ignore); |
| treeWidget->setItemWidget(item, 2, warn); |
| treeWidget->setItemWidget(item, 3, error); |
| |
| cmDiagnosticAction const action = |
| this->cmakeInstance->getDiagnosticAction(category); |
| switch (action) { |
| case cmDiagnostics::SendError: |
| case cmDiagnostics::FatalError: |
| error->setChecked(true); |
| break; |
| case cmDiagnostics::Warn: |
| warn->setChecked(true); |
| break; |
| default: |
| ignore->setChecked(true); |
| break; |
| } |
| |
| items.emplace(i, item); |
| } |
| |
| for (auto const& ii : items) { |
| ii.second->setExpanded(true); |
| } |
| } |
| |
| void WarningMessagesDialog::setupSignals() |
| { |
| QObject::connect(this->buttonBox, &QDialogButtonBox::accepted, this, |
| &WarningMessagesDialog::doAccept); |
| } |
| |
| void WarningMessagesDialog::doAccept() |
| { |
| for (auto const& ii : this->buttons) { |
| this->cmakeInstance->setDiagnosticAction( |
| static_cast<cmDiagnosticCategory>(ii.first), |
| static_cast<cmDiagnosticAction>(ii.second->checkedId())); |
| } |
| } |