]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Details view: Improve performance when expanding items
authorPeter Penz <peter.penz19@gmail.com>
Wed, 28 Sep 2011 18:04:31 +0000 (20:04 +0200)
committerPeter Penz <peter.penz19@gmail.com>
Wed, 28 Sep 2011 18:06:58 +0000 (20:06 +0200)
Prevent unnecessary calls to visibleRolesSizes() when
expanding items. Also the performance has been improved when
resizing the window.

src/kitemviews/kfileitemlistview.cpp
src/kitemviews/kitemlistcontainer.cpp
src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h

index f1594b10b01171768251c740281623a1b2a14017..d3de2c8c99c72ef041617fa2c703eb80e9978cfb 100644 (file)
@@ -198,29 +198,11 @@ QHash<QByteArray, QSizeF> KFileItemListView::visibleRolesSizes(const KItemRangeL
                 maxTimeExceeded = true;
                 break;
             }
+            ++calculatedItemCount;
         }
         if (maxTimeExceeded) {
             break;
         }
-        ++calculatedItemCount;
-    }
-
-    // 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
index 3237187b43381bb2d1553f7ccafaf1d4db775e45..45db700c515be2906ff49aeb6f817d8600cc2ce3 100644 (file)
@@ -205,7 +205,7 @@ void KItemListContainer::wheelEvent(QWheelEvent* event)
     }
 
     KItemListView* view = m_controller->view();
-    
+
     if (!view || event->orientation() != view->scrollOrientation()) {
         return;
     }
@@ -343,7 +343,7 @@ void KItemListContainer::updateItemOffsetScrollBar()
     }
 
     const int value = view->itemOffset();
-    const int maximum = qMax(0, int(view->maximumItemOffset() - pageStep));
+    const int maximum = qMax(0, int(view->maximumItemOffset()) - pageStep);
 
     itemOffsetScrollBar->setSingleStep(singleStep);
     itemOffsetScrollBar->setPageStep(pageStep);
@@ -366,13 +366,16 @@ void KItemListContainer::updateGeometries()
 
     rect.adjust(0, 0, -widthDec, -heightDec);
 
-    m_controller->view()->setGeometry(QRect(0, 0, rect.width(), rect.height()));
+    const QRectF newGeometry(0, 0, rect.width(), rect.height());
+    if (m_controller->view()->geometry() != newGeometry) {
+        m_controller->view()->setGeometry(newGeometry);
 
-    static_cast<KItemListContainerViewport*>(viewport())->scene()->setSceneRect(0, 0, rect.width(), rect.height());
-    static_cast<KItemListContainerViewport*>(viewport())->viewport()->setGeometry(QRect(0, 0, rect.width(), rect.height()));
+        static_cast<KItemListContainerViewport*>(viewport())->scene()->setSceneRect(0, 0, rect.width(), rect.height());
+        static_cast<KItemListContainerViewport*>(viewport())->viewport()->setGeometry(QRect(0, 0, rect.width(), rect.height()));
 
-    updateScrollOffsetScrollBar();
-    updateItemOffsetScrollBar();
+        updateScrollOffsetScrollBar();
+        updateItemOffsetScrollBar();
+    }
 }
 
 void KItemListContainer::initialize()
index 1224ff6bd4324bcb0fb8d7ed01ef28a438d6ef95..988a45d409236c11135528ac330f039f6a5db7d3 100644 (file)
@@ -60,6 +60,7 @@ KItemListView::KItemListView(QGraphicsWidget* parent) :
     m_model(0),
     m_visibleRoles(),
     m_visibleRolesSizes(),
+    m_stretchedVisibleRolesSizes(),
     m_widgetCreator(0),
     m_groupHeaderCreator(0),
     m_styleOption(),
@@ -136,7 +137,7 @@ void KItemListView::setItemSize(const QSizeF& itemSize)
     m_itemSize = itemSize;
 
     if (itemSize.isEmpty()) {
-        updateVisibleRoleSizes();
+        updateVisibleRolesSizes();
     }
 
     if (itemSize.width() < previousSize.width() || itemSize.height() < previousSize.height()) {
@@ -210,14 +211,14 @@ void KItemListView::setVisibleRoles(const QList<QByteArray>& roles)
         it.next();
         KItemListWidget* widget = it.value();
         widget->setVisibleRoles(roles);
-        widget->setVisibleRolesSizes(m_visibleRolesSizes);
+        widget->setVisibleRolesSizes(m_stretchedVisibleRolesSizes);
     }
 
     m_sizeHintResolver->clearCache();
     m_layouter->markAsDirty();
     onVisibleRolesChanged(roles, previousRoles);
 
