+int KFileItemModel::groupRoleCompare(const ItemData *a, const ItemData *b, const QCollator &collator) const
+{
+ // Unlike sortRoleCompare, this function can and often will return 0.
+ const KFileItem &itemA = a->item;
+ const KFileItem &itemB = b->item;
+
+ int result = 0;
+
+ switch (m_groupRole) {
+ case NoRole:
+ break;
+ case NameRole: {
+ QChar groupA = getNameRoleGroup(a, false).toChar();
+ QChar groupB = getNameRoleGroup(b, false).toChar();
+ if (groupA < groupB) {
+ result = -1;
+ } else if (groupA > groupB) {
+ result = 1;
+ }
+ break;
+ }
+ case SizeRole: {
+ int groupA = getSizeRoleGroup(a, false).toInt();
+ int groupB = getSizeRoleGroup(b, false).toInt();
+ if (groupA < groupB) {
+ result = -1;
+ } else if (groupA > groupB) {
+ result = 1;
+ }
+ break;
+ }
+ case ModificationTimeRole: {
+ int groupA = getTimeRoleGroup(
+ [](const ItemData *item) {
+ return item->item.time(KFileItem::ModificationTime);
+ },
+ a,
+ false)
+ .toInt();
+ int groupB = getTimeRoleGroup(
+ [](const ItemData *item) {
+ return item->item.time(KFileItem::ModificationTime);
+ },
+ b,
+ false)
+ .toInt();
+ if (groupA < groupB) {
+ result = -1;
+ } else if (groupA > groupB) {
+ result = 1;
+ }
+ break;
+ }
+ case CreationTimeRole: {
+ int groupA = getTimeRoleGroup(
+ [](const ItemData *item) {
+ return item->item.time(KFileItem::CreationTime);
+ },
+ a,
+ false)
+ .toInt();
+ int groupB = getTimeRoleGroup(
+ [](const ItemData *item) {
+ return item->item.time(KFileItem::CreationTime);
+ },
+ b,
+ false)
+ .toInt();
+ if (groupA < groupB) {
+ result = -1;
+ } else if (groupA > groupB) {
+ result = 1;
+ }
+ break;
+ }
+ case AccessTimeRole: {
+ int groupA = getTimeRoleGroup(
+ [](const ItemData *item) {
+ return item->item.time(KFileItem::AccessTime);
+ },
+ a,
+ false)
+ .toInt();
+ int groupB = getTimeRoleGroup(
+ [](const ItemData *item) {
+ return item->item.time(KFileItem::AccessTime);
+ },
+ b,
+ false)
+ .toInt();
+ if (groupA < groupB) {
+ result = -1;
+ } else if (groupA > groupB) {
+ result = 1;
+ }
+ break;
+ }
+ case DeletionTimeRole: {
+ int groupA = getTimeRoleGroup(
+ [](const ItemData *item) {
+ return item->values.value("deletiontime").toDateTime();
+ },
+ a,
+ false)
+ .toInt();
+ int groupB = getTimeRoleGroup(
+ [](const ItemData *item) {
+ return item->values.value("deletiontime").toDateTime();
+ },
+ b,
+ false)
+ .toInt();
+ if (groupA < groupB) {
+ result = -1;
+ } else if (groupA > groupB) {
+ result = 1;
+ }
+ break;
+ }
+ // case PermissionsRole:
+ // case RatingRole:
+ default: {
+ QString groupA = getGenericStringRoleGroup(groupRole(), a);
+ QString groupB = getGenericStringRoleGroup(groupRole(), b);
+ if (groupA < groupB) {
+ result = -1;
+ } else if (groupA > groupB) {
+ result = 1;
+ }
+ break;
+ }
+ }
+ return result;
+}
+