X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/6c9ac61e3ca5840560e22f9e5847bfb224024ef0..7c539fd12f5decbfafbea5fa4c317e7c4d753691:/src/dolphinmodel.cpp diff --git a/src/dolphinmodel.cpp b/src/dolphinmodel.cpp index 525c8a4fd..f37452c80 100644 --- a/src/dolphinmodel.cpp +++ b/src/dolphinmodel.cpp @@ -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,312 +59,379 @@ DolphinModel::~DolphinModel() { } -QVariant DolphinModel::data(const QModelIndex &index, int role) const +QVariant DolphinModel::data(const QModelIndex& index, int role) const { - if (role == KCategorizedSortFilterProxyModel::CategoryDisplayRole) { - QString retString; - - if (!index.isValid()) { - return retString; - } - - const KDirModel *dirModel = qobject_cast(index.model()); - KFileItem item = dirModel->itemForIndex(index); + switch (role) { + case KCategorizedSortFilterProxyModel::CategoryDisplayRole: + return displayRoleData(index); + case KCategorizedSortFilterProxyModel::CategorySortRole: + return sortRoleData(index); + default: + return KDirModel::data(index, role); + } +} - 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()); +int DolphinModel::columnCount(const QModelIndex &parent) const +{ + return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount); +} - if (!theIndex.isValid()) { - return retString; - } - QVariant data = theIndex.model()->data(theIndex, Qt::DisplayRole); - 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(data.size() > 1 && name.at(1).isLetter()) - retString = name.at(1).toUpper(); - else - retString = i18nc("@title:group Name", "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", "Others"); - else - ++currA; - } - - if (!validCategory) - retString = i18nc("@title:group Name", "Others"); - else - retString = *currA; - } - } - break; - } +quint32 DolphinModel::ratingForIndex(const QModelIndex& index) +{ +#ifdef HAVE_NEPOMUK + quint32 rating = 0; - 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; - } + const DolphinModel* dolphinModel = static_cast(index.model()); + KFileItem item = dolphinModel->itemForIndex(index); + if (!item.isNull()) { + const Nepomuk::Resource resource(item.url().url(), Soprano::Vocabulary::Xesam::File()); + rating = resource.rating(); + } + return rating; +#else + Q_UNUSED(index); + return 0; +#endif +} - case KDirModel::ModifiedTime: { - KDateTime modifiedTime; - modifiedTime.setTime_t(item.time(KIO::UDSEntry::UDS_MODIFICATION_TIME)); - modifiedTime = modifiedTime.toLocalZone(); +QString DolphinModel::tagsForIndex(const QModelIndex& index) +{ +#ifdef HAVE_NEPOMUK + QString tagsString; - 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; - } + const DolphinModel* dolphinModel = static_cast(index.model()); + KFileItem item = dolphinModel->itemForIndex(index); + if (!item.isNull()) { + const Nepomuk::Resource resource(item.url().url(), Soprano::Vocabulary::Xesam::File()); + const QList tags = resource.tags(); + QStringList stringList; + foreach (const Nepomuk::Tag& tag, tags) { + stringList.append(tag.label()); + } + stringList.sort(); - case KDirModel::Permissions: { - QString user; - QString group; - QString others; + foreach (const QString& str, stringList) { + tagsString += str; + tagsString += ", "; + } - QFileInfo info(item.url().pathOrUrl()); + if (!tagsString.isEmpty()) { + tagsString.resize(tagsString.size() - 2); + } + } - if (info.permission(QFile::ReadUser)) - user = i18n("Read, "); + return tagsString; +#else + Q_UNUSED(index); + return QString(); +#endif +} - if (info.permission(QFile::WriteUser)) - user += i18n("Write, "); +QVariant DolphinModel::displayRoleData(const QModelIndex& index) const +{ + QString retString; - if (info.permission(QFile::ExeUser)) - user += i18n("Execute, "); + if (!index.isValid()) { + return retString; + } - if (user.isEmpty()) - user = i18n("Forbidden"); - else - user = user.mid(0, user.count() - 2); + const KDirModel *dirModel = qobject_cast(index.model()); + KFileItem item = dirModel->itemForIndex(index); - if (info.permission(QFile::ReadGroup)) - group = i18n("Read, "); + 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 (info.permission(QFile::WriteGroup)) - group += i18n("Write, "); + if (!validCategory) { + retString = validCategory ? *currA : i18nc("@title:group Name", m_others); + } else { + retString = *currA; + } + } + } + break; + } - if (info.permission(QFile::ExeGroup)) - group += i18n("Execute, "); + 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; + } - if (group.isEmpty()) - group = i18n("Forbidden"); - else - group = group.mid(0, group.count() - 2); + case KDirModel::ModifiedTime: { + KDateTime modifiedTime = item.time(KFileItem::ModificationTime); + modifiedTime = modifiedTime.toLocalZone(); - if (info.permission(QFile::ReadOther)) - others = i18n("Read, "); + const QDate currentDate = KDateTime::currentLocalDateTime().date(); + const QDate modifiedDate = modifiedTime.date(); - if (info.permission(QFile::WriteOther)) - others += i18n("Write, "); + const int daysDistance = modifiedDate.daysTo(currentDate); - if (info.permission(QFile::ExeOther)) - others += i18n("Execute, "); + int yearForCurrentWeek = 0; + int currentWeek = currentDate.weekNumber(&yearForCurrentWeek); + if (yearForCurrentWeek == currentDate.year() + 1) { + currentWeek = 53; + } - if (others.isEmpty()) - others = i18n("Forbidden"); - else - others = others.mid(0, others.count() - 2); + int yearForModifiedWeek = 0; + int modifiedWeek = modifiedDate.weekNumber(&yearForModifiedWeek); + if (yearForModifiedWeek == modifiedDate.year() + 1) { + modifiedWeek = 53; + } - retString = i18nc("This shows files and folders permissions: user, group and others", "(User: %1) (Group: %2) (Others: %3)", user, group, others); + 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 KDirModel::Owner: - retString = item.user(); + case 1: + retString = i18nc("@title:group Date", "Last Week"); break; - - case KDirModel::Group: - retString = item.group(); + case 2: + retString = i18nc("@title:group Date", "Two Weeks Ago"); break; - - case KDirModel::Type: - retString = item.mimeComment(); + case 3: + retString = i18nc("@title:group Date", "Three Weeks Ago"); break; - -#ifdef HAVE_NEPOMUK - case DolphinModel::Rating: { - const quint32 rating = ratingForIndex(index); - - retString = QString::number(rating); + case 4: + case 5: + retString = i18nc("@title:group Date", "Earlier this Month"); break; + default: + Q_ASSERT(false); } - - case DolphinModel::Tags: { - retString = tagsForIndex(index); - - if (retString.isEmpty()) - retString = i18nc("@title:group Tags", "Not yet tagged"); - - break; + } 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")); } -#endif } - - return retString; + break; } - else if (role == KCategorizedSortFilterProxyModel::CategorySortRole) { - QVariant retVariant; - if (!index.isValid()) { - return retVariant; - } + case KDirModel::Permissions: { + QString user; + QString group; + QString others; - const KDirModel *dirModel = qobject_cast(index.model()); - KFileItem item = dirModel->itemForIndex(index); + QFileInfo info(item.url().pathOrUrl()); - switch (index.column()) { - case KDirModel::Name: { - retVariant = data(index, KCategorizedSortFilterProxyModel::CategoryDisplayRole); - break; + // set user string + if (info.permission(QFile::ReadUser)) { + user = i18nc("@item:intext Access permission, concatenated", "Read, "); } - - case KDirModel::Size: { - const int fileSize = !item.isNull() ? item.size() : -1; - if (item.isDir()) { - retVariant = 0; - } else if (fileSize < 5242880) { - retVariant = 1; - } else if (fileSize < 10485760) { - retVariant = 2; - } else { - retVariant = 3; - } - break; + if (info.permission(QFile::WriteUser)) { + user += i18nc("@item:intext Access permission, concatenated", "Write, "); } - - case KDirModel::ModifiedTime: { - KDateTime modifiedTime; - modifiedTime.setTime_t(item.time(KIO::UDSEntry::UDS_MODIFICATION_TIME)); - modifiedTime = modifiedTime.toLocalZone(); - - retVariant = modifiedTime.date().year() * 100 + modifiedTime.date().month(); - break; + 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); - case KDirModel::Permissions: { - QFileInfo info(item.url().pathOrUrl()); + // 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); - retVariant = -KDirSortFilterProxyModel::pointsForPermissions(info); - break; + // 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: - retVariant = item.user(); - break; + case KDirModel::Owner: + retString = item.user(); + break; - case KDirModel::Group: - retVariant = item.group(); - break; + case KDirModel::Group: + retString = item.group(); + break; - case KDirModel::Type: - if (item.isDir()) - retVariant = QString(); // when sorting we want folders to be placed first - else - retVariant = item.mimeComment(); - break; + case KDirModel::Type: + retString = item.mimeComment(); + break; #ifdef HAVE_NEPOMUK - case DolphinModel::Rating: { - retVariant = ratingForIndex(index); - break; - } + case DolphinModel::Rating: { + const quint32 rating = ratingForIndex(index); + retString = QString::number(rating); + break; + } - case DolphinModel::Tags: { - retVariant = tagsForIndex(index).count(); - break; + case DolphinModel::Tags: { + retString = tagsForIndex(index); + if (retString.isEmpty()) { + retString = i18nc("@title:group Tags", "Not yet tagged"); } + break; + } #endif + } - default: - break; + return retString; +} - } +QVariant DolphinModel::sortRoleData(const QModelIndex& index) const +{ + QVariant retVariant; + if (!index.isValid()) { return retVariant; } - return KDirModel::data(index, role); -} + const KDirModel *dirModel = qobject_cast(index.model()); + KFileItem item = dirModel->itemForIndex(index); -int DolphinModel::columnCount(const QModelIndex &parent) const -{ - return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount); -} + 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; + } -quint32 DolphinModel::ratingForIndex(const QModelIndex& index) -{ -#ifdef HAVE_NEPOMUK - quint32 rating = 0; + 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; + } - 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()); - rating = resource.rating(); + 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; } - return rating; -#else - Q_UNUSED(index); - return 0; -#endif -} -QString DolphinModel::tagsForIndex(const QModelIndex& index) -{ -#ifdef HAVE_NEPOMUK - QString tagsString; + case KDirModel::Permissions: { + QFileInfo info(item.url().pathOrUrl()); - 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 QList tags = resource.tags(); - QStringList stringList; - foreach (const Nepomuk::Tag& tag, tags) { - stringList.append(tag.label()); - } - stringList.sort(); + retVariant = -KDirSortFilterProxyModel::pointsForPermissions(info); + break; + } - foreach (const QString& str, stringList) { - tagsString += str; - tagsString += ", "; - } + case KDirModel::Owner: + retVariant = item.user(); + break; - if (!tagsString.isEmpty()) { - tagsString.resize(tagsString.size() - 2); + 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; } - return tagsString; -#else - Q_UNUSED(index); - return QString(); + case DolphinModel::Tags: { + retVariant = tagsForIndex(index).count(); + break; + } #endif + + default: + break; + } + + return retVariant; }