2 @copyright: (C) 2008, Thomas Leonard
3 @see: U{http://roscidus.com}
5 from zeroinstall
.support
import tasks
# tmp
12 gtk_theme
= gtk
.icon_theme_get_default()
16 def get_themed_icon(name
, icon_size
):
18 return gtk_theme
.load_icon('text-x-generic', icon_size
, 0)
19 except gobject
.GError
:
22 icon_text_plain
= get_themed_icon('text-x-generic', icon_size
)
23 icon_dir
= get_themed_icon('folder', icon_size
)
25 def sort_key(name
, info
):
26 t
= 9 - int(info
.get_file_type())
27 return str(t
) + name
.lower()
33 SORT
= 3 # Type-then-name
38 def __init__(self
, file):
39 assert isinstance(file, gio
.File
), file
44 assert not self
.users
, "DirModel garbage collected while still monitoring! Monitored by " + str(self
.users
)
46 def add_ref(self
, user
):
51 assert not self
.monitor
53 self
.model
= gtk
.ListStore(str, gtk
.gdk
.Pixbuf
, object, str)
55 # Should really be the view that sorts, but see GTK bug #523724
56 self
.model
.set_sort_column_id(DirModel
.SORT
, gtk
.SORT_ASCENDING
)
58 self
.monitor
= self
.file.monitor_directory(0)
59 weakself
= weakref
.ref(self
)
60 self
.monitor
.connect('changed', lambda *args
: weakself().contents_changed(*args
))
63 self
.users
.append(user
)
65 def del_ref(self
, user
):
67 self
.users
.remove(user
)
76 def contents_changed(self
, monitor
, dir_file
, other_file
, event_type
):
79 def build_contents(self
):
84 e
= self
.file.enumerate_children('standard::*', 0)
85 except gobject
.GError
, ex
:
97 name
= info
.get_name()
98 if not name
.startswith('.'):
99 new
= self
.model
.append(None)
101 icon
= info
.get_icon()
103 gtkicon_info
= gtk_theme
.choose_icon(icon
.get_names(), icon_size
, 0)
105 gtkicon_info
.get_filename()
106 pixbuf
= gtkicon_info
.load_icon()
108 self
.model
[new
] = [name
, pixbuf
, info
, sort_key(name
, info
)]
110 dirs
= weakref
.WeakValueDictionary()
111 def get_dir_model(file):
112 # Might want some caching here...