From f2f5e4d030cf7da58a308363093ed4fda60017ff Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 24 Feb 2023 12:49:39 +0100 Subject: [PATCH] Utils: Save a few cycles in BaseTreeView column width computation Change-Id: I5e97cae77db58a396424f5081838d2b2f3769ba7 Reviewed-by: David Schulz Reviewed-by: --- src/libs/utils/basetreeview.cpp | 57 ++++++++++++++++----------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/src/libs/utils/basetreeview.cpp b/src/libs/utils/basetreeview.cpp index 6473a7830dc..3ccbf1f86e8 100644 --- a/src/libs/utils/basetreeview.cpp +++ b/src/libs/utils/basetreeview.cpp @@ -152,46 +152,43 @@ public: } } - - void considerItems(int column, QModelIndex start, int *minimum, bool single) const - { - QModelIndex a = start; - a = a.sibling(a.row(), column); - QFontMetrics fm = q->fontMetrics(); - const int ind = q->indentation(); - const int avg = fm.averageCharWidth(); - QAbstractItemModel *m = q->model(); - for (int i = 0; i < 100 && a.isValid(); ++i) { - const QString s = m->data(a).toString(); - int w = avg * s.size() + 20; - if (column == 0) { - for (QModelIndex b = a.parent(); b.isValid(); b = b.parent()) - w += ind; - } - if (w > *minimum) - *minimum = w; - if (single) - break; - a = q->indexBelow(a); - } - } - int suggestedColumnSize(int column) const { - QHeaderView *h = q->header(); + const QHeaderView *h = q->header(); QTC_ASSERT(h, return -1); - QAbstractItemModel *m = q->model(); + const QAbstractItemModel *m = q->model(); QTC_ASSERT(m, return -1); - QFontMetrics fm = q->fontMetrics(); + const QFontMetrics fm = q->fontMetrics(); + const int ind = q->indentation(); + const int avg = fm.averageCharWidth(); int minimum = fm.horizontalAdvance(m->headerData(column, Qt::Horizontal).toString()) - + 2 * fm.horizontalAdvance(QLatin1Char('m')); - considerItems(column, q->indexAt(QPoint(1, 1)), &minimum, false); + + 2 * avg; + + auto considerItems = [&](const QModelIndex &start, bool single) { + QModelIndex a = start; + a = a.sibling(a.row(), column); + for (int i = 0; i < 100 && a.isValid(); ++i) { + const QString s = m->data(a).toString(); + int w = avg * s.size() + 20; + if (column == 0) { + for (QModelIndex b = a.parent(); b.isValid(); b = b.parent()) + w += ind; + } + if (w > minimum) + minimum = w; + if (single) + break; + a = q->indexBelow(a); + } + }; + + considerItems(q->indexAt(QPoint(1, 1)), false); const QVariant extraIndices = m->data(QModelIndex(), BaseTreeView::ExtraIndicesForColumnWidth); const QList values = extraIndices.value(); for (const QModelIndex &a : values) - considerItems(column, a, &minimum, true); + considerItems(a, true); return minimum; }