┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/dolphinmodel.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2009-07-12 14:00:45 +0000
committerPeter Penz <[email protected]>2009-07-12 14:00:45 +0000
commitfa4680cb38028aceb68d41e1937d27c71d1f121b (patch)
treeda709625c38a42bf448077d985c75b0365a58252 /src/dolphinmodel.cpp
parent2df2d4ea7ee63a43a327b4ffb1c5cddd176aff91 (diff)
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 [email protected] 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
Diffstat (limited to 'src/dolphinmodel.cpp')
-rw-r--r--src/dolphinmodel.cpp137
1 files changed, 62 insertions, 75 deletions
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 <QList>
#include <QSortFilterProxyModel>
#include <QPainter>
+#include <QPersistentModelIndex>
#include <QDir>
#include <QFileInfo>
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<RevisionState>(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<const DolphinModel*>(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<const DolphinModel*>(index.model());
- KFileItem item = dolphinModel->itemForIndex(index);
- if (!item.isNull()) {
- const Nepomuk::Resource resource(item.url().url(), Soprano::Vocabulary::Xesam::File());
- const QList<Nepomuk::Tag> 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,22 +339,10 @@ 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);
- break;
- }
-
- case DolphinModel::Tags: {
- retString = tagsForIndex(index);
- if (retString.isEmpty()) {
- retString = i18nc("@title:group Tags", "Not yet tagged");
- }
+ case DolphinModel::Revision:
+ retString = "test";
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;
}