]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemlistview.cpp
Implement group-header layouting
[dolphin.git] / src / kitemviews / kfileitemlistview.cpp
index 50f28fe5b85b989585251421b3d5141bc8f06cc3..a3cf8829093f8a6352ea8dc353dae7abb8ef5d63 100644 (file)
@@ -68,8 +68,11 @@ KFileItemListView::KFileItemListView(QGraphicsWidget* parent) :
 
 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;
@@ -167,53 +170,50 @@ 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;
+            }
+            ++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;
 }
@@ -248,6 +248,8 @@ void KFileItemListView::initializeItemListWidget(KItemListWidget* item)
     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