┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2007-06-22 16:42:34 +0000
committerPeter Penz <[email protected]>2007-06-22 16:42:34 +0000
commit743590a944bfce0d886a372a0e8a99e6a88593b3 (patch)
tree36c1d6b6c96e848be3de72b55249538bbf94e0ed
parentb22d9b7b9c72749ec245ff55d8d90989428067fc (diff)
Implement sorting by "tags". Same performance problems occur as when using sorting by "rating", but we must get a feeling first how we use the Nepomuk API before thinking about caching...
svn path=/trunk/KDE/kdebase/apps/; revision=678957
-rw-r--r--src/dolphinitemcategorizer.cpp22
-rw-r--r--src/dolphinsortfilterproxymodel.cpp45
-rw-r--r--src/dolphinsortfilterproxymodel.h10
3 files changed, 64 insertions, 13 deletions
diff --git a/src/dolphinitemcategorizer.cpp b/src/dolphinitemcategorizer.cpp
index a6d329f6d..c83f9383f 100644
--- a/src/dolphinitemcategorizer.cpp
+++ b/src/dolphinitemcategorizer.cpp
@@ -21,6 +21,7 @@
#include "dolphinitemcategorizer.h"
#include "dolphinview.h"
+#include "dolphinsortfilterproxymodel.h"
#ifdef HAVE_NEPOMUK
#include <config-nepomuk.h>
@@ -34,7 +35,8 @@
#include <klocale.h>
#include <kurl.h>
-#include <QtGui/QSortFilterProxyModel>
+#include <QList>
+#include <QSortFilterProxyModel>
DolphinItemCategorizer::DolphinItemCategorizer() :
KItemCategorizer()
@@ -164,19 +166,19 @@ QString DolphinItemCategorizer::categoryForItem(const QModelIndex& index,
#ifdef HAVE_NEPOMUK
case DolphinView::SortByRating: {
- KFileItem* item = dirModel->itemForIndex(index);
- if (item != 0) {
- const Nepomuk::Resource resource(item->url().url(), Nepomuk::NFO::File());
- const quint32 rating = resource.rating();
- if (!rating)
- retString = i18n("Not yet rated");
- else
- retString = i18np("1 star", "%1 stars", rating);
+ const quint32 rating = DolphinSortFilterProxyModel::ratingForIndex(index);
+ if (rating) {
+ retString = i18np("1 star", "%1 stars", rating);
+ } else {
+ retString = i18n("Not yet rated");
}
break;
}
- case DolphinView::SortByTags:
+
+ case DolphinView::SortByTags: {
+ retString = DolphinSortFilterProxyModel::tagsForIndex(index);
break;
+ }
#endif
}
diff --git a/src/dolphinsortfilterproxymodel.cpp b/src/dolphinsortfilterproxymodel.cpp
index 648b6133b..e30a73d50 100644
--- a/src/dolphinsortfilterproxymodel.cpp
+++ b/src/dolphinsortfilterproxymodel.cpp
@@ -26,11 +26,13 @@
#include <config-nepomuk.h>
#include <nepomuk/global.h>
#include <nepomuk/resource.h>
+#include <nepomuk/tag.h>
#endif
#include <kdirmodel.h>
#include <kfileitem.h>
#include <kdatetime.h>
+#include <klocale.h>
static DolphinView::Sorting sortingTypeTable[] =
{
@@ -173,6 +175,9 @@ bool DolphinSortFilterProxyModel::lessThanGeneralPurpose(const QModelIndex &left
const quint32 rightRating = ratingForIndex(right);
return leftRating > rightRating;
}
+ case DolphinView::SortByTags: {
+ return naturalCompare(tagsForIndex(left), tagsForIndex(right)) < 0;
+ }
#endif
default:
break;
@@ -331,6 +336,10 @@ bool DolphinSortFilterProxyModel::lessThan(const QModelIndex& left,
return leftRating > rightRating;
}
+
+ case DolphinView::SortByTags: {
+ return naturalCompare(tagsForIndex(left), tagsForIndex(right)) < 0;
+ }
#endif
}
@@ -339,12 +348,12 @@ bool DolphinSortFilterProxyModel::lessThan(const QModelIndex& left,
return QSortFilterProxyModel::lessThan(left, right);
}
-quint32 DolphinSortFilterProxyModel::ratingForIndex(const QModelIndex& index) const
+quint32 DolphinSortFilterProxyModel::ratingForIndex(const QModelIndex& index)
{
#ifdef HAVE_NEPOMUK
quint32 rating = 0;
- const KDirModel* dirModel = static_cast<const KDirModel*>(sourceModel());
+ const KDirModel* dirModel = static_cast<const KDirModel*>(index.model());
KFileItem* item = dirModel->itemForIndex(index);
if (item != 0) {
const Nepomuk::Resource resource(item->url().url(), Nepomuk::NFO::File());
@@ -357,6 +366,38 @@ quint32 DolphinSortFilterProxyModel::ratingForIndex(const QModelIndex& index) co
#endif
}
+QString DolphinSortFilterProxyModel::tagsForIndex(const QModelIndex& index)
+{
+#ifdef HAVE_NEPOMUK
+ QString tagsString;
+
+ const KDirModel* dirModel = static_cast<const KDirModel*>(index.model());
+ KFileItem* item = dirModel->itemForIndex(index);
+ if (item != 0) {
+ const Nepomuk::Resource resource(item->url().url(), Nepomuk::NFO::File());
+ const QList<Nepomuk::Tag> tags = resource.tags();
+ QStringList stringList;
+ foreach (const Nepomuk::Tag& tag, tags) {
+ stringList.append(tag.label());
+ }
+ stringList.sort();
+
+ foreach (const QString& str, stringList) {
+ tagsString += str;
+ tagsString += ' ';
+ }
+ }
+
+ if (tagsString.isEmpty()) {
+ tagsString = i18n("(no tags)");
+ }
+
+ return tagsString;
+#else
+ return QString();
+#endif
+}
+
int DolphinSortFilterProxyModel::naturalCompare(const QString& a,
const QString& b)
{
diff --git a/src/dolphinsortfilterproxymodel.h b/src/dolphinsortfilterproxymodel.h
index 5bf4bc146..56ee77dba 100644
--- a/src/dolphinsortfilterproxymodel.h
+++ b/src/dolphinsortfilterproxymodel.h
@@ -87,13 +87,21 @@ private:
* Returns the rating for the item with the index \a index. 0 is
* returned if no item could be found.
*/
- quint32 ratingForIndex(const QModelIndex& index) const;
+ static quint32 ratingForIndex(const QModelIndex& index);
+
+ /**
+ * Returns the tags for the item with the index \a index. If no
+ * tag is applied, a predefined string will be returned.
+ */
+ static QString tagsForIndex(const QModelIndex& index);
static int naturalCompare(const QString& a, const QString& b);
private:
DolphinView::Sorting m_sorting;
Qt::SortOrder m_sortOrder;
+
+ friend class DolphinItemCategorizer;
};
DolphinView::Sorting DolphinSortFilterProxyModel::sorting() const