+void IconManager::pausePreviews()
+{
+ foreach (KJob* job, m_previewJobs) {
+ Q_ASSERT(job != 0);
+ job->suspend();
+ }
+ m_scrollAreaTimer->start();
+}
+
+void IconManager::resumePreviews()
+{
+ // Before creating new preview jobs the m_pendingItems queue must be
+ // cleaned up by removing the already dispatched items. Implementation
+ // note: The order of the m_dispatchedItems queue and the m_pendingItems
+ // queue is usually equal. So even when having a lot of elements the
+ // nested loop is no performance bottle neck, as the inner loop is only
+ // entered once in most cases.
+ foreach (const KUrl& url, m_dispatchedItems) {
+ QList<KUrl>::iterator begin = m_pendingItems.begin();
+ QList<KUrl>::iterator end = m_pendingItems.end();
+ for (QList<KUrl>::iterator it = begin; it != end; ++it) {
+ if ((*it) == url) {
+ m_pendingItems.erase(it);
+ break;
+ }
+ }
+ }
+ m_dispatchedItems.clear();
+
+ // Create a new preview job for the remaining items.
+ // Order the items in a way that the preview for the visible items
+ // is generated first, as this improves the feeled performance a lot.
+ const QRect visibleArea = m_view->viewport()->rect();
+ KFileItemList orderedItems;
+ foreach (const KUrl& url, m_pendingItems) {
+ const QModelIndex dirIndex = m_dolphinModel->indexForUrl(url);
+ const KFileItem item = m_dolphinModel->itemForIndex(dirIndex);
+ const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex);
+ const QRect itemRect = m_view->visualRect(proxyIndex);
+ if (itemRect.intersects(visibleArea)) {
+ orderedItems.insert(0, item);
+ } else {
+ orderedItems.append(item);
+ }
+ }
+
+ // Kill all suspended preview jobs. Usually when a preview job
+ // has been finished, slotPreviewJobFinished() clears all item queues.
+ // This is not wanted in this case, as a new job is created afterwards
+ // for m_pendingItems.
+ m_clearItemQueues = false;
+ killPreviewJobs();
+ m_clearItemQueues = true;
+
+ startPreviewJob(orderedItems);
+}
+