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>
This commit is contained in:
Nikolai Kosjar
2018-05-29 12:30:59 +02:00
parent 6b9ff15ad5
commit c6f12991b0
3 changed files with 12 additions and 4 deletions

View File

@@ -395,7 +395,7 @@ void ClangTidyClazyTool::handleStateUpdate()
QTC_ASSERT(m_diagnosticModel, return); QTC_ASSERT(m_diagnosticModel, return);
QTC_ASSERT(m_diagnosticFilterModel, 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(); const int issuesVisible = m_diagnosticFilterModel->rowCount();
m_goBack->setEnabled(issuesVisible > 1); m_goBack->setEnabled(issuesVisible > 1);
m_goNext->setEnabled(issuesVisible > 1); m_goNext->setEnabled(issuesVisible > 1);

View File

@@ -80,6 +80,11 @@ QList<Diagnostic> ClangToolsDiagnosticModel::diagnostics() const
return diags; return diags;
} }
int ClangToolsDiagnosticModel::diagnosticsCount() const
{
return rootItem()->childCount();
}
static QString createDiagnosticToolTipString(const Diagnostic &diagnostic) static QString createDiagnosticToolTipString(const Diagnostic &diagnostic)
{ {
typedef QPair<QString, QString> StringPair; typedef QPair<QString, QString> StringPair;
@@ -431,8 +436,9 @@ bool DiagnosticFilterModel::filterAcceptsRow(int sourceRow,
return true; return true;
// Is the diagnostic suppressed? // Is the diagnostic suppressed?
const Diagnostic diag = static_cast<ClangToolsDiagnosticModel *>(sourceModel()) auto model = static_cast<ClangToolsDiagnosticModel *>(sourceModel());
->diagnostics().at(sourceRow); auto item = static_cast<DiagnosticItem *>(model->rootItem()->childAt(sourceRow));
const Diagnostic &diag = item->diagnostic();
foreach (const SuppressedDiagnostic &d, m_suppressedDiagnostics) { foreach (const SuppressedDiagnostic &d, m_suppressedDiagnostics) {
if (d.description != diag.description) if (d.description != diag.description)
continue; continue;

View File

@@ -59,7 +59,7 @@ public:
DiagnosticItem(const Diagnostic &diag, const OnFixitStatusChanged &onFixitStatusChanged); DiagnosticItem(const Diagnostic &diag, const OnFixitStatusChanged &onFixitStatusChanged);
~DiagnosticItem() override; ~DiagnosticItem() override;
Diagnostic diagnostic() const { return m_diagnostic; } const Diagnostic &diagnostic() const { return m_diagnostic; }
FixitStatus fixItStatus() const { return m_fixitStatus; } FixitStatus fixItStatus() const { return m_fixitStatus; }
void setFixItStatus(const FixitStatus &status); void setFixItStatus(const FixitStatus &status);
@@ -90,6 +90,8 @@ public:
virtual void addDiagnostics(const QList<Diagnostic> &diagnostics); virtual void addDiagnostics(const QList<Diagnostic> &diagnostics);
virtual QList<Diagnostic> diagnostics() const; virtual QList<Diagnostic> diagnostics() const;
int diagnosticsCount() const;
enum ItemRole { enum ItemRole {
DiagnosticRole = Debugger::DetailedErrorView::FullTextRole + 1 DiagnosticRole = Debugger::DetailedErrorView::FullTextRole + 1
}; };