]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphinfileitemdelegate.cpp
Improve selection behaviour concerning the new "jump to next/previous
[dolphin.git] / src / dolphinfileitemdelegate.cpp
1 /***************************************************************************
2 * Copyright (C) 2008 by Peter Penz <peter.penz@gmx.at> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 ***************************************************************************/
19
20 #include "dolphinfileitemdelegate.h"
21
22 #include <dolphinmodel.h>
23 #include <kfileitem.h>
24 #include <kicon.h>
25 #include <kiconloader.h>
26
27 #include <QAbstractItemModel>
28 #include <QAbstractProxyModel>
29 #include <QFontMetrics>
30 #include <QPalette>
31 #include <QPainter>
32 #include <QStyleOptionViewItemV4>
33
34 DolphinFileItemDelegate::DolphinFileItemDelegate(QObject* parent) :
35 KFileItemDelegate(parent),
36 m_hasMinimizedNameColumn(false)
37 {
38 }
39
40 DolphinFileItemDelegate::~DolphinFileItemDelegate()
41 {
42 }
43
44 void DolphinFileItemDelegate::paint(QPainter* painter,
45 const QStyleOptionViewItem& option,
46 const QModelIndex& index) const
47 {
48 const QAbstractProxyModel* proxyModel = static_cast<const QAbstractProxyModel*>(index.model());
49 const DolphinModel* dolphinModel = static_cast<const DolphinModel*>(proxyModel->sourceModel());
50 const bool isNameColumn = (index.column() == KDirModel::Name);
51
52 if (m_hasMinimizedNameColumn && isNameColumn) {
53 QStyleOptionViewItemV4 opt(option);
54 adjustOptionWidth(opt, proxyModel, dolphinModel, index);
55 KFileItemDelegate::paint(painter, opt, index);
56 } else {
57 KFileItemDelegate::paint(painter, option, index);
58 }
59
60 if (dolphinModel->hasRevisionData() && isNameColumn) {
61 // The currently shown items are under revision control. Show the current revision
62 // state by adding an emblem.
63 const QModelIndex dirIndex = proxyModel->mapToSource(index);
64 const QModelIndex revisionIndex = dolphinModel->index(dirIndex.row(), DolphinModel::Revision);
65 const QVariant data = dolphinModel->data(revisionIndex, Qt::DecorationRole);
66 const DolphinModel::RevisionState state = static_cast<DolphinModel::RevisionState>(data.toInt());
67
68 if (state != DolphinModel::LocalRevision) {
69 // TODO: extend KFileItemDelegate to be able to get the icon boundaries
70 const QRect iconRect(option.rect.x(), option.rect.y(),
71 KIconLoader::SizeSmall, KIconLoader::SizeSmall);
72 const QPixmap emblem = emblemForState(state, iconRect.size());
73 painter->drawPixmap(iconRect.x(), iconRect.y(), emblem);
74 }
75 }
76 }
77
78 int DolphinFileItemDelegate::nameColumnWidth(const QString& name, const QStyleOptionViewItem& option)
79 {
80 QFontMetrics fontMetrics(option.font);
81 int width = option.decorationSize.width() + fontMetrics.width(name) + 16;
82
83 const int defaultWidth = option.rect.width();
84 if ((defaultWidth > 0) && (defaultWidth < width)) {
85 width = defaultWidth;
86 }
87 return width;
88 }
89
90 void DolphinFileItemDelegate::adjustOptionWidth(QStyleOptionViewItemV4& option,
91 const QAbstractProxyModel* proxyModel,
92 const DolphinModel* dolphinModel,
93 const QModelIndex& index)
94 {
95 const QModelIndex dirIndex = proxyModel->mapToSource(index);
96 const KFileItem item = dolphinModel->itemForIndex(dirIndex);
97 if (!item.isNull()) {
98 // symbolic links are displayed in an italic font
99 if (item.isLink()) {
100 option.font.setItalic(true);
101 }
102
103 const int width = nameColumnWidth(item.text(), option);
104 option.rect.setWidth(width);
105 }
106 }
107
108 QPixmap DolphinFileItemDelegate::emblemForState(DolphinModel::RevisionState state, const QSize& size)
109 {
110 // TODO #1: all icons that are use here will be replaced by revision control emblems provided by the
111 // Oxygen team before KDE 4.4
112 // TODO #2: cache the icons
113 switch (state) {
114 case DolphinModel::LatestRevision:
115 return KIcon("dialog-ok-apply").pixmap(size);
116 break;
117
118 case DolphinModel::ConflictingRevision:
119 return KIcon("emblem-important").pixmap(size);
120 break;
121
122 // ...
123
124 default:
125 break;
126 }
127 return QPixmap();
128 }
129