4646# Force the log level for this module
4747# LOG.setLevel(logger.DEBUG) # One of DEBUG, INFO, WARNING, ERROR, CRITICAL
4848
49- # constants
49+ ### Constants ##
50+ # Sort order
5051_ASCENDING = 0
5152_DESCENDING = 1
5253_FOLDERFIRST = 2
5354_FILEFIRST = 3
55+ # Sort by date
56+ _DATE_NONE = 0
57+ _DATE_ALL = 1
58+ _DATE_FILESONLY = 2
5459COL_PATH = 0
5560COL_PIXBUF = 1
5661COL_IS_DIRECTORY = 2
@@ -81,8 +86,10 @@ class IconFileSelection(Gtk.Box):
8186 "~" , GObject .ParamFlags .READWRITE | GObject .ParamFlags .CONSTRUCT ),
8287 'filetypes' : (GObject .TYPE_STRING , 'file filter' , 'Sets the filter for the file types to be shown' ,
8388 "ngc,py" , GObject .ParamFlags .READWRITE | GObject .ParamFlags .CONSTRUCT ),
84- 'sortorder' : (GObject .TYPE_INT , 'sorting order' , '0 = ASCENDING, 1 = DESCENDING" , 2 = FOLDERFIRST, 3 = FILEFIRST' ,
89+ 'sortorder' : (GObject .TYPE_INT , 'sorting order' , '0 = ASCENDING, 1 = DESCENDING, 2 = FOLDERFIRST, 3 = FILEFIRST' ,
8590 0 , 3 , 2 , GObject .ParamFlags .READWRITE | GObject .ParamFlags .CONSTRUCT ),
91+ 'sortbydate' : (GObject .TYPE_INT , 'sort by date' , '0 = none, 1 = files and foders, 2 = files only' ,
92+ 0 , 2 , 0 , GObject .ParamFlags .READWRITE | GObject .ParamFlags .CONSTRUCT ),
8693 }
8794 __gproperties = __gproperties__
8895
@@ -100,12 +107,13 @@ def __init__(self):
100107
101108 # set some default values'
102109 self .icon_size = 48
103- self .start_dir = os . path . expanduser ( '/' )
110+ self .start_dir = None
104111 self .cur_dir = self .start_dir
105112 self .user_dir = os .path .expanduser ('~' )
106113 self .jump_to_dir = os .path .expanduser ('/tmp' )
107114 self .filetypes = ("ngc,py" )
108115 self .sortorder = _FOLDERFIRST
116+ self .sort_by_date = _DATE_NONE
109117 # This will hold the path we will return
110118 self .path = ""
111119 self .button_state = {}
@@ -303,58 +311,68 @@ def _fill_store(self):
303311 # we don't want to add hidden files
304312 if fl [0 ] == '.' :
305313 continue
314+ # append files with date
306315 if os .path .isdir (os .path .join (self .cur_dir , fl )):
307316 try :
308317 os .listdir (os .path .join (self .cur_dir , fl ))
309- dirs .append (fl )
318+ dirs .append (( fl , os . path . getmtime ( os . path . join ( self . cur_dir , fl ))) )
310319 number += 1
311320 except OSError :
312321 #print ("no rights for ", os.path.join(self.cur_dir, fl), " skip that dir")
313322 continue
323+ # append dirs with date
314324 else :
315325 try :
316326 name , ext = fl .rsplit ("." , 1 )
317- if "*" in self .filetypes :
318- files .append (fl )
319- number += 1
320- elif ext in self .filetypes :
321- files .append (fl )
327+ if "*" in self .filetypes or ext in self .filetypes :
328+ files .append ((fl , os .path .getmtime (os .path .join (self .cur_dir , fl ))))
322329 number += 1
323330 except ValueError as e :
324- LOG .debug ("Tried to split filename without extension ({0 })." . format ( e ) )
331+ LOG .debug (f "Tried to split filename ( { fl } ) without extension ({ e } )." )
325332 except Exception as e :
326333 LOG .exception (e )
327334 pass
328-
329335 if self .sortorder not in [_ASCENDING , _DESCENDING , _FOLDERFIRST , _FILEFIRST ]:
330336 self .sortorder = _FOLDERFIRST
331337
338+ # sort ascending/descending (file/folder mixed)
332339 if self .sortorder == _ASCENDING or self .sortorder == _DESCENDING :
333- allobjects = dirs
334- allobjects .extend (files )
335- allobjects .sort (reverse = not self .sortorder == _ASCENDING )
336-
337- for obj in allobjects :
340+ allobjects = dirs + files
341+ if self .sort_by_date :
342+ allobjects .sort (key = lambda x : x [1 ], reverse = self .sortorder == _ASCENDING )
343+ else :
344+ allobjects .sort (key = lambda x : x [0 ].casefold (), reverse = not self .sortorder == _ASCENDING )
345+
346+ for obj , date in allobjects :
338347 if os .path .isdir (os .path .join (self .cur_dir , obj )):
339348 self .store .append ([obj , self .dirIcon , True ])
340349 else :
341350 icon = self ._get_icon (obj )
342351 self .store .append ([obj , icon , False ])
343-
344- dirs .sort (key = None , reverse = False )
345- files .sort (key = None , reverse = False )
346- if self .sortorder == _FOLDERFIRST :
347- for dir in dirs :
348- self .store .append ([dir , self .dirIcon , True ])
349- for file in files :
350- icon = self ._get_icon (file )
351- self .store .append ([file , icon , False ])
352- elif self .sortorder == _FILEFIRST :
353- for file in files :
354- icon = self ._get_icon (file )
355- self .store .append ([file , icon , False ])
356- for dir in dirs :
357- self .store .append ([dir , self .dirIcon , True ])
352+
353+ # 2. sort folders/files separately (sortorder _FOLDERFIRST or _FILEFIRST)
354+ else :
355+ if self .sort_by_date :
356+ files .sort (key = lambda x : x [1 ], reverse = True )
357+ else :
358+ files .sort (key = lambda x : x [0 ].casefold (), reverse = False )
359+ if self .sort_by_date == _DATE_ALL :
360+ dirs .sort (key = lambda x : x [1 ], reverse = True )
361+ else :
362+ dirs .sort (key = lambda x : x [0 ].casefold (), reverse = False )
363+
364+ if self .sortorder == _FOLDERFIRST :
365+ for dir , date in dirs :
366+ self .store .append ([dir , self .dirIcon , True ])
367+ for file , date in files :
368+ icon = self ._get_icon (file )
369+ self .store .append ([file , icon , False ])
370+ else :
371+ for file , date in files :
372+ icon = self ._get_icon (file )
373+ self .store .append ([file , icon , False ])
374+ for dir , date in dirs :
375+ self .store .append ([dir , self .dirIcon , True ])
358376 except Exception as e :
359377 LOG .exception (e )
360378 pass
@@ -599,6 +617,12 @@ def do_set_property(self, property, value):
599617 else :
600618 self .sortorder = value
601619 self ._fill_store ()
620+ if name == 'sortbydate' :
621+ if value not in [_DATE_NONE , _DATE_ALL , _DATE_FILESONLY ]:
622+ raise AttributeError ('unknown property of sortbydate %s' % value )
623+ else :
624+ self .sort_by_date = value
625+ self ._fill_store ()
602626 else :
603627 raise AttributeError ('unknown iconview set_property %s' % property .name )
604628 except Exception as e :
0 commit comments