]>
cloud.milkyroute.net Git - dolphin.git/blob - src/dolphinmodel.cpp
2 * This file is part of the KDE project
3 * Copyright (C) 2007 Rafael Fernández López <ereslibre@kde.org>
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.
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.
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.
21 #include "dolphinmodel.h"
23 #include "dolphinsortfilterproxymodel.h"
25 #include "kcategorizedview.h"
27 #include <config-nepomuk.h>
29 #include <nepomuk/global.h>
30 #include <nepomuk/resource.h>
31 #include <nepomuk/tag.h>
32 #include <Soprano/Vocabulary/Xesam>
35 #include <kdatetime.h>
36 #include <kdirmodel.h>
37 #include <kfileitem.h>
38 #include <kiconloader.h>
42 #include <kmimetype.h>
43 #include <kstandarddirs.h>
46 #include <QSortFilterProxyModel>
51 static const char * others
= I18N_NOOP2 ( "@title:group Name" , "Others" );
53 DolphinModel :: DolphinModel ( QObject
* parent
)
58 DolphinModel ::~ DolphinModel ()
62 QVariant
DolphinModel :: data ( const QModelIndex
& index
, int role
) const
64 if ( role
== KCategorizedSortFilterProxyModel :: CategoryDisplayRole
) {
67 if (! index
. isValid ()) {
71 const KDirModel
* dirModel
= qobject_cast
< const KDirModel
*>( index
. model ());
72 KFileItem item
= dirModel
-> itemForIndex ( index
);
74 switch ( index
. column ()) {
75 case KDirModel :: Name
: {
76 // KDirModel checks columns to know to which role are
78 QModelIndex theIndex
= index
. model ()-> index ( index
. row (),
82 if (! theIndex
. isValid ()) {
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 ();
95 retString
= i18nc ( "@title:group Name" , others
);
98 retString
= name
. at ( 0 ). toUpper ();
101 bool validCategory
= false ;
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
);
115 if (! validCategory
) {
116 retString
= validCategory
? * currA
: i18nc ( "@title:group Name" , others
);
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" );
134 retString
= i18nc ( "@title:group Size" , "Big" );
139 case KDirModel :: ModifiedTime
: {
140 KDateTime modifiedTime
;
141 modifiedTime
. setTime_t ( item
. time ( KIO :: UDSEntry :: UDS_MODIFICATION_TIME
));
142 modifiedTime
= modifiedTime
. toLocalZone ();
144 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 " ));
148 case KDirModel :: Permissions
: {
153 QFileInfo
info ( item
. url (). pathOrUrl ());
155 if ( info
. permission ( QFile :: ReadUser
))
156 user
= i18n ( "Read, " );
158 if ( info
. permission ( QFile :: WriteUser
))
159 user
+= i18n ( "Write, " );
161 if ( info
. permission ( QFile :: ExeUser
))
162 user
+= i18n ( "Execute, " );
165 user
= i18n ( "Forbidden" );
167 user
= user
. mid ( 0 , user
. count () - 2 );
169 if ( info
. permission ( QFile :: ReadGroup
))
170 group
= i18n ( "Read, " );
172 if ( info
. permission ( QFile :: WriteGroup
))
173 group
+= i18n ( "Write, " );
175 if ( info
. permission ( QFile :: ExeGroup
))
176 group
+= i18n ( "Execute, " );
179 group
= i18n ( "Forbidden" );
181 group
= group
. mid ( 0 , group
. count () - 2 );
183 if ( info
. permission ( QFile :: ReadOther
))
184 others
= i18n ( "Read, " );
186 if ( info
. permission ( QFile :: WriteOther
))
187 others
+= i18n ( "Write, " );
189 if ( info
. permission ( QFile :: ExeOther
))
190 others
+= i18n ( "Execute, " );
192 if ( others
. isEmpty ())
193 others
= i18n ( "Forbidden" );
195 others
= others
. mid ( 0 , others
. count () - 2 );
197 retString
= i18nc ( "This shows files and folders permissions: user, group and others" , "(User: %1 ) (Group: %2 ) (Others: %3 )" , user
, group
, others
);
201 case KDirModel :: Owner
:
202 retString
= item
. user ();
205 case KDirModel :: Group
:
206 retString
= item
. group ();
209 case KDirModel :: Type
:
210 retString
= item
. mimeComment ();
214 case DolphinModel :: Rating
: {
215 const quint32 rating
= ratingForIndex ( index
);
217 retString
= QString :: number ( rating
);
221 case DolphinModel :: Tags
: {
222 retString
= tagsForIndex ( index
);
224 if ( retString
. isEmpty ()) {
225 retString
= i18nc ( "@title:group Tags" , "Not yet tagged" );
234 else if ( role
== KCategorizedSortFilterProxyModel :: CategorySortRole
) {
237 if (! index
. isValid ()) {
241 const KDirModel
* dirModel
= qobject_cast
< const KDirModel
*>( index
. model ());
242 KFileItem item
= dirModel
-> itemForIndex ( index
);
244 switch ( index
. column ()) {
245 case KDirModel :: Name
: {
246 retVariant
= data ( index
, KCategorizedSortFilterProxyModel :: CategoryDisplayRole
);
248 if ( retVariant
== i18nc ( "@title:group Name" , others
))
249 retVariant
= QString ( QChar ( QChar :: ReplacementCharacter
));
254 case KDirModel :: Size
: {
255 const int fileSize
= ! item
. isNull () ? item
. size () : - 1 ;
258 } else if ( fileSize
< 5242880 ) {
260 } else if ( fileSize
< 10485760 ) {
268 case KDirModel :: ModifiedTime
: {
269 KDateTime modifiedTime
;
270 modifiedTime
. setTime_t ( item
. time ( KIO :: UDSEntry :: UDS_MODIFICATION_TIME
));
271 modifiedTime
= modifiedTime
. toLocalZone ();
273 retVariant
= -( modifiedTime
. date (). year () * 100 + modifiedTime
. date (). month ());
277 case KDirModel :: Permissions
: {
278 QFileInfo
info ( item
. url (). pathOrUrl ());
280 retVariant
= - KDirSortFilterProxyModel :: pointsForPermissions ( info
);
284 case KDirModel :: Owner
:
285 retVariant
= item
. user ();
288 case KDirModel :: Group
:
289 retVariant
= item
. group ();
292 case KDirModel :: Type
:
294 retVariant
= QString (); // when sorting we want folders to be placed first
296 retVariant
= item
. mimeComment ();
300 case DolphinModel :: Rating
: {
301 retVariant
= ratingForIndex ( index
);
305 case DolphinModel :: Tags
: {
306 retVariant
= tagsForIndex ( index
). count ();
319 return KDirModel :: data ( index
, role
);
322 int DolphinModel :: columnCount ( const QModelIndex
& parent
) const
324 return KDirModel :: columnCount ( parent
) + ( ExtraColumnCount
- ColumnCount
);
327 quint32
DolphinModel :: ratingForIndex ( const QModelIndex
& index
)
332 const DolphinModel
* dolphinModel
= static_cast < const DolphinModel
*>( index
. model ());
333 KFileItem item
= dolphinModel
-> itemForIndex ( index
);
334 if (! item
. isNull ()) {
335 const Nepomuk :: Resource
resource ( item
. url (). url (), Soprano :: Vocabulary :: Xesam :: File ());
336 rating
= resource
. rating ();
345 QString
DolphinModel :: tagsForIndex ( const QModelIndex
& index
)
350 const DolphinModel
* dolphinModel
= static_cast < const DolphinModel
*>( index
. model ());
351 KFileItem item
= dolphinModel
-> itemForIndex ( index
);
352 if (! item
. isNull ()) {
353 const Nepomuk :: Resource
resource ( item
. url (). url (), Soprano :: Vocabulary :: Xesam :: File ());
354 const QList
< Nepomuk :: Tag
> tags
= resource
. tags ();
355 QStringList stringList
;
356 foreach ( const Nepomuk :: Tag
& tag
, tags
) {
357 stringList
. append ( tag
. label ());
361 foreach ( const QString
& str
, stringList
) {
366 if (! tagsString
. isEmpty ()) {
367 tagsString
. resize ( tagsString
. size () - 2 );