From 954d9f85f832957d46e74a86b5502cad0e7b2b37 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 23 Jan 2019 14:24:47 +0100 Subject: [PATCH] ClangTools: Make diagnostic view sortable Fixes: QTCREATORBUG-20660 Change-Id: I57ed5c4071d7db8143e9e1e31d8b86a4d59d33ff Reviewed-by: Ivan Donchevskii --- src/plugins/clangtools/clangtidyclazytool.cpp | 3 +++ .../clangtools/clangtoolsdiagnosticview.cpp | 27 ++++++++++++------- .../clangtools/clangtoolsdiagnosticview.h | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index b1afe494e08..3642452c601 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -210,10 +210,13 @@ ClangTidyClazyTool::ClangTidyClazyTool() m_diagnosticFilterModel = new DiagnosticFilterModel(this); m_diagnosticFilterModel->setSourceModel(m_diagnosticModel); + m_diagnosticFilterModel->setDynamicSortFilter(true); m_diagnosticView = new DiagnosticView; initDiagnosticView(); m_diagnosticView->setModel(m_diagnosticFilterModel); + m_diagnosticView->setSortingEnabled(true); + m_diagnosticView->sortByColumn(Debugger::DetailedErrorView::LocationColumn, Qt::AscendingOrder); m_diagnosticView->setObjectName(QLatin1String("ClangTidyClazyIssuesView")); m_diagnosticView->setWindowTitle(tr("Clang-Tidy and Clazy Issues")); diff --git a/src/plugins/clangtools/clangtoolsdiagnosticview.cpp b/src/plugins/clangtools/clangtoolsdiagnosticview.cpp index bd1bb6275c3..56e61f95554 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticview.cpp +++ b/src/plugins/clangtools/clangtoolsdiagnosticview.cpp @@ -70,8 +70,9 @@ protected: option.rect = QRect(rect.left() + 1, 1, side - 3, side - 3); option.state = state; painter->save(); - painter->translate(QPoint(side - 2, 0)); - QHeaderView::paintSection(painter, rect, logicalIndex); + const int shift = side - 2; + painter->translate(QPoint(shift, 0)); + QHeaderView::paintSection(painter, rect.adjusted(0, 0, -shift, 0), logicalIndex); painter->restore(); style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &option, painter); } @@ -79,10 +80,15 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override { - if (event->localPos().x() > sectionPosition(DiagnosticView::FixItColumn)) { + const int x = event->localPos().x(); + const int fixItColumnX = sectionPosition(DiagnosticView::FixItColumn); + const bool isWithinFixitCheckBox = x > fixItColumnX + && x < fixItColumnX + sizeHint().height() - 3; + if (isWithinFixitCheckBox) { state = (state != QStyle::State_On) ? QStyle::State_On : QStyle::State_Off; viewport()->update(); emit fixItColumnClicked(state == QStyle::State_On); + return; // Avoid changing sort order } QHeaderView::mouseReleaseEvent(event); } @@ -168,16 +174,19 @@ void DiagnosticView::setSelectedFixItsCount(int fixItsCount) clickableFixItHeader->viewport()->update(); } -void DiagnosticView::setModel(QAbstractItemModel *model) +void DiagnosticView::setModel(QAbstractItemModel *theProxyModel) { - Debugger::DetailedErrorView::setModel(model); + const auto proxyModel = static_cast(theProxyModel); + QAbstractItemModel *sourceModel = proxyModel->sourceModel(); + + Debugger::DetailedErrorView::setModel(proxyModel); auto *clickableFixItHeader = new ClickableFixItHeader(Qt::Horizontal, this); connect(clickableFixItHeader, &ClickableFixItHeader::fixItColumnClicked, this, [=](bool checked) { m_ignoreSetSelectedFixItsCount = true; - for (int row = 0; row < model->rowCount(); ++row) { - QModelIndex index = model->index(row, FixItColumn, QModelIndex()); - model->setData(index, checked ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole); + for (int row = 0; row < sourceModel->rowCount(); ++row) { + QModelIndex index = sourceModel->index(row, FixItColumn, QModelIndex()); + sourceModel->setData(index, checked ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole); } m_ignoreSetSelectedFixItsCount = false; }); @@ -189,7 +198,7 @@ void DiagnosticView::setModel(QAbstractItemModel *model) const int fixitColumnWidth = clickableFixItHeader->sectionSizeHint(DiagnosticView::FixItColumn); const int checkboxWidth = clickableFixItHeader->height(); - clickableFixItHeader->setMinimumSectionSize(fixitColumnWidth + checkboxWidth); + clickableFixItHeader->setMinimumSectionSize(fixitColumnWidth + 1.2 * checkboxWidth); } } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolsdiagnosticview.h b/src/plugins/clangtools/clangtoolsdiagnosticview.h index b0752a3046d..a33af34b85a 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticview.h +++ b/src/plugins/clangtools/clangtoolsdiagnosticview.h @@ -48,7 +48,7 @@ private: QList customActions() const override; bool eventFilter(QObject *watched, QEvent *event) override; - void setModel(QAbstractItemModel *model) override; + void setModel(QAbstractItemModel *theProxyModel) override; QAction *m_suppressAction; bool m_ignoreSetSelectedFixItsCount = false;