From 982ce7ae203de9142ca3e79e6fdeacd003fb0414 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Wed, 21 Mar 2012 12:08:59 +0100 Subject: [PATCH] Prevent flickering when updating items 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 | 11 +++++++++-- src/kitemviews/kfileitemmodelrolesupdater.cpp | 7 ++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 49c40eda1d..7a4323fea6 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -783,7 +783,15 @@ void KFileItemModel::slotRefreshItems(const QList >& 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 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 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 data; - data.insert("iconPixmap", QPixmap()); data.insert("url", item.url()); const bool isDir = item.isDir(); diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index 06749f993f..7b0d75dba2 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -91,9 +91,9 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO this, SLOT(slotItemsChanged(KItemRangeList,QSet))); // 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)),