X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f64141a6d15e9c598440b7e5c4022714def6e448..c2d9d9becaf4267f03685e70233c1335f22d1c0d:/src/dolphinmodel.cpp diff --git a/src/dolphinmodel.cpp b/src/dolphinmodel.cpp index fad2dd781..1b94e0339 100644 --- a/src/dolphinmodel.cpp +++ b/src/dolphinmodel.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #endif #include @@ -47,6 +48,8 @@ #include #include +static const char *others = I18N_NOOP2("@title:group Name", "Others"); + DolphinModel::DolphinModel(QObject *parent) : KDirModel(parent) { @@ -58,22 +61,18 @@ DolphinModel::~DolphinModel() QVariant DolphinModel::data(const QModelIndex &index, int role) const { - if (role == KCategorizedSortFilterProxyModel::CategoryDisplayRole) - { + if (role == KCategorizedSortFilterProxyModel::CategoryDisplayRole) { QString retString; - if (!index.isValid()) - { + if (!index.isValid()) { return retString; } const KDirModel *dirModel = qobject_cast(index.model()); KFileItem item = dirModel->itemForIndex(index); - switch (index.column()) - { - case KDirModel::Name: - { + 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(), @@ -83,41 +82,41 @@ QVariant DolphinModel::data(const QModelIndex &index, int role) const 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 - { + 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", others); + } + } else { + retString = name.at(0).toUpper(); + } + } else { bool validCategory = false; - const QString str(data.toString().toUpper()); + const QString str(name.toUpper()); const QChar* currA = str.unicode(); while (!currA->isNull() && !validCategory) { - if (currA->isLetter()) + if (currA->isLetter()) { validCategory = true; - else if (currA->isDigit()) - return i18nc("@title:group", "Others"); - else + } else if (currA->isDigit()) { + return i18nc("@title:group Name", others); + } else { ++currA; + } } - if (!validCategory) - retString = i18nc("@title:group Name", "Others"); - else + if (!validCategory) { + retString = validCategory ? *currA : i18nc("@title:group Name", others); + } else { retString = *currA; + } } } break; @@ -137,8 +136,7 @@ QVariant DolphinModel::data(const QModelIndex &index, int role) const break; } - case KDirModel::ModifiedTime: - { + case KDirModel::ModifiedTime: { KDateTime modifiedTime; modifiedTime.setTime_t(item.time(KIO::UDSEntry::UDS_MODIFICATION_TIME)); modifiedTime = modifiedTime.toLocalZone(); @@ -147,8 +145,7 @@ QVariant DolphinModel::data(const QModelIndex &index, int role) const break; } - case KDirModel::Permissions: - { + case KDirModel::Permissions: { QString user; QString group; QString others; @@ -224,9 +221,9 @@ QVariant DolphinModel::data(const QModelIndex &index, int role) const case DolphinModel::Tags: { retString = tagsForIndex(index); - if (retString.isEmpty()) + if (retString.isEmpty()) { retString = i18nc("@title:group Tags", "Not yet tagged"); - + } break; } #endif @@ -234,13 +231,10 @@ QVariant DolphinModel::data(const QModelIndex &index, int role) const return retString; } - else if (role == KCategorizedSortFilterProxyModel::CategorySortRole) - { -#if 0 + else if (role == KCategorizedSortFilterProxyModel::CategorySortRole) { QVariant retVariant; - if (!index.isValid()) - { + if (!index.isValid()) { return retVariant; } @@ -249,144 +243,68 @@ QVariant DolphinModel::data(const QModelIndex &index, int role) const switch (index.column()) { case KDirModel::Name: { - bool leftFileNameStartsByLetter = false; - const QString str(leftFileItem.name().toUpper()); - const QChar* currA = str.unicode(); - while (!currA->isNull() && !leftFileNameStartsByLetter) { - if (currA->isLetter()) - leftFileNameStartsByLetter = true; - else if (currA->isDigit()) { - break; - } else - ++currA; - } - - bool rightFileNameStartsByLetter = false; - const QString strb(rightFileItem.name().toUpper()); - const QChar *currB = strb.unicode(); - while (!currB->isNull() && !rightFileNameStartsByLetter) { - if (currB->isLetter()) - rightFileNameStartsByLetter = true; - else if (currB->isDigit()) { - break; - } else - ++currB; - } - - if (!rightFileNameStartsByLetter) - return -1; + retVariant = data(index, KCategorizedSortFilterProxyModel::CategoryDisplayRole); - if (!leftFileNameStartsByLetter && rightFileNameStartsByLetter) - return 1; + if (retVariant == i18nc("@title:group Name", others)) + retVariant = QString(QChar(QChar::ReplacementCharacter)); - return naturalCompare(*currA, *currB); + break; } case KDirModel::Size: { - // If we are sorting by size, show folders first. We will sort them - // correctly later. - if (leftFileItem.isDir() && !rightFileItem.isDir()) { - return -1; - } - - if (!leftFileItem.isDir() && rightFileItem.isDir()) { - return 1; - } - - if (leftFileItem.isDir() && rightFileItem.isDir()) { - return 0; - } - - const int leftFileSize = !leftFileItem.isNull() ? leftFileItem.size() : -1; - const int rightFileSize = !rightFileItem.isNull() ? rightFileItem.size() : -1; - int leftGroup; - int rightGroup; - - if (leftFileSize < 5242880) { - leftGroup = 0; - } else if (leftFileSize < 10485760) { - leftGroup = 1; + 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 { - leftGroup = 2; + retVariant = 3; } - - if (rightFileSize < 5242880) { - rightGroup = 0; - } else if (rightFileSize < 10485760) { - rightGroup = 1; - } else { - rightGroup = 2; - } - - return leftGroup - rightGroup; + break; } case KDirModel::ModifiedTime: { - KDateTime leftTime = leftFileItem.time(KFileItem::ModificationTime); - KDateTime rightTime = rightFileItem.time(KFileItem::ModificationTime); - - if ((leftTime.date().year() == rightTime.date().year()) && - (leftTime.date().month() == rightTime.date().month())) { - return 0; - } + KDateTime modifiedTime; + modifiedTime.setTime_t(item.time(KIO::UDSEntry::UDS_MODIFICATION_TIME)); + modifiedTime = modifiedTime.toLocalZone(); - if (leftTime > rightTime) { - return 1; - } - - return -1; + retVariant = -(modifiedTime.date().year() * 100 + modifiedTime.date().month()); + break; } case KDirModel::Permissions: { - QFileInfo leftFileInfo(leftFileItem.url().pathOrUrl()); - QFileInfo rightFileInfo(rightFileItem.url().pathOrUrl()); + QFileInfo info(item.url().pathOrUrl()); - int leftPermissionsPoints = pointsForPermissions(leftFileInfo); - int rightPermissionsPoints = pointsForPermissions(rightFileInfo); - - return leftPermissionsPoints - rightPermissionsPoints; - } - - case KDirModel::Owner: { - return naturalCompare(leftFileItem.user().toLower(), - rightFileItem.user().toLower()); + retVariant = -KDirSortFilterProxyModel::pointsForPermissions(info); + break; } - case KDirModel::Group: { - return naturalCompare(leftFileItem.group().toLower(), - rightFileItem.group().toLower()); - } + case KDirModel::Owner: + retVariant = item.user(); + break; - case KDirModel::Type: { - // If we are sorting by size, show folders first. We will sort them - // correctly later. - if (leftFileItem.isDir() && !rightFileItem.isDir()) { - return -1; - } else if (!leftFileItem.isDir() && rightFileItem.isDir()) { - return 1; - } + case KDirModel::Group: + retVariant = item.group(); + break; - return naturalCompare(leftFileItem.mimeComment().toLower(), - rightFileItem.mimeComment().toLower()); - } + case KDirModel::Type: + if (item.isDir()) + retVariant = QString(); // when sorting we want folders to be placed first + else + retVariant = item.mimeComment(); + break; #ifdef HAVE_NEPOMUK - case DolphinView::SortByRating: { - const qint32 leftRating = DolphinModel::ratingForIndex(left); - const qint32 rightRating = DolphinModel::ratingForIndex(right); - return leftRating - rightRating; + case DolphinModel::Rating: { + retVariant = ratingForIndex(index); + break; } - case DolphinView::SortByTags: { - const QString leftTags = DolphinModel::tagsForIndex(left); - const QString rightTags = DolphinModel::tagsForIndex(right); - - if (leftTags.isEmpty() && !rightTags.isEmpty()) - return 1; - else if (!leftTags.isEmpty() && rightTags.isEmpty()) - return -1; - - return naturalCompare(DolphinModel::tagsForIndex(left), DolphinModel::tagsForIndex(right)) < 0; + case DolphinModel::Tags: { + retVariant = tagsForIndex(index).count(); + break; } #endif @@ -394,180 +312,8 @@ QVariant DolphinModel::data(const QModelIndex &index, int role) const break; } -#endif - 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; + return retVariant; } return KDirModel::data(index, role); @@ -586,7 +332,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; @@ -604,7 +350,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) {