From: Zakhar Afonin Date: Sun, 16 Jun 2024 15:49:09 +0000 (+0300) Subject: Implemented the possibility for sorting/grouping behaviors that are not tied to roles... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/91273c8b03dbf184d7a9043d4f5ffe5b45c87b71 Implemented the possibility for sorting/grouping behaviors that are not tied to roles. Reintroducedd the original grouping as one of grouping options. --- diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 562046059..a2e7c0075 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -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> 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> 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 ¤t, 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 newRoles = m_roles; @@ -975,8 +989,15 @@ void KFileItemModel::onGroupRoleChanged(const QByteArray ¤t, 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 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; diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 9001e7bd5..ea72a48a4 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -575,6 +575,9 @@ private: RoleType m_sortRole; RoleType m_groupRole; + QByteArray m_sortExtraInfo; + QByteArray m_groupExtraInfo; + int m_sortingProgressPercent; // Value of directorySortingProgress() signal QSet m_roles; diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index afc392810..52cd49bfb 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -2185,7 +2185,7 @@ void KItemListView::updateGroupHeaderForWidget(KItemListWidget *widget) const int groupIndex = groupIndexForItem(index); Q_ASSERT(groupIndex >= 0); groupHeader->setData(groups.at(groupIndex).second); - groupHeader->setRole(model()->sortRole()); + groupHeader->setRole(model()->groupRole()); groupHeader->setStyleOption(m_styleOption); groupHeader->setScrollOrientation(scrollOrientation()); groupHeader->setItemIndex(index); diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index 7454ed0b9..c215f1bf7 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -302,6 +302,18 @@ void DolphinViewActionHandler::createActions(SelectionMode::ActionTextHelper *ac // View -> Group By QActionGroup *groupByActionGroup = createFileItemRolesActionGroup(QStringLiteral("group_by_")); + KToggleAction *groupAsNone = m_actionCollection->add(QStringLiteral("group_none")); + groupAsNone->setData("none"); + groupAsNone->setActionGroup(groupByActionGroup); + groupAsNone->setText(i18nc("@label", "No grouping")); + m_groupByActions.insert("none", groupAsNone); + + KToggleAction *groupAsFollowSort = m_actionCollection->add(QStringLiteral("group_followSort")); + groupAsFollowSort->setData("followSort"); + groupAsFollowSort->setActionGroup(groupByActionGroup); + groupAsFollowSort->setText(i18nc("@label", "Follow sorting")); + m_groupByActions.insert("followSort", groupAsFollowSort); + KActionMenu *groupByActionMenu = m_actionCollection->add(QStringLiteral("group")); groupByActionMenu->setIcon(QIcon::fromTheme(QStringLiteral("view-group"))); groupByActionMenu->setText(i18nc("@action:inmenu View", "Group By")); @@ -404,9 +416,6 @@ QActionGroup *DolphinViewActionHandler::createFileItemRolesActionGroup(const QSt #endif QList rolesInfo = KFileItemModel::rolesInformation(); - // Unlike sorting, grouping is optional. If creating for group_by_, include a None role. - if (isGroupGroup) - rolesInfo.append(KFileItemModel::roleInformation(nullptr)); for (const KFileItemModel::RoleInfo &info : rolesInfo) { if (!isSortGroup && !isGroupGroup && info.role == "text") { diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index ea89dc4f5..c5afe663d 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -410,6 +410,8 @@ void ViewProperties::setDirProperties(const ViewProperties &props) setGroupedSorting(props.groupedSorting()); setSortRole(props.sortRole()); setSortOrder(props.sortOrder()); + setGroupRole(props.groupRole()); + setGroupOrder(props.groupOrder()); setSortFoldersFirst(props.sortFoldersFirst()); setSortHiddenLast(props.sortHiddenLast()); setVisibleRoles(props.visibleRoles());