-    updateVisibleRoleSizes();
+    updateVisibleRolesSizes();
     updateLayout();
 
     if (m_header) {
@@ -335,6 +336,7 @@ const KItemListStyleOption& KItemListView::styleOption() const
 void KItemListView::setGeometry(const QRectF& rect)
 {
     QGraphicsWidget::setGeometry(rect);
+
     if (!m_model) {
         return;
     }
@@ -349,7 +351,10 @@ void KItemListView::setGeometry(const QRectF& rect)
         m_layoutTimer->start();
     }
 
-    updateVisibleRoleSizes();
+    // Changing the geometry does not require to do an expensive
+    // update of the visible-roles sizes, only the stretched sizes
+    // need to be adjusted to the new size.
+    updateStretchedVisibleRolesSizes();
 }
 
 int KItemListView::itemAt(const QPointF& pos) const
@@ -605,7 +610,7 @@ void KItemListView::resizeEvent(QGraphicsSceneResizeEvent* event)
 
 void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
 {
-    updateVisibleRoleSizes(itemRanges);
+    updateVisibleRolesSizes(itemRanges);
 
     const bool hasMultipleRanges = (itemRanges.count() > 1);
     if (hasMultipleRanges) {
@@ -678,7 +683,7 @@ void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
 
 void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
 {
-    updateVisibleRoleSizes();
+    updateVisibleRolesSizes();
 
     const bool hasMultipleRanges = (itemRanges.count() > 1);
     if (hasMultipleRanges) {
@@ -762,7 +767,7 @@ void KItemListView::slotItemsChanged(const KItemRangeList& itemRanges,
 {
     const bool updateSizeHints = itemSizeHintUpdateRequired(roles);
     if (updateSizeHints) {
-        updateVisibleRoleSizes(itemRanges);
+        updateVisibleRolesSizes(itemRanges);
     }
 
     foreach (const KItemRange& itemRange, itemRanges) {
@@ -925,8 +930,9 @@ void KItemListView::slotVisibleRoleWidthChanged(const QByteArray& role,
         QSizeF roleSize = m_visibleRolesSizes.value(role);
         roleSize.setWidth(currentWidth);
         m_visibleRolesSizes.insert(role, roleSize);
+        m_stretchedVisibleRolesSizes.insert(role, roleSize);
 
-        updateVisibleRoleSizes();
+        updateVisibleRolesSizes();
         updateLayout();
     }
 }
@@ -1340,7 +1346,7 @@ void KItemListView::setLayouterSize(const QSizeF& size, SizeType sizeType)
 void KItemListView::updateWidgetProperties(KItemListWidget* widget, int index)
 {
     widget->setVisibleRoles(m_visibleRoles);
-    widget->setVisibleRolesSizes(m_visibleRolesSizes);
+    widget->setVisibleRolesSizes(m_stretchedVisibleRolesSizes);
     widget->setStyleOption(m_styleOption);
 
     const KItemListSelectionManager* selectionManager = m_controller->selectionManager();
@@ -1373,7 +1379,7 @@ QHash<QByteArray, qreal> KItemListView::headerRolesWidths() const
 {
     QHash<QByteArray, qreal> rolesWidths;
 
-    QHashIterator<QByteArray, QSizeF> it(m_visibleRolesSizes);
+    QHashIterator<QByteArray, QSizeF> it(m_stretchedVisibleRolesSizes);
     while (it.hasNext()) {
         it.next();
         rolesWidths.insert(it.key(), it.value().width());
@@ -1382,7 +1388,7 @@ QHash<QByteArray, qreal> KItemListView::headerRolesWidths() const
     return rolesWidths;
 }
 
-void KItemListView::updateVisibleRoleSizes(const KItemRangeList& itemRanges)
+void KItemListView::updateVisibleRolesSizes(const KItemRangeList& itemRanges)
 {
     if (!m_itemSize.isEmpty() || m_useHeaderWidths) {
         return;
@@ -1424,12 +1430,27 @@ void KItemListView::updateVisibleRoleSizes(const KItemRangeList& itemRanges)
         }
     }
 
-    if (m_header) {
-        m_header->setVisibleRolesWidths(headerRolesWidths());
+    updateStretchedVisibleRolesSizes();
+}
+
+void KItemListView::updateVisibleRolesSizes()
+{
+    const int itemCount = m_model->count();
+    if (itemCount > 0) {
+        updateVisibleRolesSizes(KItemRangeList() << KItemRange(0, itemCount));
+    }
+}
+
+void KItemListView::updateStretchedVisibleRolesSizes()
+{
+    if (!m_itemSize.isEmpty() || m_useHeaderWidths) {
+        return;
     }
 
     // Calculate the maximum size of an item by considering the
-    // visible role sizes and apply them to the layouter.
+    // visible role sizes and apply them to the layouter. If the
+    // size does not use the available view-size it the size of the
+    // first role will get stretched.
     qreal requiredWidth = 0;
     qreal requiredHeight = 0;
 
@@ -1441,27 +1462,44 @@ void KItemListView::updateVisibleRoleSizes(const KItemRangeList& itemRanges)
         requiredHeight += visibleRoleSize.height();
     }
 
+    m_stretchedVisibleRolesSizes = m_visibleRolesSizes;
+    const QByteArray role = visibleRoles().first();
+    QSizeF firstRoleSize = m_stretchedVisibleRolesSizes.value(role);
+
     QSizeF dynamicItemSize = m_itemSize;
+
     if (dynamicItemSize.width() <= 0) {
-        dynamicItemSize.setWidth(qMax(requiredWidth, size().width()));
+        const qreal availableWidth = size().width();
+        if (requiredWidth < availableWidth) {
+            // Stretch the first role to use the whole width for the item
+            firstRoleSize.rwidth() += availableWidth - requiredWidth;
+            m_stretchedVisibleRolesSizes.insert(role, firstRoleSize);
+        }
+        dynamicItemSize.setWidth(qMax(requiredWidth, availableWidth));
     }
+
     if (dynamicItemSize.height() <= 0) {
-        dynamicItemSize.setHeight(qMax(requiredHeight, size().height()));
+        const qreal availableHeight = size().height();
+        if (requiredHeight < availableHeight) {
+            // Stretch the first role to use the whole height for the item
+            firstRoleSize.rheight() += availableHeight - requiredHeight;
+            m_stretchedVisibleRolesSizes.insert(role, firstRoleSize);
+        }
+        dynamicItemSize.setHeight(qMax(requiredHeight, availableHeight));
     }
 
     m_layouter->setItemSize(dynamicItemSize);
 
+    if (m_header) {
+        m_header->setVisibleRolesWidths(headerRolesWidths());
+    }
+
     // Update the role sizes for all visible widgets
     foreach (KItemListWidget* widget, visibleItemListWidgets()) {
-        widget->setVisibleRolesSizes(m_visibleRolesSizes);
+        widget->setVisibleRolesSizes(m_stretchedVisibleRolesSizes);
     }
 }
 
-void KItemListView::updateVisibleRoleSizes()
-{
-    updateVisibleRoleSizes(KItemRangeList() << KItemRange(0, m_model->count()));
-}
-
 int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc)
 {
     int inc = 0;
index 091d2c36b90b6ff46f77c58bbf666b6f276b48de..73b736bf7088ed7147024c10b393286e3a00ffff 100644 (file)
@@ -337,16 +337,24 @@ private:
     QHash<QByteArray, qreal> headerRolesWidths() const;
 
     /**
-     * Updates m_visibleRoleSizes by calling KItemListView::visibleRoleSizes()
-     * if the m_itemRect is empty and no custom header-widths are used
-     * (see m_useHeaderWidths).
+     * Updates m_visibleRolesSizes by calling KItemListView::visibleRolesSizes().
+     * Nothing will be done if m_itemRect is not empty or custom header-widths
+     * are used (see m_useHeaderWidths). Also m_strechedVisibleRolesSizes will be adjusted
+     * to respect the available view-size.
      */
-    void updateVisibleRoleSizes(const KItemRangeList& itemRanges);
+    void updateVisibleRolesSizes(const KItemRangeList& itemRanges);
 
     /**
      * Convenience method for updateVisibleRoleSizes(KItemRangeList() << KItemRange(0, m_model->count()).
      */
-    void updateVisibleRoleSizes();
+    void updateVisibleRolesSizes();
+
+    /**
+     * Updates m_stretchedVisibleRolesSizes based on m_visibleRolesSizes and the available
+     * view-size. Nothing will be done if m_itemRect is not empty or custom header-widths
+     * are used (see m_useHeaderWidths).
+     */
+    void updateStretchedVisibleRolesSizes();
 
     /**
      * Helper function for triggerAutoScrolling().
@@ -369,6 +377,7 @@ private:
     KItemModelBase* m_model;
     QList<QByteArray> m_visibleRoles;
     QHash<QByteArray, QSizeF> m_visibleRolesSizes;
+    QHash<QByteArray, QSizeF> m_stretchedVisibleRolesSizes;
     KItemListWidgetCreatorBase* m_widgetCreator;
     KItemListGroupHeaderCreatorBase* m_groupHeaderCreator;
     KItemListStyleOption m_styleOption;