]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodel.cpp
Implemented the possibility for sorting/grouping behaviors that are not tied to roles...
[dolphin.git] / src / kitemviews / kfileitemmodel.cpp
index 5620460591206d5e43fb5323da6721dffb67f322..a2e7c00758a868cea4db6334dacf8d1c0dce97a1 100644 (file)
@@ -34,7 +34,7 @@ Q_GLOBAL_STATIC(QRecursiveMutex, s_collatorMutex)
 // #define KFILEITEMMODEL_DEBUG
 
 KFileItemModel::KFileItemModel(QObject *parent)
-    : KItemModelBase("text", "text", parent)
+    : KItemModelBase("text", "none", parent)
     , m_dirLister(nullptr)
     , m_sortDirsFirst(true)
     , m_sortHiddenLast(false)
@@ -387,7 +387,14 @@ QList<QPair<int, QVariant>> KFileItemModel::groups() const
         QElapsedTimer timer;
         timer.start();
 #endif
-        switch (typeForRole(groupRole())) {
+        QByteArray role = groupRole();
+        if (typeForRole(role) == NoRole) {
+            // Handle extra grouping information
+            if (m_groupExtraInfo == "followSort") {
+                role = sortRole();
+            }
+        }
+        switch (typeForRole(role)) {
         case NoRole:
             m_groups.clear();
             break;
@@ -424,7 +431,7 @@ QList<QPair<int, QVariant>> KFileItemModel::groups() const
             m_groups = ratingRoleGroups();
             break;
         default:
-            m_groups = genericStringRoleGroups(groupRole());
+            m_groups = genericStringRoleGroups(role);
             break;
         }
 
@@ -949,6 +956,13 @@ void KFileItemModel::onSortRoleChanged(const QByteArray &current, const QByteArr
 {
     Q_UNUSED(previous)
     m_sortRole = typeForRole(current);
+    if (m_sortRole == NoRole) {
+        // Requested role not in list of roles. This could
+        // be used for indicating non-trivial sorting behavior
+        m_sortExtraInfo = current;
+    } else {
+        m_sortExtraInfo.clear();
+    }
 
     if (!m_requestRole[m_sortRole]) {
         QSet<QByteArray> newRoles = m_roles;
@@ -975,8 +989,15 @@ void KFileItemModel::onGroupRoleChanged(const QByteArray &current, const QByteAr
 {
     Q_UNUSED(previous)
     m_groupRole = typeForRole(current);
+    if (m_groupRole == NoRole) {
+        // Requested role not in list of roles. This could
+        // be used for indicating non-trivial grouping behavior
+        m_groupExtraInfo = current;
+    } else {
+        m_groupExtraInfo.clear();
+    }
 
-    if (!m_requestRole[m_sortRole]) {
+    if (!m_requestRole[m_groupRole]) {
         QSet<QByteArray> newRoles = m_roles;
         newRoles << current;
         setRoles(newRoles);
@@ -2293,7 +2314,8 @@ int KFileItemModel::groupRoleCompare(const ItemData *a, const ItemData *b, const
     int groupA, groupB;
     switch (m_groupRole) {
     case NoRole:
-        break;
+        // Non-trivial grouping behavior might be handled there in the future.
+        return 0;
     case NameRole:
         groupA = nameRoleGroup(a, false).comparable;
         groupB = nameRoleGroup(b, false).comparable;