forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user