diff --git a/src/dolphinpart.rc b/src/dolphinpart.rc index d13f4aaed7..13f0f2172b 100644 --- a/src/dolphinpart.rc +++ b/src/dolphinpart.rc @@ -23,6 +23,7 @@
> KFileItemModel::ratingRoleGroups() const if (isChildItem(i)) { continue; } + const int newGroupValue = m_itemData.at(i)->values.value("rating", 0).toInt(); if (newGroupValue != groupValue) { groupValue = newGroupValue; @@ -2764,7 +2948,8 @@ QList> KFileItemModel::genericStringRoleGroups(const QByteA if (isChildItem(i)) { continue; } - const QString newGroupValue = m_itemData.at(i)->values.value(role).toString(); + + const QString newGroupValue = getGenericStringRoleGroup(role, m_itemData.at(i)); if (newGroupValue != groupValue || isFirstGroupValue) { groupValue = newGroupValue; groups.append(QPair(i, newGroupValue)); diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 6cbfab6037..725ba71bdb 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -454,8 +454,22 @@ private: */ int sortRoleCompare(const ItemData *a, const ItemData *b, const QCollator &collator) const; + /** + * Helper method for lessThan() and expandedParentsCountCompare(): Compares + * the passed item-data using m_groupRole as criteria. Both items must + * have the same parent item, otherwise the comparison will be wrong. + */ + int groupRoleCompare(const ItemData *a, const ItemData *b, const QCollator &collator) const; + int stringCompare(const QString &a, const QString &b, const QCollator &collator) const; + QVariant getNameRoleGroup(const ItemData *itemData, bool asString = true) const; + QVariant getSizeRoleGroup(const ItemData *itemData, bool asString = true) const; + QVariant getTimeRoleGroup(const std::function &fileTimeCb, const ItemData *itemData, bool asString = true) const; + QVariant getPermissionRoleGroup(const ItemData *itemData, bool asString = true) const; + QVariant getRatingRoleGroup(const ItemData *itemData, bool asString = true) const; + QString getGenericStringRoleGroup(const QByteArray &role, const ItemData *itemData) const; + QList> nameRoleGroups() const; QList> sizeRoleGroups() const; QList> timeRoleGroups(const std::function &fileTimeCb) const; diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index 7a3c758a57..7454ed0b94 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -278,17 +278,17 @@ void DolphinViewActionHandler::createActions(SelectionMode::ActionTextHelper *ac sortByActionMenu->addSeparator(); - QActionGroup *group = new QActionGroup(sortByActionMenu); - group->setExclusive(true); + QActionGroup *groupForSort = new QActionGroup(sortByActionMenu); + groupForSort->setExclusive(true); KToggleAction *sortAscendingAction = m_actionCollection->add(QStringLiteral("sort_ascending")); - sortAscendingAction->setActionGroup(group); + sortAscendingAction->setActionGroup(groupForSort); connect(sortAscendingAction, &QAction::triggered, this, [this] { m_currentView->setSortOrder(Qt::AscendingOrder); }); KToggleAction *sortDescendingAction = m_actionCollection->add(QStringLiteral("sort_descending")); - sortDescendingAction->setActionGroup(group); + sortDescendingAction->setActionGroup(groupForSort); connect(sortDescendingAction, &QAction::triggered, this, [this] { m_currentView->setSortOrder(Qt::DescendingOrder); }); @@ -314,14 +314,17 @@ void DolphinViewActionHandler::createActions(SelectionMode::ActionTextHelper *ac groupByActionMenu->addSeparator(); + QActionGroup *groupForGroup = new QActionGroup(groupByActionMenu); + groupForGroup->setExclusive(true); + KToggleAction *groupAscendingAction = m_actionCollection->add(QStringLiteral("group_ascending")); - groupAscendingAction->setActionGroup(group); + groupAscendingAction->setActionGroup(groupForGroup); connect(groupAscendingAction, &QAction::triggered, this, [this] { m_currentView->setGroupOrder(Qt::AscendingOrder); }); KToggleAction *groupDescendingAction = m_actionCollection->add(QStringLiteral("group_descending")); - groupDescendingAction->setActionGroup(group); + groupDescendingAction->setActionGroup(groupForGroup); connect(groupDescendingAction, &QAction::triggered, this, [this] { m_currentView->setGroupOrder(Qt::DescendingOrder); }); @@ -605,9 +608,9 @@ void DolphinViewActionHandler::slotGroupOrderChanged(Qt::SortOrder order) { QAction *descending = m_actionCollection->action(QStringLiteral("group_descending")); QAction *ascending = m_actionCollection->action(QStringLiteral("group_ascending")); - const bool sortDescending = (order == Qt::DescendingOrder); - descending->setChecked(sortDescending); - ascending->setChecked(!sortDescending); + const bool groupDescending = (order == Qt::DescendingOrder); + descending->setChecked(groupDescending); + ascending->setChecked(!groupDescending); } void DolphinViewActionHandler::slotSortFoldersFirstChanged(bool foldersFirst) @@ -836,7 +839,7 @@ void DolphinViewActionHandler::slotGroupTriggered(QAction *action) // actions and the sub-menu-actions. If an action gets checked, it must // be assured that all other actions get unchecked, except the ascending/ // descending actions - for (QAction *groupAction : std::as_const(m_sortByActions)) { + for (QAction *groupAction : std::as_const(m_groupByActions)) { KActionMenu *actionMenu = qobject_cast(groupAction); if (actionMenu) { const auto actions = actionMenu->menu()->actions();