]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Do a synchronous layout for dynamic item sizes when changing the geometry
authorPeter Penz <peter.penz19@gmail.com>
Tue, 17 Jan 2012 20:08:39 +0000 (21:08 +0100)
committerPeter Penz <peter.penz19@gmail.com>
Tue, 17 Jan 2012 20:11:49 +0000 (21:11 +0100)
This prevents a delayed update when resizing the window e.g. in the details
view. As no animated item position changes can happen for dynamic item sizes
the synchronous relayout is fine from a performance point of view.

BUG: 290953
FIXED-IN: 4.8.0

src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h

index 1f96b51ba6dc946169d5b2bb82d43df5a47bc9b6..49e23f9b73ed877582ed715c594d32151a254928 100644 (file)
@@ -355,20 +355,55 @@ void KItemListView::setGeometry(const QRectF& rect)
         return;
     }
 
         return;
     }
 
-    if (m_model->count() > 0) {
-        prepareLayoutForIncreasedItemCount(rect.size(), LayouterSize);
+    const QSizeF newSize = rect.size();
+    if (m_itemSize.isEmpty()) {
+        // The item size is dynamic:
+        // 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();
+        
+        if (m_useHeaderWidths) {
+            QSizeF dynamicItemSize = m_layouter->itemSize();
+    
+            if (m_itemSize.width() < 0) {
+                const qreal requiredWidth = visibleRolesSizesWidthSum();
+                if (newSize.width() > requiredWidth) {
+                    dynamicItemSize.setWidth(newSize.width());
+                }
+                const qreal headerWidth = qMax(newSize.width(), requiredWidth);
+                m_header->resize(headerWidth, m_header->size().height());
+            }
+    
+            if (m_itemSize.height() < 0) {
+                const qreal requiredHeight = visibleRolesSizesHeightSum();
+                if (newSize.height() > requiredHeight) {
+                    dynamicItemSize.setHeight(newSize.height());
+                }
+                // TODO: KItemListHeader is not prepared for vertical alignment
+            }
+    
+            m_layouter->setItemSize(dynamicItemSize);
+        }
+        
+        // Triggering a synchronous layout is fine from a performance point of view,
+        // as with dynamic item sizes no moving animation must be done.
+        m_layouter->setSize(newSize);
+        doLayout(Animation);
     } else {
     } else {
-        m_layouter->setSize(rect.size());
-    }
+        // The item size is not dynamic and most probably the geometry change results
+        // in animated position changes of the items. Trigger an asynchronous relayout
+        // with m_layoutTimer to prevent performance bottlenecks.
+        if (m_model->count() > 0) {
+            prepareLayoutForIncreasedItemCount(newSize, LayouterSize);
+        } else {
+            m_layouter->setSize(newSize);
+        }
 
 
-    if (!m_layoutTimer->isActive()) {
-        m_layoutTimer->start();
+        if (!m_layoutTimer->isActive()) {
+          m_layoutTimer->start();
+        }
     }
     }
-
-    // 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
 }
 
 int KItemListView::itemAt(const QPointF& pos) const
@@ -707,34 +742,6 @@ QList<KItemListWidget*> KItemListView::visibleItemListWidgets() const
     return m_visibleItems.values();
 }
 
     return m_visibleItems.values();
 }
 
-void KItemListView::resizeEvent(QGraphicsSceneResizeEvent* event)
-{
-    QGraphicsWidget::resizeEvent(event);
-    if (m_itemSize.isEmpty() && m_useHeaderWidths) {
-        QSizeF dynamicItemSize = m_layouter->itemSize();
-        const QSizeF newSize = event->newSize();
-
-        if (m_itemSize.width() < 0) {
-            const qreal requiredWidth = visibleRolesSizesWidthSum();
-            if (newSize.width() > requiredWidth) {
-                dynamicItemSize.setWidth(newSize.width());
-            }
-            const qreal headerWidth = qMax(newSize.width(), requiredWidth);
-            m_header->resize(headerWidth, m_header->size().height());
-        }
-
-        if (m_itemSize.height() < 0) {
-            const qreal requiredHeight = visibleRolesSizesHeightSum();
-            if (newSize.height() > requiredHeight) {
-                dynamicItemSize.setHeight(newSize.height());
-            }
-            // TODO: KItemListHeader is not prepared for vertical alignment
-        }
-
-        m_layouter->setItemSize(dynamicItemSize);
-    }
-}
-
 void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
 {
     updateVisibleRolesSizes(itemRanges);
 void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
 {
     updateVisibleRolesSizes(itemRanges);
index d44a08c027a880a1e53faa1bcc71a367fc42b55b..4969d01b704c839174001441694bb1bf8f5c165a 100644 (file)
@@ -286,9 +286,6 @@ protected:
 
     QList<KItemListWidget*> visibleItemListWidgets() const;
 
 
     QList<KItemListWidget*> visibleItemListWidgets() const;
 
-    /** @reimp */
-    virtual void resizeEvent(QGraphicsSceneResizeEvent* event);
-
 protected slots:
     virtual void slotItemsInserted(const KItemRangeList& itemRanges);
     virtual void slotItemsRemoved(const KItemRangeList& itemRanges);
 protected slots:
     virtual void slotItemsInserted(const KItemRangeList& itemRanges);
     virtual void slotItemsRemoved(const KItemRangeList& itemRanges);