]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Workaround for failed comparison of items in KFileItemModelRolesUpdater
authorFrank Reininghaus <frank78ac@googlemail.com>
Sat, 27 Oct 2012 07:48:51 +0000 (09:48 +0200)
committerFrank Reininghaus <frank78ac@googlemail.com>
Sat, 27 Oct 2012 07:48:51 +0000 (09:48 +0200)
The real fix is in the KDE/4.10 branch of kdelibs
(commit b8f64ca3f4b6311519c21046031d66d9d0a570c6). We work around the
problem that the KFileItem that a preview has been requested for is
different from the KFileItems in the sets m_pendingVisibleItems and
m_pendingInvisibleItems by refreshing those sets when we detect that
the bug has been triggered.

BUG: 304986
FIXED-IN: 4.9.3

src/kitemviews/kfileitemmodelrolesupdater.cpp

index f5de6b6dd740fea37ea68bbf3f5dc69e26f453ed..57beb9d2f63637c4aa98ef4cef1379e24e6d2c04 100644 (file)
@@ -439,9 +439,22 @@ void KFileItemModelRolesUpdater::slotSortRoleChanged(const QByteArray& current,
 
 void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPixmap& pixmap)
 {
+    const int oldNumberOfPendingItems = m_pendingVisibleItems.count() + m_pendingInvisibleItems.count();
+
     m_pendingVisibleItems.remove(item);
     m_pendingInvisibleItems.remove(item);
 
+    const int newNumberOfPendingItems = m_pendingVisibleItems.count() + m_pendingInvisibleItems.count();
+
+    if (oldNumberOfPendingItems == newNumberOfPendingItems) {
+        // 'item' could not be removed from either of the sets. It looks like
+        // we have hit bug 304986. Replace the items in the sets by the items
+        // in the model to work around the problem.
+        // NOTE: This workaround is not needed any more in KDE 4.10.
+        m_pendingVisibleItems = sortedItems(m_pendingVisibleItems).toSet();
+        m_pendingInvisibleItems = sortedItems(m_pendingInvisibleItems).toSet();
+    }
+
     const int index = m_model->index(item);
     if (index < 0) {
         return;
@@ -499,9 +512,22 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi
 
 void KFileItemModelRolesUpdater::slotPreviewFailed(const KFileItem& item)
 {
+    const int oldNumberOfPendingItems = m_pendingVisibleItems.count() + m_pendingInvisibleItems.count();
+
     m_pendingVisibleItems.remove(item);
     m_pendingInvisibleItems.remove(item);
 
+    const int newNumberOfPendingItems = m_pendingVisibleItems.count() + m_pendingInvisibleItems.count();
+
+    if (oldNumberOfPendingItems == newNumberOfPendingItems) {
+        // 'item' could not be removed from either of the sets. It looks like
+        // we have hit bug 304986. Replace the items in the sets by the items
+        // in the model to work around the problem.
+        // NOTE: This workaround is not needed any more in KDE 4.10.
+        m_pendingVisibleItems = sortedItems(m_pendingVisibleItems).toSet();
+        m_pendingInvisibleItems = sortedItems(m_pendingInvisibleItems).toSet();
+    }
+
     const bool clearPreviews = m_clearPreviews;
     m_clearPreviews = true;
     applyResolvedRoles(item, ResolveAll);