diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-05-29 12:30:59 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-05-29 12:51:51 +0000 |
commit | c6f12991b06c7a5d34c14252ce200f8c4c1b5dc5 (patch) | |
tree | 46b78890658a51408881ce59ceb4b3bf8ff9642a | |
parent | 6b9ff15ad5b0e1082dae2e6819b75448e08a6d60 (diff) | |
download | qt-creator-c6f12991b06c7a5d34c14252ce200f8c4c1b5dc5.tar.gz |
ClangTools: Avoid freezing UI for many items
...if new items are added to the model or if filter is used.
When items were added, we have called
ClangToolsDiagnosticModel::diagnostics() two times:
* from DiagnosticFilterModel::filterAcceptsRow()
* from ClangTidyClazyTool::handleStateUpdate()
However, this does not scale since diagnostics() creates a temporary.
Fix this by accessing the diagnostics or the count directly from the
tree.
Change-Id: I4c6a32e0076c1b4228ed1b1ff9222c9918f92c5c
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
-rw-r--r-- | src/plugins/clangtools/clangtidyclazytool.cpp | 2 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp | 10 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsdiagnosticmodel.h | 4 |
3 files changed, 12 insertions, 4 deletions
diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index cf4a4ea5a4..575cd68dc5 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -395,7 +395,7 @@ void ClangTidyClazyTool::handleStateUpdate() QTC_ASSERT(m_diagnosticModel, return); QTC_ASSERT(m_diagnosticFilterModel, return); - const int issuesFound = m_diagnosticModel->diagnostics().count(); + const int issuesFound = m_diagnosticModel->diagnosticsCount(); const int issuesVisible = m_diagnosticFilterModel->rowCount(); m_goBack->setEnabled(issuesVisible > 1); m_goNext->setEnabled(issuesVisible > 1); diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp index db7ab4e14a..690f48e584 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp +++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp @@ -80,6 +80,11 @@ QList<Diagnostic> ClangToolsDiagnosticModel::diagnostics() const return diags; } +int ClangToolsDiagnosticModel::diagnosticsCount() const +{ + return rootItem()->childCount(); +} + static QString createDiagnosticToolTipString(const Diagnostic &diagnostic) { typedef QPair<QString, QString> StringPair; @@ -431,8 +436,9 @@ bool DiagnosticFilterModel::filterAcceptsRow(int sourceRow, return true; // Is the diagnostic suppressed? - const Diagnostic diag = static_cast<ClangToolsDiagnosticModel *>(sourceModel()) - ->diagnostics().at(sourceRow); + auto model = static_cast<ClangToolsDiagnosticModel *>(sourceModel()); + auto item = static_cast<DiagnosticItem *>(model->rootItem()->childAt(sourceRow)); + const Diagnostic &diag = item->diagnostic(); foreach (const SuppressedDiagnostic &d, m_suppressedDiagnostics) { if (d.description != diag.description) continue; diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.h b/src/plugins/clangtools/clangtoolsdiagnosticmodel.h index 4c6a7e191c..6ced6bfe22 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.h +++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.h @@ -59,7 +59,7 @@ public: DiagnosticItem(const Diagnostic &diag, const OnFixitStatusChanged &onFixitStatusChanged); ~DiagnosticItem() override; - Diagnostic diagnostic() const { return m_diagnostic; } + const Diagnostic &diagnostic() const { return m_diagnostic; } FixitStatus fixItStatus() const { return m_fixitStatus; } void setFixItStatus(const FixitStatus &status); @@ -90,6 +90,8 @@ public: virtual void addDiagnostics(const QList<Diagnostic> &diagnostics); virtual QList<Diagnostic> diagnostics() const; + int diagnosticsCount() const; + enum ItemRole { DiagnosticRole = Debugger::DetailedErrorView::FullTextRole + 1 }; |