X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/341c16eba689331c472455c61f08ff0f0261c49e..7c539fd12f5decbfafbea5fa4c317e7c4d753691:/src/dolphinmodel.cpp diff --git a/src/dolphinmodel.cpp b/src/dolphinmodel.cpp index ccf7d8e1c..f37452c80 100644 --- a/src/dolphinmodel.cpp +++ b/src/dolphinmodel.cpp @@ -1,6 +1,6 @@ /** * This file is part of the KDE project - * Copyright (C) 2007 Rafael Fernández López + * Copyright (C) 2007 Rafael Fernández López * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -29,6 +29,7 @@ #include #include #include +#include #endif #include @@ -47,7 +48,9 @@ #include #include -DolphinModel::DolphinModel(QObject *parent) +const char* DolphinModel::m_others = I18N_NOOP2("@title:group Name", "Others"); + +DolphinModel::DolphinModel(QObject* parent) : KDirModel(parent) { } @@ -56,186 +59,16 @@ DolphinModel::~DolphinModel() { } -QVariant DolphinModel::data(const QModelIndex &index, int role) const +QVariant DolphinModel::data(const QModelIndex& index, int role) const { - if (role == KCategorizedSortFilterProxyModel::CategoryRole) - { - QString retString; - - if (!index.isValid()) - { - return retString; - } - - const KDirModel *dirModel = qobject_cast(index.model()); - KFileItem item = dirModel->itemForIndex(index); - - switch (index.column()) - { - case KDirModel::Name: - { - // KDirModel checks columns to know to which role are - // we talking about - QModelIndex theIndex = index.model()->index(index.row(), - KDirModel::Name, - index.parent()); - - if (!theIndex.isValid()) { - return retString; - } - - QVariant data = theIndex.model()->data(theIndex, Qt::DisplayRole); - if (data.toString().size()) - { - if (!item.isHidden() && data.toString().at(0).isLetter()) - retString = data.toString().toUpper().at(0); - else if (item.isHidden() && data.toString().at(0) == '.' && - data.toString().at(1).isLetter()) - retString = data.toString().toUpper().at(1); - else if (item.isHidden() && data.toString().at(0) == '.' && - !data.toString().at(1).isLetter()) - retString = i18nc("@title:group Name", "Others"); - else if (item.isHidden() && data.toString().at(0) != '.') - retString = data.toString().toUpper().at(0); - else if (item.isHidden()) - retString = data.toString().toUpper().at(0); - else - { - bool validCategory = false; - - const QString str(data.toString().toUpper()); - const QChar* currA = str.unicode(); - while (!currA->isNull() && !validCategory) { - if (currA->isLetter()) - validCategory = true; - else if (currA->isDigit()) - return i18nc("@title:group", "Others"); - else - ++currA; - } - - if (!validCategory) - retString = i18nc("@title:group Name", "Others"); - else - retString = *currA; - } - } - break; - } - - case KDirModel::Size: { - const int fileSize = !item.isNull() ? item.size() : -1; - if (!item.isNull() && item.isDir()) { - retString = i18nc("@title:group Size", "Folders"); - } else if (fileSize < 5242880) { - retString = i18nc("@title:group Size", "Small"); - } else if (fileSize < 10485760) { - retString = i18nc("@title:group Size", "Medium"); - } else { - retString = i18nc("@title:group Size", "Big"); - } - break; - } - - case KDirModel::ModifiedTime: - { - KDateTime modifiedTime; - modifiedTime.setTime_t(item.time(KIO::UDSEntry::UDS_MODIFICATION_TIME)); - modifiedTime = modifiedTime.toLocalZone(); - - retString = modifiedTime.toString(i18nc("Prints out the month and year: %B is full month name in current locale, and %Y is full year number", "%B, %Y")); - break; - } - - case KDirModel::Permissions: - { - QString user; - QString group; - QString others; - - QFileInfo info(item.url().pathOrUrl()); - - if (info.permission(QFile::ReadUser)) - user = i18n("Read, "); - - if (info.permission(QFile::WriteUser)) - user += i18n("Write, "); - - if (info.permission(QFile::ExeUser)) - user += i18n("Execute, "); - - if (user.isEmpty()) - user = i18n("Forbidden"); - else - user = user.mid(0, user.count() - 2); - - if (info.permission(QFile::ReadGroup)) - group = i18n("Read, "); - - if (info.permission(QFile::WriteGroup)) - group += i18n("Write, "); - - if (info.permission(QFile::ExeGroup)) - group += i18n("Execute, "); - - if (group.isEmpty()) - group = i18n("Forbidden"); - else - group = group.mid(0, group.count() - 2); - - if (info.permission(QFile::ReadOther)) - others = i18n("Read, "); - - if (info.permission(QFile::WriteOther)) - others += i18n("Write, "); - - if (info.permission(QFile::ExeOther)) - others += i18n("Execute, "); - - if (others.isEmpty()) - others = i18n("Forbidden"); - else - others = others.mid(0, others.count() - 2); - - retString = i18nc("This shows files and folders permissions: user, group and others", "(User: %1) (Group: %2) (Others: %3)", user, group, others); - break; - } - - case KDirModel::Owner: - retString = item.user(); - break; - - case KDirModel::Group: - retString = item.group(); - break; - - case KDirModel::Type: - retString = item.mimeComment(); - break; - -#ifdef HAVE_NEPOMUK - case DolphinModel::Rating: { - const quint32 rating = ratingForIndex(index); - - retString = QString::number(rating); - break; - } - - case DolphinModel::Tags: { - retString = tagsForIndex(index); - - if (retString.isEmpty()) - retString = i18nc("@title:group Tags", "Not yet tagged"); - - break; - } -#endif - } - - return retString; + switch (role) { + case KCategorizedSortFilterProxyModel::CategoryDisplayRole: + return displayRoleData(index); + case KCategorizedSortFilterProxyModel::CategorySortRole: + return sortRoleData(index); + default: + return KDirModel::data(index, role); } - - return KDirModel::data(index, role); } int DolphinModel::columnCount(const QModelIndex &parent) const @@ -251,7 +84,7 @@ quint32 DolphinModel::ratingForIndex(const QModelIndex& index) const DolphinModel* dolphinModel = static_cast(index.model()); KFileItem item = dolphinModel->itemForIndex(index); if (!item.isNull()) { - const Nepomuk::Resource resource(item.url().url(), Nepomuk::NFO::File()); + const Nepomuk::Resource resource(item.url().url(), Soprano::Vocabulary::Xesam::File()); rating = resource.rating(); } return rating; @@ -269,7 +102,7 @@ QString DolphinModel::tagsForIndex(const QModelIndex& index) const DolphinModel* dolphinModel = static_cast(index.model()); KFileItem item = dolphinModel->itemForIndex(index); if (!item.isNull()) { - const Nepomuk::Resource resource(item.url().url(), Nepomuk::NFO::File()); + const Nepomuk::Resource resource(item.url().url(), Soprano::Vocabulary::Xesam::File()); const QList tags = resource.tags(); QStringList stringList; foreach (const Nepomuk::Tag& tag, tags) { @@ -293,3 +126,312 @@ QString DolphinModel::tagsForIndex(const QModelIndex& index) return QString(); #endif } + +QVariant DolphinModel::displayRoleData(const QModelIndex& index) const +{ + QString retString; + + if (!index.isValid()) { + return retString; + } + + const KDirModel *dirModel = qobject_cast(index.model()); + KFileItem item = dirModel->itemForIndex(index); + + switch (index.column()) { + case KDirModel::Name: { + // KDirModel checks columns to know to which role are + // we talking about + const QModelIndex nameIndex = index.model()->index(index.row(), KDirModel::Name, index.parent()); + if (!nameIndex.isValid()) { + return retString; + } + const QVariant data = nameIndex.model()->data(nameIndex, Qt::DisplayRole); + const QString name = data.toString(); + if (!name.isEmpty()) { + if (!item.isHidden() && name.at(0).isLetter()) + retString = name.at(0).toUpper(); + else if (item.isHidden()) { + if (name.at(0) == '.') { + if (name.size() > 1 && name.at(1).isLetter()) { + retString = name.at(1).toUpper(); + } else { + retString = i18nc("@title:group Name", m_others); + } + } else { + retString = name.at(0).toUpper(); + } + } else { + bool validCategory = false; + + const QString str(name.toUpper()); + const QChar* currA = str.unicode(); + while (!currA->isNull() && !validCategory) { + if (currA->isLetter()) { + validCategory = true; + } else if (currA->isDigit()) { + return i18nc("@title:group Name", m_others); + } else { + ++currA; + } + } + + if (!validCategory) { + retString = validCategory ? *currA : i18nc("@title:group Name", m_others); + } else { + retString = *currA; + } + } + } + break; + } + + case KDirModel::Size: { + const KIO::filesize_t fileSize = !item.isNull() ? item.size() : ~0U; + if (!item.isNull() && item.isDir()) { + retString = i18nc("@title:group Size", "Folders"); + } else if (fileSize < 5242880) { + retString = i18nc("@title:group Size", "Small"); + } else if (fileSize < 10485760) { + retString = i18nc("@title:group Size", "Medium"); + } else { + retString = i18nc("@title:group Size", "Big"); + } + break; + } + + case KDirModel::ModifiedTime: { + KDateTime modifiedTime = item.time(KFileItem::ModificationTime); + modifiedTime = modifiedTime.toLocalZone(); + + const QDate currentDate = KDateTime::currentLocalDateTime().date(); + const QDate modifiedDate = modifiedTime.date(); + + const int daysDistance = modifiedDate.daysTo(currentDate); + + int yearForCurrentWeek = 0; + int currentWeek = currentDate.weekNumber(&yearForCurrentWeek); + if (yearForCurrentWeek == currentDate.year() + 1) { + currentWeek = 53; + } + + int yearForModifiedWeek = 0; + int modifiedWeek = modifiedDate.weekNumber(&yearForModifiedWeek); + if (yearForModifiedWeek == modifiedDate.year() + 1) { + modifiedWeek = 53; + } + + if (currentDate.year() == modifiedDate.year() && currentDate.month() == modifiedDate.month()) { + switch (currentWeek - modifiedWeek) { + case 0: + switch (daysDistance) { + case 0: retString = i18nc("@title:group Date", "Today"); break; + case 1: retString = i18nc("@title:group Date", "Yesterday"); break; + default: retString = modifiedTime.toString(i18nc("@title:group The week day name: %A", "%A")); + } + break; + case 1: + retString = i18nc("@title:group Date", "Last Week"); + break; + case 2: + retString = i18nc("@title:group Date", "Two Weeks Ago"); + break; + case 3: + retString = i18nc("@title:group Date", "Three Weeks Ago"); + break; + case 4: + case 5: + retString = i18nc("@title:group Date", "Earlier this Month"); + break; + default: + Q_ASSERT(false); + } + } else { + const QDate lastMonthDate = currentDate.addMonths(-1); + if (lastMonthDate.year() == modifiedDate.year() && lastMonthDate.month() == modifiedDate.month()) { + if (daysDistance == 1) { + retString = modifiedTime.toString(i18nc("@title:group Date: %B is full month name in current locale, and %Y is full year number", "Yesterday (%B, %Y)")); + } else if (daysDistance <= 7) { + retString = modifiedTime.toString(i18nc("@title:group The week day name: %A, %B is full month name in current locale, and %Y is full year number", "%A (%B, %Y)")); + } else if (daysDistance <= 7 * 2) { + retString = modifiedTime.toString(i18nc("@title:group Date: %B is full month name in current locale, and %Y is full year number", "Last Week (%B, %Y)")); + } else if (daysDistance <= 7 * 3) { + retString = modifiedTime.toString(i18nc("@title:group Date: %B is full month name in current locale, and %Y is full year number", "Two Weeks Ago (%B, %Y)")); + } else if (daysDistance <= 7 * 4) { + retString = modifiedTime.toString(i18nc("@title:group Date: %B is full month name in current locale, and %Y is full year number", "Three Weeks Ago (%B, %Y)")); + } else { + retString = modifiedTime.toString(i18nc("@title:group Date: %B is full month name in current locale, and %Y is full year number", "Earlier on %B, %Y")); + } + } else { + retString = modifiedTime.toString(i18nc("@title:group The month and year: %B is full month name in current locale, and %Y is full year number", "%B, %Y")); + } + } + break; + } + + case KDirModel::Permissions: { + QString user; + QString group; + QString others; + + QFileInfo info(item.url().pathOrUrl()); + + // set user string + 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.count() - 2); + + // set group string + 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.count() - 2); + + // set permission string + 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.count() - 2); + + retString = i18nc("@title:group Files and folders by permissions", "(User: %1) (Group: %2) (Others: %3)", user, group, others); + break; + } + + case KDirModel::Owner: + retString = item.user(); + break; + + case KDirModel::Group: + retString = item.group(); + break; + + case KDirModel::Type: + retString = item.mimeComment(); + break; + +#ifdef HAVE_NEPOMUK + case DolphinModel::Rating: { + const quint32 rating = ratingForIndex(index); + retString = QString::number(rating); + break; + } + + case DolphinModel::Tags: { + retString = tagsForIndex(index); + if (retString.isEmpty()) { + retString = i18nc("@title:group Tags", "Not yet tagged"); + } + break; + } +#endif + } + + return retString; +} + +QVariant DolphinModel::sortRoleData(const QModelIndex& index) const +{ + QVariant retVariant; + + if (!index.isValid()) { + return retVariant; + } + + const KDirModel *dirModel = qobject_cast(index.model()); + KFileItem item = dirModel->itemForIndex(index); + + switch (index.column()) { + case KDirModel::Name: { + retVariant = data(index, KCategorizedSortFilterProxyModel::CategoryDisplayRole); + if (retVariant == i18nc("@title:group Name", m_others)) { + // assure that the "Others" group is always the last categorization + retVariant = QString(QChar(QChar::ReplacementCharacter)); + } + break; + } + + case KDirModel::Size: { + const KIO::filesize_t fileSize = !item.isNull() ? item.size() : ~0U; + if (item.isDir()) { + retVariant = 0; + } else if (fileSize < 5242880) { + retVariant = 1; + } else if (fileSize < 10485760) { + retVariant = 2; + } else { + retVariant = 3; + } + break; + } + + case KDirModel::ModifiedTime: { + KDateTime modifiedTime = item.time(KFileItem::ModificationTime); + modifiedTime = modifiedTime.toLocalZone(); + + const QDate currentDate = KDateTime::currentLocalDateTime().date(); + const QDate modifiedDate = modifiedTime.date(); + + retVariant = -modifiedDate.daysTo(currentDate); + break; + } + + case KDirModel::Permissions: { + QFileInfo info(item.url().pathOrUrl()); + + retVariant = -KDirSortFilterProxyModel::pointsForPermissions(info); + break; + } + + case KDirModel::Owner: + retVariant = item.user(); + break; + + case KDirModel::Group: + retVariant = item.group(); + break; + + case KDirModel::Type: + if (item.isDir()) { + retVariant.clear(); // when sorting we want folders to be placed first + } else { + retVariant = item.mimeComment(); + } + break; + +#ifdef HAVE_NEPOMUK + case DolphinModel::Rating: { + retVariant = ratingForIndex(index); + break; + } + + case DolphinModel::Tags: { + retVariant = tagsForIndex(index).count(); + break; + } +#endif + + default: + break; + } + + return retVariant; +}