]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix crash related to group-headers
authorPeter Penz <peter.penz19@gmail.com>
Thu, 17 May 2012 09:14:04 +0000 (11:14 +0200)
committerPeter Penz <peter.penz19@gmail.com>
Thu, 17 May 2012 09:16:19 +0000 (11:16 +0200)
If multiple ranges are inserted or removed, the updating of
the group-headers may only be done after _all_ ranges have been
inserted/removed and not after each individual range. Otherwise
the layouter-cache is not in a consistent state yet.

src/kitemviews/kitemlistview.cpp

index d1d8749aa851f20733808d3d575cc279d9a2c14d..0f31cb5a1fb7e86453bb95f77e7238e0952fcc57 100644 (file)
@@ -922,13 +922,6 @@ void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
             }
         }
 
-        // In case if items of the same group have been inserted before an item that
-        // currently represents the first item of the group, the group header of
-        // this item must be removed.
-        if (m_grouped && index + count < m_model->count()) {
-            updateGroupHeaderForWidget(m_visibleItems.value(index + count));
-        }
-
         if (m_model->count() == count && m_activeTransactions == 0) {
             // Check whether a scrollbar is required to show the inserted items. In this case
             // the size of the layouter will be decreased before calling doLayout(): This prevents
@@ -967,9 +960,17 @@ void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
 #endif
         m_endTransactionAnimationHint = NoAnimation;
         endTransaction();
+
         updateSiblingsInformation();
     }
 
+    if (m_grouped && (hasMultipleRanges || itemRanges.first().count < m_model->count())) {
+        // In case if items of the same group have been inserted before an item that
+        // currently represents the first item of the group, the group header of
+        // this item must be removed.
+        updateVisibleGroupHeaders();
+    }
+
     if (useAlternateBackgrounds()) {
         updateAlternateBackgrounds();
     }
@@ -1056,12 +1057,6 @@ void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
             }
         }
 
-        // In case if the first item of a group has been removed, the group header
-        // must be applied to the next visible item.
-        if (m_grouped && index < m_model->count()) {
-            updateGroupHeaderForWidget(m_visibleItems.value(index));
-        }
-
         if (!hasMultipleRanges) {
             // The decrease-layout-size optimization in KItemListView::slotItemsInserted()
             // assumes an updated geometry. If items are removed during an active transaction,
@@ -1091,6 +1086,12 @@ void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
         updateSiblingsInformation();
     }
 
+    if (m_grouped && (hasMultipleRanges || m_model->count() > 0)) {
+        // In case if the first item of a group has been removed, the group header
+        // must be applied to the next visible item.
+        updateVisibleGroupHeaders();
+    }
+
     if (useAlternateBackgrounds()) {
         updateAlternateBackgrounds();
     }