]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodel.cpp
Prevent flickering when updating items
[dolphin.git] / src / kitemviews / kfileitemmodel.cpp
index 4b9f2f00ed111e20858a8175eeee6bab305b0892..7a4323fea6a186ff8e7d5dc514a8e5ac84127dc0 100644 (file)
@@ -783,7 +783,15 @@ void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >&
         const int index = m_items.value(oldItem.url(), -1);
         if (index >= 0) {
             m_itemData[index]->item = newItem;
-            m_itemData[index]->values = retrieveData(newItem);
+
+            // Keep old values as long as possible if they could not retrieved synchronously yet.
+            // The update of the values will be done asynchronously by KFileItemModelRolesUpdater.
+            QHashIterator<QByteArray, QVariant> it(retrieveData(newItem));
+            while (it.hasNext()) {
+                it.next();
+                m_itemData[index]->values.insert(it.key(), it.value());
+            }
+
             m_items.remove(oldItem.url());
             m_items.insert(newItem.url(), index);
             indexes.append(index);
@@ -1146,7 +1154,6 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item)
     // KFileItem::iconName() can be very expensive if the MIME-type is unknown
     // and hence will be retrieved asynchronously by KFileItemModelRolesUpdater.
     QHash<QByteArray, QVariant> data;
-    data.insert("iconPixmap", QPixmap());
     data.insert("url", item.url());
 
     const bool isDir = item.isDir();
@@ -1564,10 +1571,12 @@ int KFileItemModel::expandedParentsCountCompare(const ItemData* a, const ItemDat
     bool isDirB = true;
     const QString subPathB = subPath(b->item, pathB, index, &isDirB);
 
-    if (isDirA && !isDirB) {
-        return (sortOrder() == Qt::AscendingOrder) ? -1 : +1;
-    } else if (!isDirA && isDirB) {
-        return (sortOrder() == Qt::AscendingOrder) ? +1 : -1;
+    if (m_sortFoldersFirst || m_sortRole == SizeRole) {
+        if (isDirA && !isDirB) {
+            return (sortOrder() == Qt::AscendingOrder) ? -1 : +1;
+        } else if (!isDirA && isDirB) {
+            return (sortOrder() == Qt::AscendingOrder) ? +1 : -1;
+        }
     }
 
     // Compare the items of the parents that represent the first