#ifndef KFILEITEMMODELROLESUPDATER_H
#define KFILEITEMMODELROLESUPDATER_H
-#include <libdolphin_export.h>
+#include <config-nepomuk.h>
#include <KFileItem>
#include <kitemviews/kitemmodelbase.h>
+#include <libdolphin_export.h>
+
#include <QObject>
#include <QSet>
#include <QSize>
#include <QStringList>
+class KDirWatch;
class KFileItemModel;
class KJob;
class QPixmap;
class QTimer;
+#ifdef HAVE_NEPOMUK
+ namespace Nepomuk2
+ {
+ class ResourceWatcher;
+ class Resource;
+ }
+#else
+ // Required for the slot applyChangedNepomukRoles() that
+ // cannot be ifdefined due to moc.
+ namespace Nepomuk2
+ {
+ class Resource;
+ }
+#endif
+
/**
* @brief Resolves expensive roles asynchronously and applies them to the KFileItemModel.
*
* of the file. If \a show is false the MIME type icon will be used for the "iconPixmap"
* role.
*/
- void setPreviewShown(bool show);
- bool isPreviewShown() const;
+ void setPreviewsShown(bool show);
+ bool previewsShown() const;
+
+ /**
+ * If enabled a small preview gets upscaled to the icon size in case where
+ * the icon size is larger than the preview. Per default enlarging is
+ * enabled.
+ */
+ void setEnlargeSmallPreviews(bool enlarge);
+ bool enlargeSmallPreviews() const;
/**
* If \a paused is set to true the asynchronous resolving of roles will be paused.
QSet<QByteArray> roles() const;
/**
- * Sets the list of enabled thumbnail plugins.
+ * Sets the list of enabled thumbnail plugins that are used for previews.
* Per default all plugins enabled in the KConfigGroup "PreviewSettings"
* are used.
*
- * Note that this method doesn't cause already generated previews
- * to be regenerated.
- *
* For a list of available plugins, call KServiceTypeTrader::self()->query("ThumbCreator").
*
* @see enabledPlugins
void slotItemsRemoved(const KItemRangeList& itemRanges);
void slotItemsChanged(const KItemRangeList& itemRanges,
const QSet<QByteArray>& roles);
+ void slotSortRoleChanged(const QByteArray& current,
+ const QByteArray& previous);
+ /**
+ * Is invoked after a preview has been received successfully.
+ * @see startPreviewJob()
+ */
void slotGotPreview(const KFileItem& item, const QPixmap& pixmap);
+
+ /**
+ * Is invoked after generating a preview has failed.
+ * @see startPreviewJob()
+ */
void slotPreviewFailed(const KFileItem& item);
/**
* Is invoked when the preview job has been finished and
* removes the job from the m_previewJobs list.
+ * @see startPreviewJob()
*/
void slotPreviewJobFinished(KJob* job);
- void resolvePendingRoles();
void resolveNextPendingRoles();
+ /**
+ * Resolves items that have not been resolved yet after the change has been
+ * notified by slotItemsChanged(). Is invoked if the m_changedItemsTimer
+ * exceeds.
+ */
+ void resolveChangedItems();
+
+ void applyChangedNepomukRoles(const Nepomuk2::Resource& resource);
+
+ /**
+ * Is invoked if a directory watched by KDirWatch got dirty. Updates
+ * the "isExpandable"- and "size"-roles of the item that matches to
+ * the given path.
+ */
+ void slotDirWatchDirty(const QString& path);
+
private:
+ /**
+ * Updates the roles for the given item ranges. The roles for the currently
+ * visible items will get updated first.
+ */
+ void startUpdating(const KItemRangeList& itemRanges);
+
+ /**
+ * Creates previews for the items starting from the first item of the
+ * given list.
+ * @see slotGotPreview()
+ * @see slotPreviewFailed()
+ * @see slotPreviewJobFinished()
+ */
void startPreviewJob(const KFileItemList& items);
bool hasPendingRoles() const;
+ void resolvePendingRoles();
void resetPendingRoles();
- void triggerPendingRolesResolving(int count);
void sortAndResolveAllRoles();
void sortAndResolvePendingRoles();
+ void applySortProgressToModel();
+
+ /**
+ * Updates m_sortProgress to be 0 if the sort-role
+ * needs to get resolved asynchronously and hence a
+ * progress is required. Otherwise m_sortProgress
+ * will be set to -1 which means that no progress
+ * will be provided.
+ */
+ void updateSortProgress();
+
+ /**
+ * @return True, if at least one item from the model
+ * has an unknown MIME-type.
+ */
+ bool hasUnknownMimeTypes() const;
enum ResolveHint {
ResolveFast,
KFileItemList sortedItems(const QSet<KFileItem>& items) const;
- static int subDirectoriesCount(const QString& path);
+ /**
+ * @return The number of items of the path \a path.
+ */
+ int subItemsCount(const QString& path) const;
+
+ /**
+ * Must be invoked if a property has been changed that affects
+ * the look of the preview. Takes care to update all previews.
+ */
+ void updateAllPreviews();
private:
// Property for setPaused()/isPaused().
bool m_iconSizeChangedDuringPausing;
bool m_rolesChangedDuringPausing;
- // Property for setPreviewShown()/previewShown().
+ // Property for setPreviewsShown()/previewsShown().
bool m_previewShown;
+ // Property for setEnlargeSmallPreviews()/enlargeSmallPreviews()
+ bool m_enlargeSmallPreviews;
+
// True if the role "iconPixmap" should be cleared when resolving the next
// role with resolveRole(). Is necessary if the preview gets disabled
// during the roles-updater has been paused by setPaused().
bool m_clearPreviews;
+ int m_sortingProgress;
+
KFileItemModel* m_model;
QSize m_iconSize;
int m_firstVisibleIndex;
int m_lastVisibleIndex;
QSet<QByteArray> m_roles;
+ QSet<QByteArray> m_resolvableRoles;
QStringList m_enabledPlugins;
QSet<KFileItem> m_pendingVisibleItems;
QSet<KFileItem> m_pendingInvisibleItems;
QList<KJob*> m_previewJobs;
- QTimer* m_resolvePendingRolesTimer;
+ // When downloading or copying large files, the slot slotItemsChanged()
+ // will be called periodically within a quite short delay. To prevent
+ // a high CPU-load by generating e.g. previews for each notification, the update
+ // will be postponed until no file change has been done within a longer period
+ // of time.
+ QTimer* m_changedItemsTimer;
+ QSet<KFileItem> m_changedItems;
+
+ KDirWatch* m_dirWatcher;
+ mutable QSet<QString> m_watchedDirs; // Required as sadly KDirWatch does not offer a getter method
+ // to get all watched directories.
+#ifdef HAVE_NEPOMUK
+ Nepomuk2::ResourceWatcher* m_nepomukResourceWatcher;
+ mutable QHash<QUrl, KUrl> m_nepomukUriItems;
+#endif
};
#endif