]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/iconmanager.h
Improve the performance of the code part which checks which items are visible. Althou...
[dolphin.git] / src / iconmanager.h
index d6cf5332b6fef16d25208eb1fa9032e266436ae8..b5a8221750b05368c723859dba2430b81fa3556a 100644 (file)
@@ -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<KJob*> m_previewJobs;
     DolphinModel* m_dolphinModel;
     DolphinSortFilterProxyModel* m_proxyModel;
 
-    QList<CutItem> m_cutItemsCache;
+    KMimeTypeResolver* m_mimeTypeResolver;
+
+    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;
+
+    /**
+     * Contains 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