KFileItemListView::~KFileItemListView()
{
- delete widgetCreator();
+ // The group headers are children of the widgets created by
+ // widgetCreator(). So it is mandatory to delete the group headers
+ // first.
delete groupHeaderCreator();
+ delete widgetCreator();
delete m_modelRolesUpdater;
m_modelRolesUpdater = 0;
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;
+ }
+ ++calculatedItemCount;
+ }
+ if (maxTimeExceeded) {
break;
}
}
- // Stretch the width of the first role so that the full visible view-width
- // is used to show all roles.
- const qreal availableWidth = size().width();
-
- qreal usedWidth = 0;
- QHashIterator<QByteArray, QSizeF> it(sizes);
- while (it.hasNext()) {
- it.next();
- usedWidth += it.value().width();
- }
-
- if (usedWidth < availableWidth) {
- const QByteArray role = visibleRoles().first();
- QSizeF firstRoleSize = sizes.value(role);
- firstRoleSize.rwidth() += availableWidth - usedWidth;
- sizes.insert(role, firstRoleSize);
- }
-
#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;
}
case DetailsLayout: fileItemListWidget->setLayout(KFileItemListWidget::DetailsLayout); break;
default: Q_ASSERT(false); break;
}
+
+ fileItemListWidget->setAlternatingBackgroundColors(m_itemLayout == DetailsLayout);
}
bool KFileItemListView::itemSizeHintUpdateRequired(const QSet<QByteArray>& changedRoles) const