mirror of
https://invent.kde.org/system/dolphin
synced 2024-07-04 17:30:55 +00:00
Fixed grouping again, implemented permission and rating grouping.
This commit is contained in:
parent
38d293ae41
commit
e9b056dcf0
|
@ -2366,16 +2366,18 @@ int KFileItemModel::groupRoleCompare(const ItemData *a, const ItemData *b, const
|
||||||
false)
|
false)
|
||||||
.comparable;
|
.comparable;
|
||||||
break;
|
break;
|
||||||
// case PermissionsRole:
|
case PermissionsRole:
|
||||||
// case RatingRole:
|
groupA = permissionRoleGroup(a, false).comparable;
|
||||||
|
groupB = permissionRoleGroup(b, false).comparable;
|
||||||
|
break;
|
||||||
|
case RatingRole:
|
||||||
|
groupA = ratingRoleGroup(a, false).comparable;
|
||||||
|
groupB = ratingRoleGroup(b, false).comparable;
|
||||||
|
break;
|
||||||
default: {
|
default: {
|
||||||
QString strGroupA = genericStringRoleGroup(groupRole(), a);
|
QString strGroupA = genericStringRoleGroup(groupRole(), a);
|
||||||
QString strGroupB = genericStringRoleGroup(groupRole(), b);
|
QString strGroupB = genericStringRoleGroup(groupRole(), b);
|
||||||
if (strGroupA < strGroupB) {
|
result = stringCompare(strGroupA, strGroupB, collator);
|
||||||
result = -1;
|
|
||||||
} else if (strGroupA > strGroupB) {
|
|
||||||
result = 1;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2410,8 +2412,10 @@ int KFileItemModel::stringCompare(const QString &a, const QString &b, const QCol
|
||||||
|
|
||||||
KFileItemModel::ItemGroupInfo KFileItemModel::nameRoleGroup(const ItemData *itemData, bool withString) const
|
KFileItemModel::ItemGroupInfo KFileItemModel::nameRoleGroup(const ItemData *itemData, bool withString) const
|
||||||
{
|
{
|
||||||
static ItemGroupInfo oldGroupInfo, groupInfo;
|
static ItemGroupInfo oldGroupInfo;
|
||||||
static QChar oldFirstChar, firstChar;
|
static QChar oldFirstChar;
|
||||||
|
ItemGroupInfo groupInfo;
|
||||||
|
QChar firstChar;
|
||||||
|
|
||||||
const QString name = itemData->item.text();
|
const QString name = itemData->item.text();
|
||||||
|
|
||||||
|
@ -2480,15 +2484,14 @@ KFileItemModel::ItemGroupInfo KFileItemModel::nameRoleGroup(const ItemData *item
|
||||||
|
|
||||||
KFileItemModel::ItemGroupInfo KFileItemModel::sizeRoleGroup(const ItemData *itemData, bool withString) const
|
KFileItemModel::ItemGroupInfo KFileItemModel::sizeRoleGroup(const ItemData *itemData, bool withString) const
|
||||||
{
|
{
|
||||||
static ItemGroupInfo oldGroupInfo, groupInfo;
|
static ItemGroupInfo oldGroupInfo;
|
||||||
static KIO::filesize_t oldFileSize, fileSize;
|
static KIO::filesize_t oldFileSize;
|
||||||
|
ItemGroupInfo groupInfo;
|
||||||
|
KIO::filesize_t fileSize;
|
||||||
|
|
||||||
const KFileItem item = itemData->item;
|
const KFileItem item = itemData->item;
|
||||||
fileSize = !item.isNull() ? item.size() : ~0U;
|
fileSize = !item.isNull() ? item.size() : ~0U;
|
||||||
|
|
||||||
// Use the first character of the name as group indication
|
|
||||||
fileSize = item.size();
|
|
||||||
|
|
||||||
groupInfo.comparable = -1; // None
|
groupInfo.comparable = -1; // None
|
||||||
if (!item.isNull() && item.isDir()) {
|
if (!item.isNull() && item.isDir()) {
|
||||||
if (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount || m_sortDirsFirst) {
|
if (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount || m_sortDirsFirst) {
|
||||||
|
@ -2498,7 +2501,7 @@ KFileItemModel::ItemGroupInfo KFileItemModel::sizeRoleGroup(const ItemData *item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fileSize == oldFileSize) {
|
if (fileSize == oldFileSize) {
|
||||||
groupInfo = oldGroupInfo;
|
return oldGroupInfo;
|
||||||
}
|
}
|
||||||
if (groupInfo.comparable < 0) {
|
if (groupInfo.comparable < 0) {
|
||||||
if (fileSize < 5 * 1024 * 1024) { // < 5 MB
|
if (fileSize < 5 * 1024 * 1024) { // < 5 MB
|
||||||
|
@ -2522,17 +2525,15 @@ KFileItemModel::ItemGroupInfo KFileItemModel::sizeRoleGroup(const ItemData *item
|
||||||
KFileItemModel::ItemGroupInfo
|
KFileItemModel::ItemGroupInfo
|
||||||
KFileItemModel::timeRoleGroup(const std::function<QDateTime(const ItemData *)> &fileTimeCb, const ItemData *itemData, bool withString) const
|
KFileItemModel::timeRoleGroup(const std::function<QDateTime(const ItemData *)> &fileTimeCb, const ItemData *itemData, bool withString) const
|
||||||
{
|
{
|
||||||
static ItemGroupInfo oldGroupInfo, groupInfo;
|
static ItemGroupInfo oldGroupInfo;
|
||||||
static QDate oldFileDate;
|
static QDate oldFileDate;
|
||||||
|
ItemGroupInfo groupInfo;
|
||||||
|
|
||||||
const QDate currentDate = QDate::currentDate();
|
const QDate currentDate = QDate::currentDate();
|
||||||
const QDateTime fileTime = fileTimeCb(itemData);
|
const QDateTime fileTime = fileTimeCb(itemData);
|
||||||
const QDate fileDate = fileTime.date();
|
const QDate fileDate = fileTime.date();
|
||||||
const int daysDistance = fileDate.daysTo(currentDate);
|
const int daysDistance = fileDate.daysTo(currentDate);
|
||||||
|
|
||||||
int intGroupInfo;
|
|
||||||
QString strGroupInfo;
|
|
||||||
|
|
||||||
// Simplified grouping algorithm, preserving dates
|
// Simplified grouping algorithm, preserving dates
|
||||||
// but not taking "pretty printing" into account
|
// but not taking "pretty printing" into account
|
||||||
if (currentDate.year() == fileDate.year() && currentDate.month() == fileDate.month()) {
|
if (currentDate.year() == fileDate.year() && currentDate.month() == fileDate.month()) {
|
||||||
|
@ -2553,13 +2554,13 @@ KFileItemModel::timeRoleGroup(const std::function<QDateTime(const ItemData *)> &
|
||||||
if (daysDistance < 7) {
|
if (daysDistance < 7) {
|
||||||
groupInfo.comparable = daysDistance; // Today, Yesterday and week days (Month, Year)
|
groupInfo.comparable = daysDistance; // Today, Yesterday and week days (Month, Year)
|
||||||
} else if (daysDistance < 14) {
|
} else if (daysDistance < 14) {
|
||||||
groupInfo.comparable = 9; // One Week Ago (Month, Year)
|
groupInfo.comparable = 11; // One Week Ago (Month, Year)
|
||||||
} else if (daysDistance < 21) {
|
} else if (daysDistance < 21) {
|
||||||
groupInfo.comparable = 19; // Two Weeks Ago (Month, Year)
|
groupInfo.comparable = 21; // Two Weeks Ago (Month, Year)
|
||||||
} else if (daysDistance < 28) {
|
} else if (daysDistance < 28) {
|
||||||
groupInfo.comparable = 29; // Three Weeks Ago (Month, Year)
|
groupInfo.comparable = 31; // Three Weeks Ago (Month, Year)
|
||||||
} else {
|
} else {
|
||||||
groupInfo.comparable = 39; // Earlier on Month, Year
|
groupInfo.comparable = 41; // Earlier on Month, Year
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// The trick will fail for dates past April, 178956967 or before 1 AD.
|
// The trick will fail for dates past April, 178956967 or before 1 AD.
|
||||||
|
@ -2626,7 +2627,7 @@ KFileItemModel::timeRoleGroup(const std::function<QDateTime(const ItemData *)> &
|
||||||
const QString untranslatedFormat = format.toString({QLatin1String("en_US")});
|
const QString untranslatedFormat = format.toString({QLatin1String("en_US")});
|
||||||
groupInfo.text = fileTime.toString(untranslatedFormat);
|
groupInfo.text = fileTime.toString(untranslatedFormat);
|
||||||
}
|
}
|
||||||
} else if (daysDistance <= 7) {
|
} else if (daysDistance < 7) {
|
||||||
groupInfo.text =
|
groupInfo.text =
|
||||||
fileTime.toString(i18nc("@title:group Date: "
|
fileTime.toString(i18nc("@title:group Date: "
|
||||||
"The week day name: dddd, MMMM is full month name "
|
"The week day name: dddd, MMMM is full month name "
|
||||||
|
@ -2637,7 +2638,7 @@ KFileItemModel::timeRoleGroup(const std::function<QDateTime(const ItemData *)> &
|
||||||
"\"dddd (MMMM, yyyy)\" with context @title:group Date",
|
"\"dddd (MMMM, yyyy)\" with context @title:group Date",
|
||||||
"%1",
|
"%1",
|
||||||
groupInfo.text);
|
groupInfo.text);
|
||||||
} else if (daysDistance <= 7 * 2) {
|
} else if (daysDistance < 7 * 2) {
|
||||||
const KLocalizedString format = ki18nc(
|
const KLocalizedString format = ki18nc(
|
||||||
"@title:group Date: "
|
"@title:group Date: "
|
||||||
"MMMM is full month name in current locale, and yyyy is "
|
"MMMM is full month name in current locale, and yyyy is "
|
||||||
|
@ -2658,7 +2659,7 @@ KFileItemModel::timeRoleGroup(const std::function<QDateTime(const ItemData *)> &
|
||||||
const QString untranslatedFormat = format.toString({QLatin1String("en_US")});
|
const QString untranslatedFormat = format.toString({QLatin1String("en_US")});
|
||||||
groupInfo.text = fileTime.toString(untranslatedFormat);
|
groupInfo.text = fileTime.toString(untranslatedFormat);
|
||||||
}
|
}
|
||||||
} else if (daysDistance <= 7 * 3) {
|
} else if (daysDistance < 7 * 3) {
|
||||||
const KLocalizedString format = ki18nc(
|
const KLocalizedString format = ki18nc(
|
||||||
"@title:group Date: "
|
"@title:group Date: "
|
||||||
"MMMM is full month name in current locale, and yyyy is "
|
"MMMM is full month name in current locale, and yyyy is "
|
||||||
|
@ -2679,7 +2680,7 @@ KFileItemModel::timeRoleGroup(const std::function<QDateTime(const ItemData *)> &
|
||||||
const QString untranslatedFormat = format.toString({QLatin1String("en_US")});
|
const QString untranslatedFormat = format.toString({QLatin1String("en_US")});
|
||||||
groupInfo.text = fileTime.toString(untranslatedFormat);
|
groupInfo.text = fileTime.toString(untranslatedFormat);
|
||||||
}
|
}
|
||||||
} else if (daysDistance <= 7 * 4) {
|
} else if (daysDistance < 7 * 4) {
|
||||||
const KLocalizedString format = ki18nc(
|
const KLocalizedString format = ki18nc(
|
||||||
"@title:group Date: "
|
"@title:group Date: "
|
||||||
"MMMM is full month name in current locale, and yyyy is "
|
"MMMM is full month name in current locale, and yyyy is "
|
||||||
|
@ -2741,6 +2742,77 @@ KFileItemModel::timeRoleGroup(const std::function<QDateTime(const ItemData *)> &
|
||||||
return groupInfo;
|
return groupInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KFileItemModel::ItemGroupInfo KFileItemModel::permissionRoleGroup(const ItemData *itemData, bool withString) const
|
||||||
|
{
|
||||||
|
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) {
|
||||||
|
return oldGroupInfo;
|
||||||
|
}
|
||||||
|
groupInfo.comparable = (int)permissions;
|
||||||
|
|
||||||
|
if (withString) {
|
||||||
|
// Set user string
|
||||||
|
QString user;
|
||||||
|
if (permissions & QFile::ReadUser) {
|
||||||
|
user = i18nc("@item:intext Access permission, concatenated", "Read, ");
|
||||||
|
}
|
||||||
|
if (permissions & QFile::WriteUser) {
|
||||||
|
user += i18nc("@item:intext Access permission, concatenated", "Write, ");
|
||||||
|
}
|
||||||
|
if (permissions & QFile::ExeUser) {
|
||||||
|
user += i18nc("@item:intext Access permission, concatenated", "Execute, ");
|
||||||
|
}
|
||||||
|
user = user.isEmpty() ? i18nc("@item:intext Access permission, concatenated", "Forbidden") : user.mid(0, user.length() - 2);
|
||||||
|
|
||||||
|
// Set group string
|
||||||
|
QString group;
|
||||||
|
if (permissions & QFile::ReadGroup) {
|
||||||
|
group = i18nc("@item:intext Access permission, concatenated", "Read, ");
|
||||||
|
}
|
||||||
|
if (permissions & QFile::WriteGroup) {
|
||||||
|
group += i18nc("@item:intext Access permission, concatenated", "Write, ");
|
||||||
|
}
|
||||||
|
if (permissions & QFile::ExeGroup) {
|
||||||
|
group += i18nc("@item:intext Access permission, concatenated", "Execute, ");
|
||||||
|
}
|
||||||
|
group = group.isEmpty() ? i18nc("@item:intext Access permission, concatenated", "Forbidden") : group.mid(0, group.length() - 2);
|
||||||
|
|
||||||
|
// Set others string
|
||||||
|
QString others;
|
||||||
|
if (permissions & QFile::ReadOther) {
|
||||||
|
others = i18nc("@item:intext Access permission, concatenated", "Read, ");
|
||||||
|
}
|
||||||
|
if (permissions & QFile::WriteOther) {
|
||||||
|
others += i18nc("@item:intext Access permission, concatenated", "Write, ");
|
||||||
|
}
|
||||||
|
if (permissions & QFile::ExeOther) {
|
||||||
|
others += i18nc("@item:intext Access permission, concatenated", "Execute, ");
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
oldPermissions = permissions;
|
||||||
|
oldGroupInfo = groupInfo;
|
||||||
|
return groupInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
KFileItemModel::ItemGroupInfo KFileItemModel::ratingRoleGroup(const ItemData *itemData, bool withString) const
|
||||||
|
{
|
||||||
|
ItemGroupInfo groupInfo;
|
||||||
|
groupInfo.comparable = itemData->values.value("rating", 0).toInt();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return groupInfo;
|
||||||
|
}
|
||||||
|
|
||||||
QString KFileItemModel::genericStringRoleGroup(const QByteArray &role, const ItemData *itemData) const
|
QString KFileItemModel::genericStringRoleGroup(const QByteArray &role, const ItemData *itemData) const
|
||||||
{
|
{
|
||||||
return itemData->values.value(role).toString();
|
return itemData->values.value(role).toString();
|
||||||
|
@ -2822,69 +2894,19 @@ QList<QPair<int, QVariant>> KFileItemModel::permissionRoleGroups() const
|
||||||
const int maxIndex = count() - 1;
|
const int maxIndex = count() - 1;
|
||||||
QList<QPair<int, QVariant>> groups;
|
QList<QPair<int, QVariant>> groups;
|
||||||
|
|
||||||
/*QString permissionsString;
|
|
||||||
ItemGroupInfo groupInfo;
|
ItemGroupInfo groupInfo;
|
||||||
for (int i = 0; i <= maxIndex; ++i) {
|
for (int i = 0; i <= maxIndex; ++i) {
|
||||||
if (isChildItem(i)) {
|
if (isChildItem(i)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ItemData *itemData = m_itemData.at(i);
|
ItemGroupInfo newGroupInfo = permissionRoleGroup(m_itemData.at(i));
|
||||||
const QString newPermissionsString = itemData->values.value("permissions").toString();
|
|
||||||
if (newPermissionsString == permissionsString) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
permissionsString = newPermissionsString;
|
|
||||||
|
|
||||||
const QFileInfo info(itemData->item.url().toLocalFile());
|
|
||||||
|
|
||||||
// Set user string
|
|
||||||
QString user;
|
|
||||||
if (info.permission(QFile::ReadUser)) {
|
|
||||||
user = i18nc("@item:intext Access permission, concatenated", "Read, ");
|
|
||||||
}
|
|
||||||
if (info.permission(QFile::WriteUser)) {
|
|
||||||
user += i18nc("@item:intext Access permission, concatenated", "Write, ");
|
|
||||||
}
|
|
||||||
if (info.permission(QFile::ExeUser)) {
|
|
||||||
user += i18nc("@item:intext Access permission, concatenated", "Execute, ");
|
|
||||||
}
|
|
||||||
user = user.isEmpty() ? i18nc("@item:intext Access permission, concatenated", "Forbidden") : user.mid(0, user.length() - 2);
|
|
||||||
|
|
||||||
// Set group string
|
|
||||||
QString group;
|
|
||||||
if (info.permission(QFile::ReadGroup)) {
|
|
||||||
group = i18nc("@item:intext Access permission, concatenated", "Read, ");
|
|
||||||
}
|
|
||||||
if (info.permission(QFile::WriteGroup)) {
|
|
||||||
group += i18nc("@item:intext Access permission, concatenated", "Write, ");
|
|
||||||
}
|
|
||||||
if (info.permission(QFile::ExeGroup)) {
|
|
||||||
group += i18nc("@item:intext Access permission, concatenated", "Execute, ");
|
|
||||||
}
|
|
||||||
group = group.isEmpty() ? i18nc("@item:intext Access permission, concatenated", "Forbidden") : group.mid(0, group.length() - 2);
|
|
||||||
|
|
||||||
// Set others string
|
|
||||||
QString others;
|
|
||||||
if (info.permission(QFile::ReadOther)) {
|
|
||||||
others = i18nc("@item:intext Access permission, concatenated", "Read, ");
|
|
||||||
}
|
|
||||||
if (info.permission(QFile::WriteOther)) {
|
|
||||||
others += i18nc("@item:intext Access permission, concatenated", "Write, ");
|
|
||||||
}
|
|
||||||
if (info.permission(QFile::ExeOther)) {
|
|
||||||
others += i18nc("@item:intext Access permission, concatenated", "Execute, ");
|
|
||||||
}
|
|
||||||
others = others.isEmpty() ? i18nc("@item:intext Access permission, concatenated", "Forbidden") : others.mid(0, others.length() - 2);
|
|
||||||
|
|
||||||
const ItemListGroup newGroupInfo = {0,
|
|
||||||
i18nc("@title:group Files and folders by permissions", "User: %1 | Group: %2 | Others: %3", user, group, others)};
|
|
||||||
if (newGroupInfo != groupInfo) {
|
if (newGroupInfo != groupInfo) {
|
||||||
groupInfo = newGroupInfo;
|
groupInfo = newGroupInfo;
|
||||||
groups.append(QPair<int, QVariant>(i, newGroupInfo));
|
groups.append(QPair<int, QVariant>(i, newGroupInfo.text));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}*/
|
|
||||||
|
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2895,19 +2917,21 @@ QList<QPair<int, QVariant>> KFileItemModel::ratingRoleGroups() const
|
||||||
const int maxIndex = count() - 1;
|
const int maxIndex = count() - 1;
|
||||||
QList<QPair<int, QVariant>> groups;
|
QList<QPair<int, QVariant>> groups;
|
||||||
|
|
||||||
/*ItemGroupInfo groupInfo;
|
ItemGroupInfo groupInfo;
|
||||||
for (int i = 0; i <= maxIndex; ++i) {
|
for (int i = 0; i <= maxIndex; ++i) {
|
||||||
if (isChildItem(i)) {
|
if (isChildItem(i)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemGroupInfo newGroupInfo = nameRoleGroup(fileTimeCb, m_itemData.at(i)).toString();
|
ItemGroupInfo newGroupInfo = ratingRoleGroup(m_itemData.at(i));
|
||||||
|
|
||||||
if (newGroupInfo != groupInfo) {
|
if (newGroupInfo != groupInfo) {
|
||||||
groupInfo = newGroupInfo;
|
groupInfo = newGroupInfo;
|
||||||
groups.append(QPair<int, QVariant>(i, newGroupInfo));
|
// Using the numeric representation because Dolphin has a special
|
||||||
|
// case for drawing stars.
|
||||||
|
groups.append(QPair<int, QVariant>(i, newGroupInfo.comparable));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}*/
|
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,6 +113,8 @@ public:
|
||||||
|
|
||||||
QString roleDescription(const QByteArray &role) const override;
|
QString roleDescription(const QByteArray &role) const override;
|
||||||
|
|
||||||
|
QList<QPair<int, QVariant>> groups() const override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The file-item for the index \a index. If the index is in a valid
|
* @return The file-item for the index \a index. If the index is in a valid
|
||||||
* range it is assured that the file-item is not null. The runtime
|
* range it is assured that the file-item is not null. The runtime
|
||||||
|
@ -209,8 +211,6 @@ public:
|
||||||
*/
|
*/
|
||||||
static QList<RoleInfo> rolesInformation();
|
static QList<RoleInfo> rolesInformation();
|
||||||
|
|
||||||
QList<QPair<int, QVariant>> groups() const override;
|
|
||||||
|
|
||||||
/** set to true to hide application/x-trash files */
|
/** set to true to hide application/x-trash files */
|
||||||
void setShowTrashMime(bool show);
|
void setShowTrashMime(bool show);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user