mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-19 16:31:21 +00:00
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.
This commit is contained in:
parent
d3a2f1ba82
commit
982ce7ae20
|
@ -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();
|
||||
|
|
|
@ -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>)),
|
||||
|
|
Loading…
Reference in a new issue