]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Prevent flickering when updating items
authorPeter Penz <peter.penz19@gmail.com>
Wed, 21 Mar 2012 11:08:59 +0000 (12:08 +0100)
committerPeter Penz <peter.penz19@gmail.com>
Wed, 21 Mar 2012 11:12:35 +0000 (12:12 +0100)
When downloading images from e.g. the camera-IO-slave the files
will be downloaded as *.part files and renamed afterwards. The renaming
results in an undetermined mimetype and hence the probably already available
preview or icon gets replaced by a dummy icon. The patch fixes this by
keeping the old values as long until they have been resolved by
KFileItemModelRolesUpdater.

src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodelrolesupdater.cpp

index 49c40eda1d8a973cc15ddd55e24fe9eb6bc56d8c..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();
index 06749f993f605ad7cc39a2a6bf6a60a95a95d245..7b0d75dba2762238608d81f88eacdcd8b72977b2 100644 (file)
@@ -91,9 +91,9 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO
             this,    SLOT(slotItemsChanged(KItemRangeList,QSet<QByteArray>)));
 
     // Use a timer to prevent that each call of slotItemsChanged() results in a synchronous
-    // resolving of the roles. Postpone the resolving until no update has been done for 2 seconds.
+    // resolving of the roles. Postpone the resolving until no update has been done for 1 second.
     m_changedItemsTimer = new QTimer(this);
-    m_changedItemsTimer->setInterval(2000);
+    m_changedItemsTimer->setInterval(1000);
     m_changedItemsTimer->setSingleShot(true);
     connect(m_changedItemsTimer, SIGNAL(timeout()), this, SLOT(resolveChangedItems()));
 }
@@ -418,6 +418,7 @@ void KFileItemModelRolesUpdater::resolveChangedItems()
             itemRanges.append(KItemRange(index, 1));
         }
     }
+    m_changedItems.clear();
 
     startUpdating(itemRanges);
 }
@@ -711,7 +712,7 @@ bool KFileItemModelRolesUpdater::applyResolvedRoles(const KFileItem& item, Resol
         data.insert("iconName", item.iconName());
 
         if (m_clearPreviews) {
-            data.insert("iconPixmap", QString());
+            data.insert("iconPixmap", QPixmap());
         }
 
         disconnect(m_model, SIGNAL(itemsChanged(KItemRangeList,QSet<QByteArray>)),