* Per default a preview is generated for each item.
* Additionally the clipboard is checked for cut items.
* The icon state for cut items gets dimmed automatically.
+ *
+ * The following strategy is used when creating previews:
+ * - The previews for currently visible items are created before
+ * the previews for invisible items.
+ * - If the user changes the visible area by using the scrollbars,
+ * all pending previews get paused. As soon as the user stays
+ * on the same position for a short delay, the previews are
+ * resumed. Also in this case the previews for the visible items
+ * are generated first.
*/
class IconManager : public QObject
{
private slots:
/**
- * Updates the icons of for each item in \a items by making hidden
- * items semitransparent and generating previews. The current preview
- * settings (maximum size, 'Show Preview' menu) are respected.
+ * Generates previews for the items \a items asynchronously.
*/
- void updateIcons(const KFileItemList& items);
+ void generatePreviews(const KFileItemList &items);
/**
- * Replaces the icon of the item \a item by the preview pixmap
- * \a pixmap.
+ * Adds the preview \a pixmap for the item \a item to the preview
+ * queue and starts a timer which will dispatch the preview queue
+ * later.
*/
- void replaceIcon(const KFileItem& item, const QPixmap& pixmap);
+ void addToPreviewQueue(const KFileItem& item, const QPixmap& pixmap);
/**
* Is invoked when the preview job has been finished and
/** Synchronizes the item icon with the clipboard of cut items. */
void updateCutItems();
+ /**
+ * Dispatches the preview queue block by block within
+ * time slices.
+ */
+ void dispatchPreviewQueue();
+
+ /**
+ * Pauses all preview jobs and invokes IconManager::resumePreviews()
+ * after a short delay. Is invoked as soon as the user has moved
+ * a scrollbar.
+ */
+ void pausePreviews();
+
+ /**
+ * Resumes the previews that have been paused after moving the
+ * scrollbar. The previews for the current visible area are
+ * generated first.
+ */
+ void resumePreviews();
+
private:
- void generatePreviews(const KFileItemList &items);
+ /**
+ * Replaces the icon of the item with the \a url by the preview pixmap
+ * \a pixmap.
+ */
+ void replaceIcon(const KUrl& url, const QPixmap& pixmap);
/**
* Returns true, if the item \a item has been cut into
*/
void limitToSize(QPixmap& icon, const QSize& maxSize);
+ /**
+ * Starts a new preview job for the items \a to m_previewJobs
+ * and triggers the preview timer.
+ */
+ void startPreviewJob(const KFileItemList& items);
+
/** Kills all ongoing preview jobs. */
- void killJobs();
+ void killPreviewJobs();
private:
- /**
- * Remembers the original pixmap for an item before
- * the cut effect is applied.
- */
- struct CutItem
+ /** Remembers the pixmap for an item specified by an URL. */
+ struct ItemInfo
{
KUrl url;
QPixmap pixmap;
bool m_showPreview;
+ /**
+ * True, if m_pendingItems and m_dispatchedItems should be
+ * cleared when the preview jobs have been finished.
+ */
+ bool m_clearItemQueues;
+
QAbstractItemView* m_view;
+ QTimer* m_previewTimer;
+ QTimer* m_scrollAreaTimer;
QList<KJob*> m_previewJobs;
DolphinModel* m_dolphinModel;
DolphinSortFilterProxyModel* m_proxyModel;
- QList<CutItem> m_cutItemsCache;
+ QList<ItemInfo> m_cutItemsCache;
+ QList<ItemInfo> m_previews;
+
+ /**
+ * Contains the URLs of all items where a preview must be generated, but
+ * where the preview job has not dispatched the items yet.
+ */
+ QList<KUrl> m_pendingItems;
+
+ /**
+ * Containts the URLs of all items, where a preview has already been
+ * generated by the preview jobs.
+ */
+ QList<KUrl> m_dispatchedItems;
};
inline bool IconManager::showPreview() const