From: Peter Penz Date: Fri, 22 Jun 2007 16:42:34 +0000 (+0000) Subject: Implement sorting by "tags". Same performance problems occur as when using sorting... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/743590a944bfce0d886a372a0e8a99e6a88593b3 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 --- 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 @@ -34,7 +35,8 @@ #include #include -#include +#include +#include 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 #include #include +#include #endif #include #include #include +#include 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(sourceModel()); + const KDirModel* dirModel = static_cast(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(index.model()); + KFileItem* item = dirModel->itemForIndex(index); + if (item != 0) { + const Nepomuk::Resource resource(item->url().url(), Nepomuk::NFO::File()); + const QList 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