1
0
mirror of https://invent.kde.org/system/dolphin synced 2024-07-02 16:31:23 +00:00

"Group by - Type" now respects "Folders first" setting. Minor code cleanup

This commit is contained in:
Zakhar Afonin 2024-06-17 13:04:16 +03:00
parent 8d30497f71
commit 6f6f080bb8
2 changed files with 85 additions and 83 deletions

View File

@ -2340,104 +2340,99 @@ int KFileItemModel::groupRoleCompare(const ItemData *a, const ItemData *b, const
// Unlike sortRoleCompare, this function can and often will return 0. // Unlike sortRoleCompare, this function can and often will return 0.
int result = 0; int result = 0;
int groupA, groupB; ItemGroupInfo groupA, groupB;
switch (m_groupRole) { switch (m_groupRole) {
case NoRole: case NoRole:
// Non-trivial grouping behavior might be handled there in the future. // Non-trivial grouping behavior might be handled there in the future.
return 0; return 0;
case NameRole: case NameRole:
groupA = nameRoleGroup(a, false).comparable; groupA = nameRoleGroup(a, false);
groupB = nameRoleGroup(b, false).comparable; groupB = nameRoleGroup(b, false);
break; break;
case SizeRole: case SizeRole:
groupA = sizeRoleGroup(a, false).comparable; groupA = sizeRoleGroup(a, false);
groupB = sizeRoleGroup(b, false).comparable; groupB = sizeRoleGroup(b, false);
break; break;
case ModificationTimeRole: case ModificationTimeRole:
groupA = timeRoleGroup( groupA = timeRoleGroup(
[](const ItemData *item) { [](const ItemData *item) {
return item->item.time(KFileItem::ModificationTime); return item->item.time(KFileItem::ModificationTime);
}, },
a, a,
false) false);
.comparable;
groupB = timeRoleGroup( groupB = timeRoleGroup(
[](const ItemData *item) { [](const ItemData *item) {
return item->item.time(KFileItem::ModificationTime); return item->item.time(KFileItem::ModificationTime);
}, },
b, b,
false) false);
.comparable;
break; break;
case CreationTimeRole: case CreationTimeRole:
groupA = timeRoleGroup( groupA = timeRoleGroup(
[](const ItemData *item) { [](const ItemData *item) {
return item->item.time(KFileItem::CreationTime); return item->item.time(KFileItem::CreationTime);
}, },
a, a,
false) false);
.comparable;
groupB = timeRoleGroup( groupB = timeRoleGroup(
[](const ItemData *item) { [](const ItemData *item) {
return item->item.time(KFileItem::CreationTime); return item->item.time(KFileItem::CreationTime);
}, },
b, b,
false) false);
.comparable;
break; break;
case AccessTimeRole: case AccessTimeRole:
groupA = timeRoleGroup( groupA = timeRoleGroup(
[](const ItemData *item) { [](const ItemData *item) {
return item->item.time(KFileItem::AccessTime); return item->item.time(KFileItem::AccessTime);
}, },
a, a,
false) false);
.comparable;
groupB = timeRoleGroup( groupB = timeRoleGroup(
[](const ItemData *item) { [](const ItemData *item) {
return item->item.time(KFileItem::AccessTime); return item->item.time(KFileItem::AccessTime);
}, },
b, b,
false) false);
.comparable;
break; break;
case DeletionTimeRole: case DeletionTimeRole:
groupA = timeRoleGroup( groupA = timeRoleGroup(
[](const ItemData *item) { [](const ItemData *item) {
return item->values.value("deletiontime").toDateTime(); return item->values.value("deletiontime").toDateTime();
}, },
a, a,
false) false);
.comparable;
groupB = timeRoleGroup( groupB = timeRoleGroup(
[](const ItemData *item) { [](const ItemData *item) {
return item->values.value("deletiontime").toDateTime(); return item->values.value("deletiontime").toDateTime();
}, },
b, b,
false) false);
.comparable;
break; break;
case PermissionsRole: case PermissionsRole:
groupA = permissionRoleGroup(a, false).comparable; groupA = permissionRoleGroup(a, false);
groupB = permissionRoleGroup(b, false).comparable; groupB = permissionRoleGroup(b, false);
break; break;
case RatingRole: case RatingRole:
groupA = ratingRoleGroup(a, false).comparable; groupA = ratingRoleGroup(a, false);
groupB = ratingRoleGroup(b, false).comparable; groupB = ratingRoleGroup(b, false);
break;
case TypeRole:
groupA = typeRoleGroup(a);
groupB = typeRoleGroup(b);
break; break;
default: { default: {
QString strGroupA = genericStringRoleGroup(groupRole(), a); groupA = genericStringRoleGroup(groupRole(), a);
QString strGroupB = genericStringRoleGroup(groupRole(), b); groupB = genericStringRoleGroup(groupRole(), b);
result = stringCompare(strGroupA, strGroupB, collator);
break; break;
} }
} }
if (result == 0) { if (groupA.comparable < groupB.comparable) {
if (groupA < groupB) { result = -1;
result = -1; } else if (groupA.comparable > groupB.comparable) {
} else if (groupA > groupB) { result = 1;
result = 1; } else {
} result = stringCompare(groupA.text, groupB.text, collator);
} }
return result; return result;
} }
@ -2866,9 +2861,9 @@ KFileItemModel::ItemGroupInfo KFileItemModel::ratingRoleGroup(const ItemData *it
return groupInfo; return groupInfo;
} }
QString KFileItemModel::genericStringRoleGroup(const QByteArray &role, const ItemData *itemData) const KFileItemModel::ItemGroupInfo KFileItemModel::genericStringRoleGroup(const QByteArray &role, const ItemData *itemData) const
{ {
return itemData->values.value(role).toString(); return {0, itemData->values.value(role).toString()};
} }
QList<QPair<int, QVariant>> KFileItemModel::nameRoleGroups() const QList<QPair<int, QVariant>> KFileItemModel::nameRoleGroups() const
@ -2917,6 +2912,20 @@ QList<QPair<int, QVariant>> KFileItemModel::sizeRoleGroups() const
return groups; return groups;
} }
KFileItemModel::ItemGroupInfo KFileItemModel::typeRoleGroup(const ItemData *itemData) const
{
int priority = 0;
if (itemData->item.isDir() && m_sortDirsFirst) {
// Ensure folders stay first regardless of grouping order
if (groupOrder() == Qt::AscendingOrder) {
priority = -1;
} else {
priority = 1;
}
}
return {priority, itemData->values.value("type").toString()};
}
QList<QPair<int, QVariant>> KFileItemModel::timeRoleGroups(const std::function<QDateTime(const ItemData *)> &fileTimeCb) const QList<QPair<int, QVariant>> KFileItemModel::timeRoleGroups(const std::function<QDateTime(const ItemData *)> &fileTimeCb) const
{ {
Q_ASSERT(!m_itemData.isEmpty()); Q_ASSERT(!m_itemData.isEmpty());
@ -2995,17 +3004,17 @@ QList<QPair<int, QVariant>> KFileItemModel::genericStringRoleGroups(const QByteA
const int maxIndex = count() - 1; const int maxIndex = count() - 1;
QList<QPair<int, QVariant>> groups; QList<QPair<int, QVariant>> groups;
QString groupText; ItemGroupInfo groupInfo;
for (int i = 0; i <= maxIndex; ++i) { for (int i = 0; i <= maxIndex; ++i) {
if (isChildItem(i)) { if (isChildItem(i)) {
continue; continue;
} }
QString newGroupText = genericStringRoleGroup(role, m_itemData.at(i)); ItemGroupInfo newGroupInfo = genericStringRoleGroup(role, m_itemData.at(i));
if (newGroupText != groupText) { if (newGroupInfo != groupInfo) {
groupText = newGroupText; groupInfo = newGroupInfo;
groups.append(QPair<int, QVariant>(i, newGroupText)); groups.append(QPair<int, QVariant>(i, newGroupInfo.text));
} }
} }
return groups; return groups;

View File

@ -477,13 +477,15 @@ private:
ItemGroupInfo timeRoleGroup(const std::function<QDateTime(const ItemData *)> &fileTimeCb, const ItemData *itemData, bool withString = true) const; ItemGroupInfo timeRoleGroup(const std::function<QDateTime(const ItemData *)> &fileTimeCb, const ItemData *itemData, bool withString = true) const;
ItemGroupInfo permissionRoleGroup(const ItemData *itemData, bool withString = true) const; ItemGroupInfo permissionRoleGroup(const ItemData *itemData, bool withString = true) const;
ItemGroupInfo ratingRoleGroup(const ItemData *itemData, bool withString = true) const; ItemGroupInfo ratingRoleGroup(const ItemData *itemData, bool withString = true) const;
QString genericStringRoleGroup(const QByteArray &role, const ItemData *itemData) const; ItemGroupInfo typeRoleGroup(const ItemData *itemData) const;
ItemGroupInfo genericStringRoleGroup(const QByteArray &role, const ItemData *itemData) const;
QList<QPair<int, QVariant>> nameRoleGroups() const; QList<QPair<int, QVariant>> nameRoleGroups() const;
QList<QPair<int, QVariant>> sizeRoleGroups() const; QList<QPair<int, QVariant>> sizeRoleGroups() const;
QList<QPair<int, QVariant>> timeRoleGroups(const std::function<QDateTime(const ItemData *)> &fileTimeCb) const; QList<QPair<int, QVariant>> timeRoleGroups(const std::function<QDateTime(const ItemData *)> &fileTimeCb) const;
QList<QPair<int, QVariant>> permissionRoleGroups() const; QList<QPair<int, QVariant>> permissionRoleGroups() const;
QList<QPair<int, QVariant>> ratingRoleGroups() const; QList<QPair<int, QVariant>> ratingRoleGroups() const;
QList<QPair<int, QVariant>> typeRoleGroups() const;
QList<QPair<int, QVariant>> genericStringRoleGroups(const QByteArray &typeForRole) const; QList<QPair<int, QVariant>> genericStringRoleGroups(const QByteArray &typeForRole) const;
/** /**
@ -646,13 +648,4 @@ inline bool KFileItemModel::ItemGroupInfo::operator!=(const ItemGroupInfo &other
return comparable != other.comparable || text != other.text; return comparable != other.comparable || text != other.text;
} }
inline bool KFileItemModel::ItemGroupInfo::operator<(const ItemGroupInfo &other) const
{
if (comparable == other.comparable) {
return text < other.text;
} else {
return comparable < other.comparable;
}
}
#endif #endif