diff options
| author | Peter Penz <[email protected]> | 2008-06-01 22:15:13 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2008-06-01 22:15:13 +0000 |
| commit | 32298bba66fe57a6a42a1b92ae9aec002a637483 (patch) | |
| tree | 5067f55644c0b6159775fc2ebf4efcc6b4dded4b /src/iconmanager.h | |
| parent | 70d1cb86e0e7f2ab3981b2d2e91eacb65844512d (diff) | |
Improve the performance when creating previews for thousands of items by the following strategy:
- 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.
svn path=/trunk/KDE/kdebase/apps/; revision=815480
Diffstat (limited to 'src/iconmanager.h')
| -rw-r--r-- | src/iconmanager.h | 56 |
1 files changed, 51 insertions, 5 deletions
diff --git a/src/iconmanager.h b/src/iconmanager.h index f72811c27..e9d7c9b78 100644 --- a/src/iconmanager.h +++ b/src/iconmanager.h @@ -38,6 +38,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 { @@ -73,11 +82,25 @@ private slots: void updateCutItems(); /** - * Dispatches the preview queue m_previews block by block within + * 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 @@ -107,13 +130,17 @@ private: */ 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 pixmap for an item specified by an URL. - */ + /** Remembers the pixmap for an item specified by an URL. */ struct ItemInfo { KUrl url; @@ -122,14 +149,33 @@ 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<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 |
