mirror of
https://invent.kde.org/system/dolphin
synced 2024-10-02 14:45:04 +00:00
"Group by - Type" now respects "Folders first" setting. Minor code cleanup
This commit is contained in:
parent
8d30497f71
commit
6f6f080bb8
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue