]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphinmodel.cpp
Forwardport 773570:
[dolphin.git] / src / dolphinmodel.cpp
1 /**
2 * This file is part of the KDE project
3 * Copyright (C) 2007 Rafael Fernández López <ereslibre@kde.org>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 */
20
21 #include "dolphinmodel.h"
22
23 #include "dolphinsortfilterproxymodel.h"
24
25 #include "kcategorizedview.h"
26
27 #include <config-nepomuk.h>
28 #ifdef HAVE_NEPOMUK
29 #include <nepomuk/global.h>
30 #include <nepomuk/resource.h>
31 #include <nepomuk/tag.h>
32 #include <Soprano/Vocabulary/Xesam>
33 #endif
34
35 #include <kdatetime.h>
36 #include <kdirmodel.h>
37 #include <kfileitem.h>
38 #include <kiconloader.h>
39 #include <klocale.h>
40 #include <kurl.h>
41 #include <kuser.h>
42 #include <kmimetype.h>
43 #include <kstandarddirs.h>
44
45 #include <QList>
46 #include <QSortFilterProxyModel>
47 #include <QPainter>
48 #include <QDir>
49 #include <QFileInfo>
50
51 static const char *others = I18N_NOOP2("@title:group Name", "Others");
52
53 DolphinModel::DolphinModel(QObject *parent)
54 : KDirModel(parent)
55 {
56 }
57
58 DolphinModel::~DolphinModel()
59 {
60 }
61
62 QVariant DolphinModel::data(const QModelIndex &index, int role) const
63 {
64 if (role == KCategorizedSortFilterProxyModel::CategoryDisplayRole) {
65 QString retString;
66
67 if (!index.isValid()) {
68 return retString;
69 }
70
71 const KDirModel *dirModel = qobject_cast<const KDirModel*>(index.model());
72 KFileItem item = dirModel->itemForIndex(index);
73
74 switch (index.column()) {
75 case KDirModel::Name: {
76 // KDirModel checks columns to know to which role are
77 // we talking about
78 QModelIndex theIndex = index.model()->index(index.row(),
79 KDirModel::Name,
80 index.parent());
81
82 if (!theIndex.isValid()) {
83 return retString;
84 }
85 QVariant data = theIndex.model()->data(theIndex, Qt::DisplayRole);
86 QString name = data.toString();
87 if (!name.isEmpty()) {
88 if (!item.isHidden() && name.at(0).isLetter())
89 retString = name.at(0).toUpper();
90 else if (item.isHidden()) {
91 if (name.at(0) == '.') {
92 if (name.size() > 1 && name.at(1).isLetter()) {
93 retString = name.at(1).toUpper();
94 } else {
95 retString = i18nc("@title:group Name", others);
96 }
97 } else {
98 retString = name.at(0).toUpper();
99 }
100 } else {
101 bool validCategory = false;
102
103 const QString str(name.toUpper());
104 const QChar* currA = str.unicode();
105 while (!currA->isNull() && !validCategory) {
106 if (currA->isLetter()) {
107 validCategory = true;
108 } else if (currA->isDigit()) {
109 return i18nc("@title:group Name", others);
110 } else {
111 ++currA;
112 }
113 }
114
115 if (!validCategory) {
116 retString = validCategory ? *currA : i18nc("@title:group Name", others);
117 } else {
118 retString = *currA;
119 }
120 }
121 }
122 break;
123 }
124
125 case KDirModel::Size: {
126 const int fileSize = !item.isNull() ? item.size() : -1;
127 if (!item.isNull() && item.isDir()) {
128 retString = i18nc("@title:group Size", "Folders");
129 } else if (fileSize < 5242880) {
130 retString = i18nc("@title:group Size", "Small");
131 } else if (fileSize < 10485760) {
132 retString = i18nc("@title:group Size", "Medium");
133 } else {
134 retString = i18nc("@title:group Size", "Big");
135 }
136 break;
137 }
138
139 case KDirModel::ModifiedTime: {
140 KDateTime modifiedTime = item.time(KFileItem::ModificationTime);
141 modifiedTime = modifiedTime.toLocalZone();
142
143 retString = modifiedTime.toString(i18nc("Prints out the month and year: %B is full month name in current locale, and %Y is full year number", "%B, %Y"));
144 break;
145 }
146
147 case KDirModel::Permissions: {
148 QString user;
149 QString group;
150 QString others;
151
152 QFileInfo info(item.url().pathOrUrl());
153
154 if (info.permission(QFile::ReadUser))
155 user = i18n("Read, ");
156
157 if (info.permission(QFile::WriteUser))
158 user += i18n("Write, ");
159
160 if (info.permission(QFile::ExeUser))
161 user += i18n("Execute, ");
162
163 if (user.isEmpty())
164 user = i18n("Forbidden");
165 else
166 user = user.mid(0, user.count() - 2);
167
168 if (info.permission(QFile::ReadGroup))
169 group = i18n("Read, ");
170
171 if (info.permission(QFile::WriteGroup))
172 group += i18n("Write, ");
173
174 if (info.permission(QFile::ExeGroup))
175 group += i18n("Execute, ");
176
177 if (group.isEmpty())
178 group = i18n("Forbidden");
179 else
180 group = group.mid(0, group.count() - 2);
181
182 if (info.permission(QFile::ReadOther))
183 others = i18n("Read, ");
184
185 if (info.permission(QFile::WriteOther))
186 others += i18n("Write, ");
187
188 if (info.permission(QFile::ExeOther))
189 others += i18n("Execute, ");
190
191 if (others.isEmpty())
192 others = i18n("Forbidden");
193 else
194 others = others.mid(0, others.count() - 2);
195
196 retString = i18nc("This shows files and folders permissions: user, group and others", "(User: %1) (Group: %2) (Others: %3)", user, group, others);
197 break;
198 }
199
200 case KDirModel::Owner:
201 retString = item.user();
202 break;
203
204 case KDirModel::Group:
205 retString = item.group();
206 break;
207
208 case KDirModel::Type:
209 retString = item.mimeComment();
210 break;
211
212 #ifdef HAVE_NEPOMUK
213 case DolphinModel::Rating: {
214 const quint32 rating = ratingForIndex(index);
215
216 retString = QString::number(rating);
217 break;
218 }
219
220 case DolphinModel::Tags: {
221 retString = tagsForIndex(index);
222
223 if (retString.isEmpty()) {
224 retString = i18nc("@title:group Tags", "Not yet tagged");
225 }
226 break;
227 }
228 #endif
229 }
230
231 return retString;
232 }
233 else if (role == KCategorizedSortFilterProxyModel::CategorySortRole) {
234 QVariant retVariant;
235
236 if (!index.isValid()) {
237 return retVariant;
238 }
239
240 const KDirModel *dirModel = qobject_cast<const KDirModel*>(index.model());
241 KFileItem item = dirModel->itemForIndex(index);
242
243 switch (index.column()) {
244 case KDirModel::Name: {
245 retVariant = data(index, KCategorizedSortFilterProxyModel::CategoryDisplayRole);
246
247 if (retVariant == i18nc("@title:group Name", others))
248 retVariant = QString(QChar(QChar::ReplacementCharacter));
249
250 break;
251 }
252
253 case KDirModel::Size: {
254 const int fileSize = !item.isNull() ? item.size() : -1;
255 if (item.isDir()) {
256 retVariant = 0;
257 } else if (fileSize < 5242880) {
258 retVariant = 1;
259 } else if (fileSize < 10485760) {
260 retVariant = 2;
261 } else {
262 retVariant = 3;
263 }
264 break;
265 }
266
267 case KDirModel::ModifiedTime: {
268 KDateTime modifiedTime = item.time(KFileItem::ModificationTime);
269 modifiedTime = modifiedTime.toLocalZone();
270
271 retVariant = -(modifiedTime.date().year() * 100 + modifiedTime.date().month());
272 break;
273 }
274
275 case KDirModel::Permissions: {
276 QFileInfo info(item.url().pathOrUrl());
277
278 retVariant = -KDirSortFilterProxyModel::pointsForPermissions(info);
279 break;
280 }
281
282 case KDirModel::Owner:
283 retVariant = item.user();
284 break;
285
286 case KDirModel::Group:
287 retVariant = item.group();
288 break;
289
290 case KDirModel::Type:
291 if (item.isDir())
292 retVariant = QString(); // when sorting we want folders to be placed first
293 else
294 retVariant = item.mimeComment();
295 break;
296
297 #ifdef HAVE_NEPOMUK
298 case DolphinModel::Rating: {
299 retVariant = ratingForIndex(index);
300 break;
301 }
302
303 case DolphinModel::Tags: {
304 retVariant = tagsForIndex(index).count();
305 break;
306 }
307 #endif
308
309 default:
310 break;
311
312 }
313
314 return retVariant;
315 }
316
317 return KDirModel::data(index, role);
318 }
319
320 int DolphinModel::columnCount(const QModelIndex &parent) const
321 {
322 return KDirModel::columnCount(parent) + (ExtraColumnCount - ColumnCount);
323 }
324
325 quint32 DolphinModel::ratingForIndex(const QModelIndex& index)
326 {
327 #ifdef HAVE_NEPOMUK
328 quint32 rating = 0;
329
330 const DolphinModel* dolphinModel = static_cast<const DolphinModel*>(index.model());
331 KFileItem item = dolphinModel->itemForIndex(index);
332 if (!item.isNull()) {
333 const Nepomuk::Resource resource(item.url().url(), Soprano::Vocabulary::Xesam::File());
334 rating = resource.rating();
335 }
336 return rating;
337 #else
338 Q_UNUSED(index);
339 return 0;
340 #endif
341 }
342
343 QString DolphinModel::tagsForIndex(const QModelIndex& index)
344 {
345 #ifdef HAVE_NEPOMUK
346 QString tagsString;
347
348 const DolphinModel* dolphinModel = static_cast<const DolphinModel*>(index.model());
349 KFileItem item = dolphinModel->itemForIndex(index);
350 if (!item.isNull()) {
351 const Nepomuk::Resource resource(item.url().url(), Soprano::Vocabulary::Xesam::File());
352 const QList<Nepomuk::Tag> tags = resource.tags();
353 QStringList stringList;
354 foreach (const Nepomuk::Tag& tag, tags) {
355 stringList.append(tag.label());
356 }
357 stringList.sort();
358
359 foreach (const QString& str, stringList) {
360 tagsString += str;
361 tagsString += ", ";
362 }
363
364 if (!tagsString.isEmpty()) {
365 tagsString.resize(tagsString.size() - 2);
366 }
367 }
368
369 return tagsString;
370 #else
371 Q_UNUSED(index);
372 return QString();
373 #endif
374 }