1
0
mirror of https://invent.kde.org/system/dolphin synced 2024-06-30 23:46:46 +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.
int result = 0;
int groupA, groupB;
ItemGroupInfo groupA, groupB;
switch (m_groupRole) {
case NoRole:
// 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;
groupA = nameRoleGroup(a, false);
groupB = nameRoleGroup(b, false);
break;
case SizeRole:
groupA = sizeRoleGroup(a, false).comparable;
groupB = sizeRoleGroup(b, false).comparable;
groupA = sizeRoleGroup(a, false);
groupB = sizeRoleGroup(b, false);
break;
case ModificationTimeRole:
groupA = timeRoleGroup(
[](const ItemData *item) {
return item->item.time(KFileItem::ModificationTime);
},
a,
false)
.comparable;
[](const ItemData *item) {
return item->item.time(KFileItem::ModificationTime);
},
a,
false);
groupB = timeRoleGroup(
[](const ItemData *item) {
return item->item.time(KFileItem::ModificationTime);
},
b,
false)
.comparable;
[](const ItemData *item) {
return item->item.time(KFileItem::ModificationTime);
},
b,
false);
break;
case CreationTimeRole:
groupA = timeRoleGroup(
[](const ItemData *item) {
return item->item.time(KFileItem::CreationTime);
},
a,
false)
.comparable;
[](const ItemData *item) {
return item->item.time(KFileItem::CreationTime);
},
a,
false);
groupB = timeRoleGroup(
[](const ItemData *item) {
return item->item.time(KFileItem::CreationTime);
},
b,
false)
.comparable;
[](const ItemData *item) {
return item->item.time(KFileItem::CreationTime);
},
b,
false);
break;
case AccessTimeRole:
groupA = timeRoleGroup(
[](const ItemData *item) {
return item->item.time(KFileItem::AccessTime);
},
a,
false)
.comparable;
[](const ItemData *item) {
return item->item.time(KFileItem::AccessTime);
},
a,
false);
groupB = timeRoleGroup(
[](const ItemData *item) {
return item->item.time(KFileItem::AccessTime);
},
b,
false)
.comparable;
[](const ItemData *item) {
return item->item.time(KFileItem::AccessTime);
},
b,
false);
break;
case DeletionTimeRole:
groupA = timeRoleGroup(
[](const ItemData *item) {
return item->values.value("deletiontime").toDateTime();
},
a,
false)
.comparable;
[](const ItemData *item) {
return item->values.value("deletiontime").toDateTime();
},
a,
false);
groupB = timeRoleGroup(
[](const ItemData *item) {
return item->values.value("deletiontime").toDateTime();
},
b,
false)
.comparable;
[](const ItemData *item) {
return item->values.value("deletiontime").toDateTime();
},
b,
false);
break;
case PermissionsRole:
groupA = permissionRoleGroup(a, false).comparable;
groupB = permissionRoleGroup(b, false).comparable;
groupA = permissionRoleGroup(a, false);
groupB = permissionRoleGroup(b, false);
break;
case RatingRole:
groupA = ratingRoleGroup(a, false).comparable;
groupB = ratingRoleGroup(b, false).comparable;
groupA = ratingRoleGroup(a, false);
groupB = ratingRoleGroup(b, false);
break;
case TypeRole:
groupA = typeRoleGroup(a);
groupB = typeRoleGroup(b);
break;
default: {
QString strGroupA = genericStringRoleGroup(groupRole(), a);
QString strGroupB = genericStringRoleGroup(groupRole(), b);
result = stringCompare(strGroupA, strGroupB, collator);
groupA = genericStringRoleGroup(groupRole(), a);
groupB = genericStringRoleGroup(groupRole(), b);
break;
}
}
if (result == 0) {
if (groupA < groupB) {
result = -1;
} else if (groupA > groupB) {
result = 1;
}
if (groupA.comparable < groupB.comparable) {
result = -1;
} else if (groupA.comparable > groupB.comparable) {
result = 1;
} else {
result = stringCompare(groupA.text, groupB.text, collator);
}
return result;
}
@ -2866,9 +2861,9 @@ KFileItemModel::ItemGroupInfo KFileItemModel::ratingRoleGroup(const ItemData *it
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
@ -2917,6 +2912,20 @@ QList<QPair<int, QVariant>> KFileItemModel::sizeRoleGroups() const
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
{
Q_ASSERT(!m_itemData.isEmpty());
@ -2995,17 +3004,17 @@ QList<QPair<int, QVariant>> KFileItemModel::genericStringRoleGroups(const QByteA
const int maxIndex = count() - 1;
QList<QPair<int, QVariant>> groups;
QString groupText;
ItemGroupInfo groupInfo;
for (int i = 0; i <= maxIndex; ++i) {
if (isChildItem(i)) {
continue;
}
QString newGroupText = genericStringRoleGroup(role, m_itemData.at(i));
ItemGroupInfo newGroupInfo = genericStringRoleGroup(role, m_itemData.at(i));
if (newGroupText != groupText) {
groupText = newGroupText;
groups.append(QPair<int, QVariant>(i, newGroupText));
if (newGroupInfo != groupInfo) {
groupInfo = newGroupInfo;
groups.append(QPair<int, QVariant>(i, newGroupInfo.text));
}
}
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 permissionRoleGroup(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>> sizeRoleGroups() const;
QList<QPair<int, QVariant>> timeRoleGroups(const std::function<QDateTime(const ItemData *)> &fileTimeCb) const;
QList<QPair<int, QVariant>> permissionRoleGroups() const;
QList<QPair<int, QVariant>> ratingRoleGroups() const;
QList<QPair<int, QVariant>> typeRoleGroups() 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;
}
inline bool KFileItemModel::ItemGroupInfo::operator<(const ItemGroupInfo &other) const
{
if (comparable == other.comparable) {
return text < other.text;
} else {
return comparable < other.comparable;
}
}
#endif