diff options
| author | Peter Penz <[email protected]> | 2011-09-27 20:42:58 +0200 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2011-09-27 20:45:16 +0200 |
| commit | ec38f1cdb641f0b277100edd92b268ec856e2ece (patch) | |
| tree | 0df979cecbed0a23b2ddb10c99ccd6f1d90109c4 /src/kitemviews/kfileitemlistview.cpp | |
| parent | 34a20cec096eaee4eb09f7b2cbec7aa47f7ee4a0 (diff) | |
Details view: Improve performance
When inserting items or when updating the item-roles there is no
need to recalculate the column-widths for all items to get an
optimized column-width.
Diffstat (limited to 'src/kitemviews/kfileitemlistview.cpp')
| -rw-r--r-- | src/kitemviews/kfileitemlistview.cpp | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp index 50f28fe5b..f1594b10b 100644 --- a/src/kitemviews/kfileitemlistview.cpp +++ b/src/kitemviews/kfileitemlistview.cpp @@ -167,31 +167,42 @@ QSizeF KFileItemListView::itemSizeHint(int index) const return QSize(); } -QHash<QByteArray, QSizeF> KFileItemListView::visibleRolesSizes() const +QHash<QByteArray, QSizeF> KFileItemListView::visibleRolesSizes(const KItemRangeList& itemRanges) const { QElapsedTimer timer; timer.start(); QHash<QByteArray, QSizeF> sizes; - const int itemCount = model()->count(); - for (int i = 0; i < itemCount; ++i) { - foreach (const QByteArray& visibleRole, visibleRoles()) { - QSizeF maxSize = sizes.value(visibleRole, QSizeF(0, 0)); - const QSizeF itemSize = visibleRoleSizeHint(i, visibleRole); - maxSize = maxSize.expandedTo(itemSize); - sizes.insert(visibleRole, maxSize); - } + int calculatedItemCount = 0; + bool maxTimeExceeded = false; + foreach (const KItemRange& itemRange, itemRanges) { + const int startIndex = itemRange.index; + const int endIndex = startIndex + itemRange.count - 1; + + for (int i = startIndex; i <= endIndex; ++i) { + foreach (const QByteArray& visibleRole, visibleRoles()) { + QSizeF maxSize = sizes.value(visibleRole, QSizeF(0, 0)); + const QSizeF itemSize = visibleRoleSizeHint(i, visibleRole); + maxSize = maxSize.expandedTo(itemSize); + sizes.insert(visibleRole, maxSize); + } - if (i > 100 && timer.elapsed() > 200) { - // When having several thousands of items calculating the sizes can get - // very expensive. We accept a possibly too small role-size in favour - // of having no blocking user interface. - #ifdef KFILEITEMLISTVIEW_DEBUG - kDebug() << "Timer exceeded, stopped after" << i << "items"; - #endif + if (calculatedItemCount > 100 && timer.elapsed() > 200) { + // When having several thousands of items calculating the sizes can get + // very expensive. We accept a possibly too small role-size in favour + // of having no blocking user interface. + #ifdef KFILEITEMLISTVIEW_DEBUG + kDebug() << "Timer exceeded, stopped after" << calculatedItemCount << "items"; + #endif + maxTimeExceeded = true; + break; + } + } + if (maxTimeExceeded) { break; } + ++calculatedItemCount; } // Stretch the width of the first role so that the full visible view-width @@ -213,7 +224,11 @@ QHash<QByteArray, QSizeF> KFileItemListView::visibleRolesSizes() const } #ifdef KFILEITEMLISTVIEW_DEBUG - kDebug() << "[TIME] Calculated dynamic item size for " << itemCount << "items:" << timer.elapsed(); + int rangesItemCount = 0; + foreach (const KItemRange& itemRange, itemRanges) { + rangesItemCount += itemRange.count; + } + kDebug() << "[TIME] Calculated dynamic item size for " << rangesItemCount << "items:" << timer.elapsed(); #endif return sizes; } |
