]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kfileitemlistwidget.cpp
kdelibs4support--
[dolphin.git] / src / kitemviews / kfileitemlistwidget.cpp
1 /***************************************************************************
2 * Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
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 "kfileitemlistwidget.h"
21 #include "kfileitemmodel.h"
22 #include "kitemlistview.h"
23
24 #include <KLocale>
25 #include <KIO/MetaData>
26 #include <QDateTime>
27 #include <KFormat>
28 #include <QMimeDatabase>
29
30 KFileItemListWidgetInformant::KFileItemListWidgetInformant() :
31 KStandardItemListWidgetInformant()
32 {
33 }
34
35 KFileItemListWidgetInformant::~KFileItemListWidgetInformant()
36 {
37 }
38
39 QString KFileItemListWidgetInformant::itemText(int index, const KItemListView* view) const
40 {
41 Q_ASSERT(qobject_cast<KFileItemModel*>(view->model()));
42 KFileItemModel* fileItemModel = static_cast<KFileItemModel*>(view->model());
43
44 const KFileItem item = fileItemModel->fileItem(index);
45 return item.text();
46 }
47
48 bool KFileItemListWidgetInformant::itemIsLink(int index, const KItemListView* view) const
49 {
50 Q_ASSERT(qobject_cast<KFileItemModel*>(view->model()));
51 KFileItemModel* fileItemModel = static_cast<KFileItemModel*>(view->model());
52
53 const KFileItem item = fileItemModel->fileItem(index);
54 return item.isLink();
55 }
56
57 QString KFileItemListWidgetInformant::roleText(const QByteArray& role,
58 const QHash<QByteArray, QVariant>& values) const
59 {
60 QString text;
61 const QVariant roleValue = values.value(role);
62
63 // Implementation note: In case if more roles require a custom handling
64 // use a hash + switch for a linear runtime.
65
66 if (role == "size") {
67 if (values.value("isDir").toBool()) {
68 // The item represents a directory. Show the number of sub directories
69 // instead of the file size of the directory.
70 if (!roleValue.isNull()) {
71 const int count = roleValue.toInt();
72 if (count < 0) {
73 text = i18nc("@item:intable", "Unknown");
74 } else {
75 text = i18ncp("@item:intable", "%1 item", "%1 items", count);
76 }
77 }
78 } else {
79 const KIO::filesize_t size = roleValue.value<KIO::filesize_t>();
80 text = KFormat().formatByteSize(size);
81 }
82 } else if (role == "date") {
83 const QDateTime dateTime = roleValue.toDateTime();
84 text = KLocale::global()->formatDateTime(dateTime);
85 } else {
86 text = KStandardItemListWidgetInformant::roleText(role, values);
87 }
88
89 return text;
90 }
91
92 QFont KFileItemListWidgetInformant::customizedFontForLinks(const QFont& baseFont) const
93 {
94 // The customized font should be italic if the file is a symbolic link.
95 QFont font(baseFont);
96 font.setItalic(true);
97 return font;
98 }
99
100
101 KFileItemListWidget::KFileItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) :
102 KStandardItemListWidget(informant, parent)
103 {
104 }
105
106 KFileItemListWidget::~KFileItemListWidget()
107 {
108 }
109
110 KItemListWidgetInformant* KFileItemListWidget::createInformant()
111 {
112 return new KFileItemListWidgetInformant();
113 }
114
115 bool KFileItemListWidget::isRoleRightAligned(const QByteArray& role) const
116 {
117 return role == "size";
118 }
119
120 bool KFileItemListWidget::isHidden() const
121 {
122 return data().value("text").toString().startsWith(QLatin1Char('.'));
123 }
124
125 QFont KFileItemListWidget::customizedFont(const QFont& baseFont) const
126 {
127 // The customized font should be italic if the file is a symbolic link.
128 QFont font(baseFont);
129 font.setItalic(data().value("isLink").toBool());
130 return font;
131 }
132
133 int KFileItemListWidget::selectionLength(const QString& text) const
134 {
135 // Select the text without MIME-type extension
136 int selectionLength = text.length();
137
138 // If item is a directory, use the whole text length for
139 // selection (ignore all points)
140 if(data().value("isDir").toBool()) {
141 return selectionLength;
142 }
143
144 QMimeDatabase db;
145 const QString extension = db.suffixForFileName(text);
146 if (extension.isEmpty()) {
147 // For an unknown extension just exclude the extension after
148 // the last point. This does not work for multiple extensions like
149 // *.tar.gz but usually this is anyhow a known extension.
150 selectionLength = text.lastIndexOf(QLatin1Char('.'));
151
152 // If no point could be found, use whole text length for selection.
153 if (selectionLength < 1) {
154 selectionLength = text.length();
155 }
156
157 } else {
158 selectionLength -= extension.length() + 1;
159 }
160
161 return selectionLength;
162 }
163