Skip to content

Commit bb43853

Browse files
committed
gladevcp-iconview: add option to sort by date
1 parent 2d240af commit bb43853

File tree

1 file changed

+55
-31
lines changed

1 file changed

+55
-31
lines changed

lib/python/gladevcp/iconview.py

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,16 @@
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
5459
COL_PATH = 0
5560
COL_PIXBUF = 1
5661
COL_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

Comments
 (0)