┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/iconmanager.h
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2008-06-01 22:15:13 +0000
committerPeter Penz <[email protected]>2008-06-01 22:15:13 +0000
commit32298bba66fe57a6a42a1b92ae9aec002a637483 (patch)
tree5067f55644c0b6159775fc2ebf4efcc6b4dded4b /src/iconmanager.h
parent70d1cb86e0e7f2ab3981b2d2e91eacb65844512d (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.h56
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