X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/3d4e6938f57fcf010b4fda7255384098327eb67d..06fb789c2b7c435dce7cf1ff11bf045f3ebc84bf:/src/dolphinmodel.cpp diff --git a/src/dolphinmodel.cpp b/src/dolphinmodel.cpp index b0e5ef5c4..137274e0d 100644 --- a/src/dolphinmodel.cpp +++ b/src/dolphinmodel.cpp @@ -24,14 +24,6 @@ #include "kcategorizedview.h" -#include -#ifdef HAVE_NEPOMUK -#include -#include -#include -#include -#endif - #include #include #include @@ -45,330 +37,409 @@ #include #include #include +#include #include #include -static const char *others = I18N_NOOP2("@title:group Name", "Others"); +const char* const DolphinModel::m_others = I18N_NOOP2("@title:group Name", "Others"); -DolphinModel::DolphinModel(QObject *parent) - : KDirModel(parent) +DolphinModel::DolphinModel(QObject* parent) : + KDirModel(parent), + m_hasVersionData(false), + m_revisionHash() { + setJobTransfersVisible(true); } 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::Version) && (role == Qt::DecorationRole)) { + // TODO: remove data again when items are deleted... + + const QPersistentModelIndex key = index; + const KVersionControlPlugin::VersionState state = static_cast(value.toInt()); + if (m_revisionHash.value(key, KVersionControlPlugin::UnversionedVersion) != state) { + if (!m_hasVersionData) { + connect(this, SIGNAL(rowsRemoved (const QModelIndex&, int, int)), + this, SLOT(slotRowsRemoved(const QModelIndex&, int, int))); + m_hasVersionData = true; + } - if (!index.isValid()) { - return retString; + m_revisionHash.insert(key, state); + emit dataChanged(index, index); + return true; } + } - 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); - 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(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", others); - } else { - ++currA; - } - } - - if (!validCategory) { - retString = validCategory ? *currA : 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; - } + return KDirModel::setData(index, value, role); +} - case KDirModel::ModifiedTime: { - KDateTime modifiedTime = item.time(KFileItem::ModificationTime); - modifiedTime = modifiedTime.toLocalZone(); +QVariant DolphinModel::data(const QModelIndex& index, int role) const +{ + switch (role) { + case KCategorizedSortFilterProxyModel::CategoryDisplayRole: + return displayRoleData(index); - 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 KCategorizedSortFilterProxyModel::CategorySortRole: + return sortRoleData(index); - case KDirModel::Permissions: { - QString user; - QString group; - QString others; + case Qt::DecorationRole: + if (index.column() == DolphinModel::Version) { + return m_revisionHash.value(index, KVersionControlPlugin::UnversionedVersion); + } + break; - QFileInfo info(item.url().pathOrUrl()); + case Qt::DisplayRole: + switch (index.column()) { + case DolphinModel::LinkDest: { + const KDirModel *dirModel = qobject_cast(index.model()); + const KFileItem item = dirModel->itemForIndex(index); + return item.linkDest(); + } - if (info.permission(QFile::ReadUser)) - user = i18n("Read, "); + case DolphinModel::LocalPathOrUrl: + const KDirModel *dirModel = qobject_cast(index.model()); + const KFileItem item = dirModel->itemForIndex(index); + return item.localPath(); + break; + } + break; - if (info.permission(QFile::WriteUser)) - user += i18n("Write, "); + default: + break; + } - if (info.permission(QFile::ExeUser)) - user += i18n("Execute, "); + return KDirModel::data(index, role); +} - if (user.isEmpty()) - user = i18n("Forbidden"); - else - user = user.mid(0, user.count() - 2); +QVariant DolphinModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole)) { + switch (section) { + case DolphinModel::LinkDest: + return i18nc("@title::column", "Link Destination"); + case DolphinModel::LocalPathOrUrl: + return i18nc("@title::column", "Path"); + default: + return KDirModel::headerData(section, orientation, role); + } + } + return QVariant(); +} - if (info.permission(QFile::ReadGroup)) - group = i18n("Read, "); +int DolphinModel::columnCount(const QModelIndex& parent) const +{ + return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount); +} - if (info.permission(QFile::WriteGroup)) - group += i18n("Write, "); +void DolphinModel::clearVersionData() +{ + m_revisionHash.clear(); + m_hasVersionData = false; +} - if (info.permission(QFile::ExeGroup)) - group += i18n("Execute, "); +bool DolphinModel::hasVersionData() const +{ + return m_hasVersionData; +} - if (group.isEmpty()) - group = i18n("Forbidden"); - else - group = group.mid(0, group.count() - 2); +void DolphinModel::slotRowsRemoved(const QModelIndex& parent, int start, int end) +{ + if (m_hasVersionData) { + const int column = parent.column(); + for (int row = start; row <= end; ++row) { + m_revisionHash.remove(parent.child(row, column)); + } + } +} - if (info.permission(QFile::ReadOther)) - others = i18n("Read, "); +QVariant DolphinModel::displayRoleData(const QModelIndex& index) const +{ + QString retString; - if (info.permission(QFile::WriteOther)) - others += i18n("Write, "); + if (!index.isValid()) { + return retString; + } - if (info.permission(QFile::ExeOther)) - others += i18n("Execute, "); + const KDirModel *dirModel = qobject_cast(index.model()); + KFileItem item = dirModel->itemForIndex(index); - if (others.isEmpty()) - others = i18n("Forbidden"); - else - others = others.mid(0, others.count() - 2); + 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; + } + } - retString = i18nc("This shows files and folders permissions: user, group and others", "(User: %1) (Group: %2) (Others: %3)", user, group, others); - break; + retString = validCategory ? *currA : i18nc("@title:group Name", m_others); } + } + break; + } - case KDirModel::Owner: - retString = item.user(); - 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::Group: - retString = item.group(); - break; + case KDirModel::ModifiedTime: { + KDateTime modifiedTime = item.time(KFileItem::ModificationTime); + modifiedTime = modifiedTime.toLocalZone(); - case KDirModel::Type: - retString = item.mimeComment(); - break; + const QDate currentDate = KDateTime::currentLocalDateTime().date(); + const QDate modifiedDate = modifiedTime.date(); -#ifdef HAVE_NEPOMUK - case DolphinModel::Rating: { - const quint32 rating = ratingForIndex(index); + const int daysDistance = modifiedDate.daysTo(currentDate); - retString = QString::number(rating); - break; - } + int yearForCurrentWeek = 0; + int currentWeek = currentDate.weekNumber(&yearForCurrentWeek); + if (yearForCurrentWeek == currentDate.year() + 1) { + currentWeek = 53; + } - case DolphinModel::Tags: { - retString = tagsForIndex(index); + int yearForModifiedWeek = 0; + int modifiedWeek = modifiedDate.weekNumber(&yearForModifiedWeek); + if (yearForModifiedWeek == modifiedDate.year() + 1) { + modifiedWeek = 53; + } - if (retString.isEmpty()) { - retString = i18nc("@title:group Tags", "Not yet tagged"); + if (currentDate.year() == modifiedDate.year() && currentDate.month() == modifiedDate.month()) { + if (modifiedWeek > currentWeek) { + // use case: modified date = 2010-01-01, current date = 2010-01-22 + // modified week = 53, current week = 3 + modifiedWeek = 0; + } + 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")); } -#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); - - if (retVariant == i18nc("@title:group Name", others)) - retVariant = QString(QChar(QChar::ReplacementCharacter)); + // 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); - break; + // 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); - 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; + // 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::ModifiedTime: { - KDateTime modifiedTime = item.time(KFileItem::ModificationTime); - modifiedTime = modifiedTime.toLocalZone(); + retString = i18nc("@title:group Files and folders by permissions", "(User: %1) (Group: %2) (Others: %3)", user, group, others); + break; + } - retVariant = -(modifiedTime.date().year() * 100 + modifiedTime.date().month()); - break; - } + case KDirModel::Owner: + retString = item.user(); + break; - case KDirModel::Permissions: { - QFileInfo info(item.url().pathOrUrl()); + case KDirModel::Group: + retString = item.group(); + break; - retVariant = -KDirSortFilterProxyModel::pointsForPermissions(info); - break; - } + case KDirModel::Type: + retString = item.mimeComment(); + break; - case KDirModel::Owner: - retVariant = item.user(); - break; + case DolphinModel::Version: + retString = "test"; + break; + } - case KDirModel::Group: - retVariant = item.group(); - break; + return retString; +} - case KDirModel::Type: - if (item.isDir()) - retVariant = QString(); // when sorting we want folders to be placed first - else - retVariant = item.mimeComment(); - break; +QVariant DolphinModel::sortRoleData(const QModelIndex& index) const +{ + QVariant retVariant; -#ifdef HAVE_NEPOMUK - case DolphinModel::Rating: { - retVariant = ratingForIndex(index); - break; + 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('Z').append(QChar::ReplacementCharacter); } + break; + } - case DolphinModel::Tags: { - retVariant = tagsForIndex(index).count(); - 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; } -#endif + break; + } - default: - break; + case KDirModel::ModifiedTime: { + KDateTime modifiedTime = item.time(KFileItem::ModificationTime); + modifiedTime = modifiedTime.toLocalZone(); - } + const QDate currentDate = KDateTime::currentLocalDateTime().date(); + const QDate modifiedDate = modifiedTime.date(); - return retVariant; + retVariant = -modifiedDate.daysTo(currentDate); + break; } - return KDirModel::data(index, role); -} - -int DolphinModel::columnCount(const QModelIndex &parent) const -{ - return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount); -} + case KDirModel::Permissions: { + QFileInfo info(item.url().pathOrUrl()); -quint32 DolphinModel::ratingForIndex(const QModelIndex& index) -{ -#ifdef HAVE_NEPOMUK - quint32 rating = 0; - - 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(); + 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(), 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::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; }