X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/0fc7e4af53e6f97c42fbd9df43ba80ff185600fb..fa4680cb38028aceb68d41e1937d27c71d1f121b:/src/dolphinmodel.cpp diff --git a/src/dolphinmodel.cpp b/src/dolphinmodel.cpp index f541fe20c..f399c3304 100644 --- a/src/dolphinmodel.cpp +++ b/src/dolphinmodel.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #endif #include @@ -44,11 +45,16 @@ #include #include #include +#include #include #include -DolphinModel::DolphinModel(QObject *parent) - : KDirModel(parent) +const char* DolphinModel::m_others = I18N_NOOP2("@title:group Name", "Others"); + +DolphinModel::DolphinModel(QObject* parent) : + KDirModel(parent), + m_hasRevisionData(false), + m_revisionHash() { } @@ -56,316 +62,364 @@ DolphinModel::~DolphinModel() { } -QVariant DolphinModel::data(const QModelIndex &index, int role) const +bool DolphinModel::setData(const QModelIndex& index, const QVariant& value, int role) { - if (role == KCategorizedSortFilterProxyModel::CategoryDisplayRole) - { - QString retString; + if ((index.column() == DolphinModel::Revision) && (role == Qt::DecorationRole)) { + // TODO: remove data again when items are deleted... + + const QPersistentModelIndex key = index; + const RevisionState state = static_cast(value.toInt()); + if (m_revisionHash.value(key, LocalRevision) != state) { + m_hasRevisionData = true; + m_revisionHash.insert(key, state); + emit dataChanged(index, index); + return true; + } + } - if (!index.isValid()) - { - return retString; + return KDirModel::setData(index, value, role); +} + +QVariant DolphinModel::data(const QModelIndex& index, int role) const +{ + switch (role) { + case KCategorizedSortFilterProxyModel::CategoryDisplayRole: + return displayRoleData(index); + + case KCategorizedSortFilterProxyModel::CategorySortRole: + return sortRoleData(index); + + case Qt::DecorationRole: + if (index.column() == DolphinModel::Revision) { + return m_revisionHash.value(index, LocalRevision); } + break; - 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; - } + case Qt::DisplayRole: + if (index.column() == DolphinModel::Revision) { + switch (m_revisionHash.value(index, LocalRevision)) { + case LatestRevision: + return i18nc("@item::intable", "Latest"); - 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 LocalRevision: + default: + return i18nc("@item::intable", "Local"); } + } + 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; - } + default: + break; + } - case KDirModel::ModifiedTime: - { - KDateTime modifiedTime; - modifiedTime.setTime_t(item.time(KIO::UDSEntry::UDS_MODIFICATION_TIME)); - modifiedTime = modifiedTime.toLocalZone(); + return KDirModel::data(index, role); +} - 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; - } +QVariant DolphinModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole)) { + if (section < KDirModel::ColumnCount) { + return KDirModel::headerData(section, orientation, role); + } - case KDirModel::Permissions: - { - QString user; - QString group; - QString others; + Q_ASSERT(section == DolphinModel::Revision); + return i18nc("@title::column", "Revision"); + } + return QVariant(); +} - QFileInfo info(item.url().pathOrUrl()); +int DolphinModel::columnCount(const QModelIndex& parent) const +{ + return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount); +} - if (info.permission(QFile::ReadUser)) - user = i18n("Read, "); +bool DolphinModel::hasRevisionData() const +{ + return m_hasRevisionData; +} - 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; - retVariant = fileSize; - break; + 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); - case KDirModel::ModifiedTime: - { - KDateTime modifiedTime; - modifiedTime.setTime_t(item.time(KIO::UDSEntry::UDS_MODIFICATION_TIME)); - modifiedTime = modifiedTime.toLocalZone(); + // 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 = modifiedTime.date().year() * 100 + modifiedTime.date().month(); - 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); - case KDirModel::Permissions: - { - QFileInfo info(item.url().pathOrUrl()); + retString = i18nc("@title:group Files and folders by permissions", "(User: %1) (Group: %2) (Others: %3)", user, group, others); + break; + } - retVariant = -KDirSortFilterProxyModel::pointsForPermissions(info); - break; - } + case KDirModel::Owner: + retString = item.user(); + break; - case KDirModel::Owner: - retVariant = item.user(); - break; + case KDirModel::Group: + retString = item.group(); + break; - case KDirModel::Group: - retVariant = item.group(); - break; + case KDirModel::Type: + retString = item.mimeComment(); + break; - case KDirModel::Type: - if (item.isDir()) - retVariant = QString(); // when sorting we want folders to be placed first - else - retVariant = item.mimeComment(); - break; + case DolphinModel::Revision: + retString = "test"; + break; + } -#ifdef HAVE_NEPOMUK - case DolphinModel::Rating: { - retVariant = ratingForIndex(index); - break; - } + return retString; +} - case DolphinModel::Tags: { - retVariant = tagsForIndex(index).count(); - break; - } -#endif +QVariant DolphinModel::sortRoleData(const QModelIndex& index) const +{ + QVariant retVariant; + + if (!index.isValid()) { + return retVariant; + } - default: - break; + 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; + } - return retVariant; + 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; } - return KDirModel::data(index, role); -} + case KDirModel::ModifiedTime: { + KDateTime modifiedTime = item.time(KFileItem::ModificationTime); + modifiedTime = modifiedTime.toLocalZone(); -int DolphinModel::columnCount(const QModelIndex &parent) const -{ - return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount); -} + const QDate currentDate = KDateTime::currentLocalDateTime().date(); + const QDate modifiedDate = modifiedTime.date(); -quint32 DolphinModel::ratingForIndex(const QModelIndex& index) -{ -#ifdef HAVE_NEPOMUK - quint32 rating = 0; + retVariant = -modifiedDate.daysTo(currentDate); + 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::Permissions: { + QFileInfo info(item.url().pathOrUrl()); + + retVariant = -KDirSortFilterProxyModel::pointsForPermissions(info); + break; } - return rating; -#else - Q_UNUSED(index); - return 0; -#endif -} -QString DolphinModel::tagsForIndex(const QModelIndex& index) -{ -#ifdef HAVE_NEPOMUK - QString tagsString; - - 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(); + case KDirModel::Owner: + retVariant = item.user(); + break; - foreach (const QString& str, stringList) { - tagsString += str; - tagsString += ", "; - } + case KDirModel::Group: + retVariant = item.group(); + break; - if (!tagsString.isEmpty()) { - tagsString.resize(tagsString.size() - 2); + case KDirModel::Type: + if (item.isDir()) { + // when sorting we want folders to be placed first + retVariant = QString(); // krazy:exclude=nullstrassign + } else { + retVariant = item.mimeComment(); } + break; + + default: + break; } - return tagsString; -#else - Q_UNUSED(index); - return QString(); -#endif + return retVariant; }