]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinfileitemdelegate.cpp
SVN_SILENT: minor coding style fix (Sebastian likes spaces :-))
[dolphin.git] / src / dolphinfileitemdelegate.cpp
index cc8c449834ffa69fcff837acfe4fa5148a97df25..7a6ef118e3ca3130b825167a6927529e1560d8e5 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <dolphinmodel.h>
 #include <kfileitem.h>
+#include <kicon.h>
+#include <kiconloader.h>
 
 #include <QAbstractItemModel>
 #include <QAbstractProxyModel>
@@ -31,7 +33,9 @@
 
 DolphinFileItemDelegate::DolphinFileItemDelegate(QObject* parent) :
     KFileItemDelegate(parent),
-    m_hasMinimizedNameColumn(false)
+    m_hasMinimizedNameColumn(false),
+    m_cachedSize(),
+    m_cachedEmblems()
 {
 }
 
@@ -45,34 +49,30 @@ void DolphinFileItemDelegate::paint(QPainter* painter,
 {
     const QAbstractProxyModel* proxyModel = static_cast<const QAbstractProxyModel*>(index.model());
     const DolphinModel* dolphinModel = static_cast<const DolphinModel*>(proxyModel->sourceModel());
-    const bool useMinimizedNameColumn = m_hasMinimizedNameColumn && (index.column() == KDirModel::Name);
+    const bool isNameColumn = (index.column() == KDirModel::Name);
 
-    if (dolphinModel->hasRevisionData()) {
-        // The currently shown items are under revision control. Show the current revision
-        // state by adjusting the text color.
-        const QModelIndex dirIndex = proxyModel->mapToSource(index);
-        const QModelIndex revisionIndex = dolphinModel->index(dirIndex.row(), DolphinModel::Revision);
-        const QVariant data = dolphinModel->data(revisionIndex, Qt::DecorationRole);
-        const DolphinModel::RevisionState state = static_cast<DolphinModel::RevisionState>(data.toInt());
-
-        if (state != DolphinModel::LocalRevision) {
-            QStyleOptionViewItemV4 opt(option);
-            // TODO: use different colors for different states
-            opt.palette.setColor(QPalette::Text, QColor(40, 150, 40));
-            if (useMinimizedNameColumn) {
-                adjustOptionWidth(opt, proxyModel, dolphinModel, index);
-            }
-            KFileItemDelegate::paint(painter, opt, index);
-            return;
-        }
-    } else if (useMinimizedNameColumn) {
+    if (m_hasMinimizedNameColumn && isNameColumn) {
         QStyleOptionViewItemV4 opt(option);
         adjustOptionWidth(opt, proxyModel, dolphinModel, index);
         KFileItemDelegate::paint(painter, opt, index);
-        return;
+    } else {
+        KFileItemDelegate::paint(painter, option, index);
     }
 
-    KFileItemDelegate::paint(painter, option, index);
+    if (dolphinModel->hasVersionData() && isNameColumn) {
+        // The currently shown items are under revision control. Show the current revision
+        // state by adding an emblem.
+        const QModelIndex dirIndex = proxyModel->mapToSource(index);
+        const QModelIndex revisionIndex = dolphinModel->index(dirIndex.row(), DolphinModel::Version, dirIndex.parent());
+        const QVariant data = dolphinModel->data(revisionIndex, Qt::DecorationRole);
+        const KVersionControlPlugin::VersionState state = static_cast<KVersionControlPlugin::VersionState>(data.toInt());
+
+        if (state != KVersionControlPlugin::UnversionedVersion) {
+            const QRect rect = iconRect(option, index);
+            const QPixmap emblem = emblemForState(state, rect.size());
+            painter->drawPixmap(rect.x(), rect.y() + rect.height() - emblem.height(), emblem);
+        }
+    }
 }
 
 int DolphinFileItemDelegate::nameColumnWidth(const QString& name, const QStyleOptionViewItem& option)
@@ -105,3 +105,41 @@ void DolphinFileItemDelegate::adjustOptionWidth(QStyleOptionViewItemV4& option,
     }
 }
 
+QPixmap DolphinFileItemDelegate::emblemForState(KVersionControlPlugin::VersionState state, const QSize& size) const
+{
+    // TODO: all icons that are use here will be replaced by revision control emblems provided by the
+    // Oxygen team before KDE 4.4
+    Q_ASSERT(state <= KVersionControlPlugin::ConflictingVersion);
+    if ((m_cachedSize != size) || !m_cachedEmblems[state].isNull()) {
+        m_cachedSize = size;
+
+        const int iconHeight = size.height();
+        int emblemHeight = KIconLoader::SizeSmall;
+        if (iconHeight >= KIconLoader::SizeEnormous) {
+            emblemHeight = KIconLoader::SizeMedium;
+        } else if (iconHeight >= KIconLoader::SizeLarge) {
+            emblemHeight = KIconLoader::SizeSmallMedium;
+        } else if (iconHeight >= KIconLoader::SizeMedium) {
+            emblemHeight = KIconLoader::SizeSmall;
+        } else {
+            emblemHeight = KIconLoader::SizeSmall / 2;
+        }
+
+        const QSize emblemSize(emblemHeight, emblemHeight);
+        for (int i = 0; i <= KVersionControlPlugin::ConflictingVersion; ++i) {
+            QString iconName;
+            switch (state) {
+            case KVersionControlPlugin::NormalVersion:          iconName = "vcs-normal"; break;
+            case KVersionControlPlugin::UpdateRequiredVersion:  iconName = "vcs-update-required"; break;
+            case KVersionControlPlugin::LocallyModifiedVersion: iconName = "vcs-locally-modified"; break;
+            case KVersionControlPlugin::AddedVersion:           iconName = "vcs-added"; break;
+            case KVersionControlPlugin::ConflictingVersion:     iconName = "vcs-conflicting"; break;
+            default: Q_ASSERT(false); break;
+            }
+
+            m_cachedEmblems[i] = KIcon(iconName).pixmap(emblemSize);
+        }
+    }
+    return m_cachedEmblems[state];
+}
+