diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index 233f6d87eba..aa9853825cf 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -471,6 +471,13 @@ QList ClangTidyClazyTool::read(const QString &filePath, return readSerializedDiagnostics(filePath, projectRootDir, logFilePath, errorMessage); } +void ClangTidyClazyTool::onNewDiagnosticsAvailable(const QList &diagnostics) +{ + ClangTool::onNewDiagnosticsAvailable(diagnostics); + if (!m_diagnosticFilterModel->filterRegExp().pattern().isEmpty()) + m_diagnosticFilterModel->invalidateFilter(); +} + } // namespace Internal } // namespace ClangTools diff --git a/src/plugins/clangtools/clangtidyclazytool.h b/src/plugins/clangtools/clangtidyclazytool.h index 7cde29f89d7..24aac6673bf 100644 --- a/src/plugins/clangtools/clangtidyclazytool.h +++ b/src/plugins/clangtools/clangtidyclazytool.h @@ -58,6 +58,8 @@ public: const QString &logFilePath, QString *errorMessage) const final; + void onNewDiagnosticsAvailable(const QList &diagnostics) override; + private: void handleStateUpdate() final; diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h index de4d08ceb9d..65dde580095 100644 --- a/src/plugins/clangtools/clangtool.h +++ b/src/plugins/clangtools/clangtool.h @@ -62,7 +62,7 @@ public: const QString &name() const; - void onNewDiagnosticsAvailable(const QList &diagnostics); + virtual void onNewDiagnosticsAvailable(const QList &diagnostics); signals: void finished(bool success); // For testing. diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp index 00bf9112b95..5b824f22508 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp +++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp @@ -584,14 +584,32 @@ void DiagnosticFilterModel::addSuppressedDiagnostic( invalidate(); } +void DiagnosticFilterModel::invalidateFilter() +{ + QSortFilterProxyModel::invalidateFilter(); +} + bool DiagnosticFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { auto model = static_cast(sourceModel()); - Utils::TreeItem *item = model->itemForIndex(sourceParent); + + // FilePathItem - hide if no diagnostics match + if (!sourceParent.isValid()) { + const QModelIndex filePathIndex = model->index(sourceRow, 0); + const int rowCount = model->rowCount(filePathIndex); + if (rowCount == 0) + return true; // Children not yet added. + for (int row = 0; row < rowCount; ++row) { + if (filterAcceptsRow(row, filePathIndex)) + return true; + } + return false; + } // DiagnosticItem - if (auto filePathItem = dynamic_cast(item)) { + Utils::TreeItem *parentItem = model->itemForIndex(sourceParent); + if (auto filePathItem = dynamic_cast(parentItem)) { auto diagnosticItem = dynamic_cast(filePathItem->childAt(sourceRow)); QTC_ASSERT(diagnosticItem, return false); @@ -612,7 +630,7 @@ bool DiagnosticFilterModel::filterAcceptsRow(int sourceRow, return diag.description.contains(filterRegExp()); } - return true; + return true; // ExplainingStepItem } bool DiagnosticFilterModel::lessThan(const QModelIndex &l, const QModelIndex &r) const diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.h b/src/plugins/clangtools/clangtoolsdiagnosticmodel.h index 8a69e9def76..22d06992018 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.h +++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.h @@ -146,6 +146,8 @@ public: void addSuppressedDiagnostic(const SuppressedDiagnostic &diag); ProjectExplorer::Project *project() const { return m_project; } + void invalidateFilter(); + private: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; bool lessThan(const QModelIndex &l, const QModelIndex &r) const override;