X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/6f6f080bb883afbfcd8e4208348630d73e4ba559..2b6d8aac0b889fd7740dcb36f3c05b87dd763c8d:/src/kitemviews/kfileitemmodel.cpp diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 7d5b0f518..5b7b781a8 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -39,6 +39,7 @@ KFileItemModel::KFileItemModel(QObject *parent) , m_sortDirsFirst(true) , m_sortHiddenLast(false) , m_sortRole(NameRole) + , m_groupRole(NoRole) , m_sortingProgressPercent(-1) , m_roles() , m_itemData() @@ -946,6 +947,15 @@ QList KFileItemModel::rolesInformation() return rolesInfo; } +QList KFileItemModel::extraGroupingInformation() +{ + static QList rolesInfo{ + {QByteArray("none"), kli18nc("@label", "No grouping").toString(), nullptr, nullptr, false, false}, + {QByteArray("followSort"), kli18nc("@label", "Follow sorting").toString(), nullptr, nullptr, false, false} + }; + return rolesInfo; +} + void KFileItemModel::onGroupedSortingChanged(bool current) { Q_UNUSED(current) @@ -975,14 +985,11 @@ void KFileItemModel::onSortRoleChanged(const QByteArray ¤t, const QByteArr } } -void KFileItemModel::onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous, bool resortItems) +void KFileItemModel::onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous) { Q_UNUSED(current) Q_UNUSED(previous) - - if (resortItems) { - resortAllItems(); - } + resortAllItems(); } void KFileItemModel::onGroupRoleChanged(const QByteArray ¤t, const QByteArray &previous, bool resortItems) @@ -1008,14 +1015,11 @@ void KFileItemModel::onGroupRoleChanged(const QByteArray ¤t, const QByteAr } } -void KFileItemModel::onGroupOrderChanged(Qt::SortOrder current, Qt::SortOrder previous, bool resortItems) +void KFileItemModel::onGroupOrderChanged(Qt::SortOrder current, Qt::SortOrder previous) { Q_UNUSED(current) Q_UNUSED(previous) - - if (resortItems) { - resortAllItems(); - } + resortAllItems(); } void KFileItemModel::loadSortingSettings() @@ -1040,6 +1044,7 @@ void KFileItemModel::loadSortingSettings() // Workaround for bug https://bugreports.qt.io/browse/QTBUG-69361 // Force the clean state of QCollator in single thread to avoid thread safety problems in sort m_collator.compare(QString(), QString()); + ContentDisplaySettings::self(); } void KFileItemModel::resortAllItems() @@ -1105,7 +1110,8 @@ void KFileItemModel::resortAllItems() } Q_EMIT itemsMoved(KItemRange(firstMovedIndex, movedItemsCount), movedToIndexes); - } else if (groupedSorting()) { + } + if (groupedSorting()) { // The groups might have changed even if the order of the items has not. const QList> oldGroups = m_groups; m_groups.clear(); @@ -1714,9 +1720,9 @@ QList KFileItemModel::createItemDataList(const QUrl return itemDataList; } -void KFileItemModel::prepareItemsForSorting(QList &itemDataList) +void KFileItemModel::prepareItemsWithRole(QList &itemDataList, RoleType roleType) { - switch (m_sortRole) { + switch (roleType) { case ExtensionRole: case PermissionsRole: case OwnerRole: @@ -1753,35 +1759,12 @@ void KFileItemModel::prepareItemsForSorting(QList &itemDataList) // DateRole). break; } - switch (m_groupRole) { - case ExtensionRole: - case PermissionsRole: - case OwnerRole: - case GroupRole: - case DestinationRole: - case PathRole: - case DeletionTimeRole: - for (ItemData *itemData : std::as_const(itemDataList)) { - if (itemData->values.isEmpty()) { - itemData->values = retrieveData(itemData->item, itemData->parent); - } - } - break; - - case TypeRole: - for (ItemData *itemData : std::as_const(itemDataList)) { - if (itemData->values.isEmpty()) { - const KFileItem item = itemData->item; - if (item.isDir() || item.isMimeTypeKnown()) { - itemData->values = retrieveData(itemData->item, itemData->parent); - } - } - } - break; +} - default: - break; - } +void KFileItemModel::prepareItemsForSorting(QList &itemDataList) +{ + prepareItemsWithRole(itemDataList, m_sortRole); + prepareItemsWithRole(itemDataList, m_groupRole); } int KFileItemModel::expandedParentsCount(const ItemData *data) @@ -2129,8 +2112,7 @@ bool KFileItemModel::lessThan(const ItemData *a, const ItemData *b, const QColla return true; } } - if (m_sortDirsFirst - || (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount && m_sortRole == SizeRole)) { + if (m_sortDirsFirst || (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount && m_sortRole == SizeRole)) { const bool isDirA = a->item.isDir(); const bool isDirB = b->item.isDir(); if (isDirA && !isDirB) { @@ -2458,6 +2440,7 @@ int KFileItemModel::stringCompare(const QString &a, const QString &b, const QCol KFileItemModel::ItemGroupInfo KFileItemModel::nameRoleGroup(const ItemData *itemData, bool withString) const { + static bool oldWithString; static ItemGroupInfo oldGroupInfo; static QChar oldFirstChar; ItemGroupInfo groupInfo; @@ -2469,8 +2452,8 @@ KFileItemModel::ItemGroupInfo KFileItemModel::nameRoleGroup(const ItemData *item // Use the first character of the name as group indication firstChar = name.at(0).toUpper(); - - if (firstChar == oldFirstChar) { + + if (firstChar == oldFirstChar && withString == oldWithString) { return oldGroupInfo; } if (firstChar == QLatin1Char('~') && name.length() > 1) { @@ -2525,6 +2508,7 @@ KFileItemModel::ItemGroupInfo KFileItemModel::nameRoleGroup(const ItemData *item } groupInfo.comparable = (int)'.'; } + oldWithString = withString; oldFirstChar = firstChar; oldGroupInfo = groupInfo; return groupInfo; @@ -2532,8 +2516,6 @@ KFileItemModel::ItemGroupInfo KFileItemModel::nameRoleGroup(const ItemData *item KFileItemModel::ItemGroupInfo KFileItemModel::sizeRoleGroup(const ItemData *itemData, bool withString) const { - static ItemGroupInfo oldGroupInfo; - static KIO::filesize_t oldFileSize; ItemGroupInfo groupInfo; KIO::filesize_t fileSize; @@ -2542,15 +2524,12 @@ KFileItemModel::ItemGroupInfo KFileItemModel::sizeRoleGroup(const ItemData *item groupInfo.comparable = -1; // None if (!item.isNull() && item.isDir()) { - if (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount || m_sortDirsFirst) { + if (ContentDisplaySettings::directorySizeMode() != ContentDisplaySettings::EnumDirectorySizeMode::ContentSize) { groupInfo.comparable = 0; // Folders } else { fileSize = itemData->values.value("size").toULongLong(); } } - if (fileSize == oldFileSize) { - return oldGroupInfo; - } if (groupInfo.comparable < 0) { if (fileSize < 5 * 1024 * 1024) { // < 5 MB groupInfo.comparable = 1; // Small @@ -2565,14 +2544,13 @@ KFileItemModel::ItemGroupInfo KFileItemModel::sizeRoleGroup(const ItemData *item char const *groupNames[] = {"Folders", "Small", "Medium", "Big"}; groupInfo.text = i18nc("@title:group Size", groupNames[groupInfo.comparable]); } - oldFileSize = fileSize; - oldGroupInfo = groupInfo; return groupInfo; } KFileItemModel::ItemGroupInfo KFileItemModel::timeRoleGroup(const std::function &fileTimeCb, const ItemData *itemData, bool withString) const { + static bool oldWithString; static ItemGroupInfo oldGroupInfo; static QDate oldFileDate; ItemGroupInfo groupInfo; @@ -2582,6 +2560,9 @@ KFileItemModel::timeRoleGroup(const std::function & const QDate fileDate = fileTime.date(); const int daysDistance = fileDate.daysTo(currentDate); + if (fileDate == oldFileDate && withString == oldWithString) { + return oldGroupInfo; + } // Simplified grouping algorithm, preserving dates // but not taking "pretty printing" into account if (currentDate.year() == fileDate.year() && currentDate.month() == fileDate.month()) { @@ -2785,6 +2766,7 @@ KFileItemModel::timeRoleGroup(const std::function & } } } + oldWithString = withString; oldFileDate = fileDate; oldGroupInfo = groupInfo; return groupInfo; @@ -2792,13 +2774,14 @@ KFileItemModel::timeRoleGroup(const std::function & KFileItemModel::ItemGroupInfo KFileItemModel::permissionRoleGroup(const ItemData *itemData, bool withString) const { + static bool oldWithString; static ItemGroupInfo oldGroupInfo; static QFileDevice::Permissions oldPermissions; ItemGroupInfo groupInfo; const QFileInfo info(itemData->item.url().toLocalFile()); const QFileDevice::Permissions permissions = info.permissions(); - if (permissions == oldPermissions) { + if (permissions == oldPermissions && withString == oldWithString) { return oldGroupInfo; } groupInfo.comparable = (int)permissions; @@ -2844,6 +2827,7 @@ KFileItemModel::ItemGroupInfo KFileItemModel::permissionRoleGroup(const ItemData others = others.isEmpty() ? i18nc("@item:intext Access permission, concatenated", "Forbidden") : others.mid(0, others.length() - 2); groupInfo.text = i18nc("@title:group Files and folders by permissions", "User: %1 | Group: %2 | Others: %3", user, group, others); } + oldWithString = withString; oldPermissions = permissions; oldGroupInfo = groupInfo; return groupInfo; @@ -2856,7 +2840,7 @@ KFileItemModel::ItemGroupInfo KFileItemModel::ratingRoleGroup(const ItemData *it if (withString) { // Dolphin does not currently use string representation of star rating // as stars are rendered as graphics in group headers. - groupInfo.text = i18nc("@item:intext Rated N (stars)", "Rated ") + QString::number(groupInfo.comparable); + groupInfo.text = i18nc("@item:intext Rated N (stars)", "Rated %i", QString::number(groupInfo.comparable)); } return groupInfo; }