diff options
| author | Peter Penz <[email protected]> | 2008-09-21 19:57:37 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2008-09-21 19:57:37 +0000 |
| commit | 4d886d083ca6cb2d635da2d29efb804b2680b6de (patch) | |
| tree | 7c82222c3d72f19a5a7272e379f1a81e19840ef7 /src/kfilepreviewgenerator.h | |
| parent | 711d1c0f0d3cde02cd431d145494b3ef68df4916 (diff) | |
renamed IconManager to KFilePreviewGenerator
svn path=/trunk/KDE/kdebase/apps/; revision=863324
Diffstat (limited to 'src/kfilepreviewgenerator.h')
| -rw-r--r-- | src/kfilepreviewgenerator.h | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/src/kfilepreviewgenerator.h b/src/kfilepreviewgenerator.h new file mode 100644 index 000000000..47aff66a7 --- /dev/null +++ b/src/kfilepreviewgenerator.h @@ -0,0 +1,210 @@ +/*************************************************************************** + * Copyright (C) 2008 by Peter Penz <[email protected]> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef KFILEPREVIEWGENERATOR_H +#define KFILEPREVIEWGENERATOR_H + +#include <kfileitem.h> +#include <kurl.h> + +#include <QList> +#include <QObject> +#include <QPixmap> + +class KDirModel; +class KDirSortFilterProxyModel; +class KJob; +class KMimeTypeResolver; +class QAbstractItemView; + +/** + * @brief Manages the icon state of a directory model. + * + * 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 KFilePreviewGenerator : public QObject +{ + Q_OBJECT + +public: + KFilePreviewGenerator(QAbstractItemView* parent, KDirSortFilterProxyModel* model); + virtual ~KFilePreviewGenerator(); + 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: + /** + * Generates previews for the items \a items asynchronously. + */ + void generatePreviews(const KFileItemList& items); + + /** + * 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 addToPreviewQueue(const KFileItem& item, const QPixmap& pixmap); + + /** + * Is invoked when the preview job has been finished and + * 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 KFilePreviewGenerator::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: + /** + * Returns true, if the item \a item has been cut into + * the clipboard. + */ + bool isCutItem(const KFileItem& item) const; + + /** Applies an item effect to all cut items. */ + void applyCutItemEffect(); + + /** + * 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); + + /** + * 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 killPreviewJobs(); + + /** + * Orders the items \a items in a way that the visible items + * are moved to the front of the list. When passing this + * list to a preview job, the visible items will get generated + * first. + */ + void orderItems(KFileItemList& items); + +private: + /** 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; + + /** + * True if a selection has been done which should cut items. + */ + bool m_hasCutSelection; + + int m_pendingVisiblePreviews; + + QAbstractItemView* m_view; + QTimer* m_previewTimer; + QTimer* m_scrollAreaTimer; + QList<KJob*> m_previewJobs; + KDirModel* m_dirModel; + KDirSortFilterProxyModel* m_proxyModel; + + KMimeTypeResolver* m_mimeTypeResolver; + + QList<ItemInfo> m_cutItemsCache; + QList<ItemInfo> m_previews; + + /** + * Contains all items where a preview must be generated, but + * where the preview job has not dispatched the items yet. + */ + KFileItemList m_pendingItems; + + /** + * Contains all items, where a preview has already been + * generated by the preview jobs. + */ + KFileItemList m_dispatchedItems; +}; + +inline bool KFilePreviewGenerator::showPreview() const +{ + return m_showPreview; +} + +#endif |
