summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2018-05-29 12:30:59 +0200
committerNikolai Kosjar <nikolai.kosjar@qt.io>2018-05-29 12:51:51 +0000
commitc6f12991b06c7a5d34c14252ce200f8c4c1b5dc5 (patch)
tree46b78890658a51408881ce59ceb4b3bf8ff9642a
parent6b9ff15ad5b0e1082dae2e6819b75448e08a6d60 (diff)
downloadqt-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.cpp2
-rw-r--r--src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp10
-rw-r--r--src/plugins/clangtools/clangtoolsdiagnosticmodel.h4
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
};