X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/3d4e6938f57fcf010b4fda7255384098327eb67d..629ec98952bcf38bc99f2b11bc37bdc2ec7aabcc:/src/iconmanager.h diff --git a/src/iconmanager.h b/src/iconmanager.h index d6cf5332b..b5a822175 100644 --- a/src/iconmanager.h +++ b/src/iconmanager.h @@ -30,6 +30,7 @@ class DolphinModel; class DolphinSortFilterProxyModel; class KJob; +class KMimeTypeResolver; class QAbstractItemView; /** @@ -38,6 +39,15 @@ class QAbstractItemView; * 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 { @@ -49,30 +59,68 @@ public: void setShowPreview(bool show); bool showPreview() const; + /** + * Updates the previews for all already available items. It is only necessary + * to invoke this method when the icon size of the abstract item view has + * been changed. + */ + void updatePreviews(); + + /** + * Cancels all pending previews. Should be invoked when the URL of the item + * view has been changed. + */ + void cancelPreviews(); + 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 - * set m_previewJob to 0. + * removes the job from the m_previewJobs list. */ void slotPreviewJobFinished(KJob* job); /** 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: + /** + * 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 * the clipboard. @@ -82,15 +130,37 @@ private: /** Applies an item effect to all cut items. */ void applyCutItemEffect(); - /** Applies an item effect to the hidden item \a hiddenItem. */ - void applyHiddenItemEffect(const KFileItem& hiddenItem); + /** + * Applies a frame around the icon. False is returned if + * no frame has been added because the icon is too small. + */ + bool applyImageFrame(QPixmap& icon); + + /** + * Resizes the icon to \a maxSize if the icon size does not + * fit into the maximum size. The aspect ratio of the icon + * is kept. + */ + void limitToSize(QPixmap& icon, const QSize& maxSize); -private: /** - * Remembers the original pixmap for an item before - * the cut effect is applied. + * Starts a new preview job for the items \a to m_previewJobs + * and triggers the preview timer. */ - struct CutItem + void startPreviewJob(const KFileItemList& items); + + /** Kills all ongoing preview jobs. */ + void killPreviewJobs(); + + /** + * Returns true, if the item list \a items contains an item with the + * URL \a url. This is a helper method for IconManager::generatePreviews(). + */ + bool itemListContains(const KFileItemList& items, const KUrl& url) const; + +private: + /** Remembers the pixmap for an item specified by an URL. */ + struct ItemInfo { KUrl url; QPixmap pixmap; @@ -98,12 +168,35 @@ private: 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 m_previewJobs; DolphinModel* m_dolphinModel; DolphinSortFilterProxyModel* m_proxyModel; - QList m_cutItemsCache; + KMimeTypeResolver* m_mimeTypeResolver; + + QList m_cutItemsCache; + QList 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 m_pendingItems; + + /** + * Contains the URLs of all items, where a preview has already been + * generated by the preview jobs. + */ + QList m_dispatchedItems; }; inline bool IconManager::showPreview() const