From: Peter Penz Date: Tue, 31 Jan 2012 13:58:25 +0000 (+0100) Subject: Fix sorting issues X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/a8e61fa6ed620bf1230583343bef4a8448f844ba Fix sorting issues For some roles the sorting has not been implemented. BUG: 292941 FIXED-IN: 4.8.1 --- diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 163db8270..d64954698 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -1125,6 +1125,30 @@ KFileItemModel::Role KFileItemModel::roleIndex(const QByteArray& role) const return rolesHash.value(role, NoRole); } +QByteArray KFileItemModel::roleByteArray(Role role) const +{ + static const char* const roles[RolesCount] = { + 0, // NoRole + "name", + "size", + "date", + "permissions", + "owner", + "group", + "type", + "destination", + "path", + "comment", + "tags", + "rating", + "isDir", + "isExpanded", + "isExpandable", + "expansionLevel" + }; + return roles[role]; +} + QHash KFileItemModel::retrieveData(const KFileItem& item) const { // It is important to insert only roles that are fast to retrieve. E.g. @@ -1274,18 +1298,7 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const case NameRole: // The name role is handled as default fallback after the switch break; - - case DateRole: { - const KDateTime dateTimeA = itemA.time(KFileItem::ModificationTime); - const KDateTime dateTimeB = itemB.time(KFileItem::ModificationTime); - if (dateTimeA < dateTimeB) { - result = -1; - } else if (dateTimeA > dateTimeB) { - result = +1; - } - break; - } - + case SizeRole: { if (itemA.isDir()) { Q_ASSERT(itemB.isDir()); // see "if (m_sortFoldersFirst || m_sortRole == SizeRole)" above @@ -1307,29 +1320,36 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const break; } - case TypeRole: { - result = QString::compare(a->values.value("type").toString(), - b->values.value("type").toString()); + case DateRole: { + const KDateTime dateTimeA = itemA.time(KFileItem::ModificationTime); + const KDateTime dateTimeB = itemB.time(KFileItem::ModificationTime); + if (dateTimeA < dateTimeB) { + result = -1; + } else if (dateTimeA > dateTimeB) { + result = +1; + } break; } - - case CommentRole: { - result = QString::compare(a->values.value("comment").toString(), - b->values.value("comment").toString()); + + case RatingRole: { + result = a->values.value("rating").toInt() - b->values.value("rating").toInt(); break; } - + + case PermissionsRole: + case OwnerRole: + case GroupRole: + case TypeRole: + case DestinationRole: + case PathRole: + case CommentRole: case TagsRole: { - result = QString::compare(a->values.value("tags").toString(), - b->values.value("tags").toString()); + const QByteArray role = roleByteArray(m_sortRole); + result = QString::compare(a->values.value(role).toString(), + b->values.value(role).toString()); break; } - - case RatingRole: { - result = a->values.value("rating").toInt() - b->values.value("rating").toInt(); - break; - } - + default: break; } diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 6276dc229..ff816c85c 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -237,7 +237,17 @@ private: */ void resetRoles(); + /** + * @return Role-index for the given role byte-array. + * Runtime complexity is O(1). + */ Role roleIndex(const QByteArray& role) const; + + /** + * @return Role-byte-array for the given role-index. + * Runtime complexity is O(1). + */ + QByteArray roleByteArray(Role role) const; QHash retrieveData(const KFileItem& item) const;