┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kfileitemlistview.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-09-27 20:42:58 +0200
committerPeter Penz <[email protected]>2011-09-27 20:45:16 +0200
commitec38f1cdb641f0b277100edd92b268ec856e2ece (patch)
tree0df979cecbed0a23b2ddb10c99ccd6f1d90109c4 /src/kitemviews/kfileitemlistview.cpp
parent34a20cec096eaee4eb09f7b2cbec7aa47f7ee4a0 (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.cpp49
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;
}