From fa4680cb38028aceb68d41e1937d27c71d1f121b Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 12 Jul 2009 14:00:45 +0000 Subject: Enable Dolphin to show the revision states of files that are under revision control systems like SVN, Git, CVS, ... The current code is an early draft and it is planned that all plugins (SVN, Git, CVS, ...) are maintained outside Dolphin. If the API is stable enough, a discussion will be done at kfm-devel@kde.org regarding the location of the plugins (the current implementation of SubversionPlugin is only temporary located in Dolphin for testing purposes). RevisionControlObserver is implemented in a way that no recognizable slowdown is given for directories that are not under revision control. CCBUG: 192158 svn path=/trunk/KDE/kdebase/apps/; revision=995351 --- src/dolphinmodel.cpp | 137 +++++++++++++++++++++++---------------------------- 1 file changed, 62 insertions(+), 75 deletions(-) (limited to 'src/dolphinmodel.cpp') diff --git a/src/dolphinmodel.cpp b/src/dolphinmodel.cpp index 819b37d2a..f399c3304 100644 --- a/src/dolphinmodel.cpp +++ b/src/dolphinmodel.cpp @@ -45,13 +45,16 @@ #include #include #include +#include #include #include const char* DolphinModel::m_others = I18N_NOOP2("@title:group Name", "Others"); -DolphinModel::DolphinModel(QObject* parent) - : KDirModel(parent) +DolphinModel::DolphinModel(QObject* parent) : + KDirModel(parent), + m_hasRevisionData(false), + m_revisionHash() { } @@ -59,72 +62,80 @@ DolphinModel::~DolphinModel() { } +bool DolphinModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ + 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; + } + } + + 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; + + case Qt::DisplayRole: + if (index.column() == DolphinModel::Revision) { + switch (m_revisionHash.value(index, LocalRevision)) { + case LatestRevision: + return i18nc("@item::intable", "Latest"); + + case LocalRevision: + default: + return i18nc("@item::intable", "Local"); + } + } + break; + default: - return KDirModel::data(index, role); + break; } -} -int DolphinModel::columnCount(const QModelIndex &parent) const -{ - return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount); + return KDirModel::data(index, role); } -quint32 DolphinModel::ratingForIndex(const QModelIndex& index) +QVariant DolphinModel::headerData(int section, Qt::Orientation orientation, int role) const { -#ifdef HAVE_NEPOMUK - quint32 rating = 0; + if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole)) { + if (section < KDirModel::ColumnCount) { + return KDirModel::headerData(section, orientation, role); + } - 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(); + Q_ASSERT(section == DolphinModel::Revision); + return i18nc("@title::column", "Revision"); } - return rating; -#else - Q_UNUSED(index); - return 0; -#endif + return QVariant(); } -QString DolphinModel::tagsForIndex(const QModelIndex& index) +int DolphinModel::columnCount(const QModelIndex& parent) const { -#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(); - - foreach (const QString& str, stringList) { - tagsString += str; - tagsString += ", "; - } - - if (!tagsString.isEmpty()) { - tagsString.resize(tagsString.size() - 2); - } - } + return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount); +} - return tagsString; -#else - Q_UNUSED(index); - return QString(); -#endif +bool DolphinModel::hasRevisionData() const +{ + return m_hasRevisionData; } QVariant DolphinModel::displayRoleData(const QModelIndex& index) const @@ -328,23 +339,11 @@ QVariant DolphinModel::displayRoleData(const QModelIndex& index) const retString = item.mimeComment(); break; -#ifdef HAVE_NEPOMUK - case DolphinModel::Rating: { - const quint32 rating = ratingForIndex(index); - retString = QString::number(rating); + case DolphinModel::Revision: + retString = "test"; break; } - case DolphinModel::Tags: { - retString = tagsForIndex(index); - if (retString.isEmpty()) { - retString = i18nc("@title:group Tags", "Not yet tagged"); - } - break; - } -#endif - } - return retString; } @@ -418,18 +417,6 @@ QVariant DolphinModel::sortRoleData(const QModelIndex& index) const } break; -#ifdef HAVE_NEPOMUK - case DolphinModel::Rating: { - retVariant = ratingForIndex(index); - break; - } - - case DolphinModel::Tags: { - retVariant = tagsForIndex(index).count(); - break; - } -#endif - default: break; } -- cgit v1.3