1 import gtk
2 import logging
3 log = logging.getLogger("hildonui.List")
4
5 import conduit
6
8 DND_TARGETS = [
9 ('conduit/element-name', 0, 0)
10 ]
12 gtk.VBox.__init__(self)
13
14
15
16 self.categories = {}
17 self.combo = gtk.combo_box_new_text ()
18 self.dp_store = gtk.ListStore(gtk.gdk.Pixbuf, str, str)
19
20 self.add_dataproviders(
21 conduit.GLOBALS.moduleManager.get_modules_by_type("source","sink","twoway")
22 )
23 conduit.GLOBALS.moduleManager.connect("dataprovider-available", self.on_dataprovider_available)
24 conduit.GLOBALS.moduleManager.connect("dataprovider-unavailable", self.on_dataprovider_unavailable)
25
26
27
28 self.combo.connect ("changed", self.on_combo_changed)
29 self.pack_start(self.combo, False, False)
30
31 self.tree = gtk.TreeView (self.dp_store)
32 col = gtk.TreeViewColumn()
33 render_pixbuf = gtk.CellRendererPixbuf()
34 col.pack_start(render_pixbuf, expand=False)
35 col.add_attribute(render_pixbuf, 'pixbuf', 0)
36 render_text = gtk.CellRendererText()
37 col.pack_start(render_text, expand=True)
38 col.add_attribute(render_text, 'text', 1)
39 self.tree.append_column (col)
40
41
42 self.tree.enable_model_drag_source( gtk.gdk.BUTTON1_MASK,
43 self.DND_TARGETS,
44 gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_MOVE)
45 self.tree.drag_source_set( gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
46 self.DND_TARGETS,
47 gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK)
48
49 self.tree.connect('drag-data-get', self.on_drag_data_get)
50 self.tree.connect('drag-data-delete', self.on_drag_data_delete)
51
52 self.pack_start(self.tree, True, True)
53
57
60
62 """
63 Adds all enabled dataproviders to the model
64 """
65
66 module_wrapper_list = [m for m in dpw if m.enabled]
67
68
69 for mod in module_wrapper_list:
70 self.add_dataprovider(mod)
71
73 """
74 Adds a new dataprovider
75 """
76 log.debug("Adding dataprovider %s to List" % dpw)
77
78 category_name = dpw.category.name
79
80 if not self.categories.has_key(category_name):
81 self.combo.append_text (category_name)
82 self.categories[category_name] = [dpw]
83 else:
84 self.categories[category_name].append (dpw)
85
86 self.reload_category_if_current(category_name)
87
89 """
90 Remove dataprovider
91 """
92 category_name = dpw.category.name
93
94 if not self.categories.has_key (category_name):
95 return
96
97 self.categories[category_name].remove(dpw)
98 self.reload_category_if_current (category_name)
99
101 """
102 Reload the category if the combo changes
103 """
104 self.reload_category ()
105
107 treeselection = treeview.get_selection()
108 model, iter = treeselection.get_selected()
109
110 data = model.get_value(iter, 2)
111
112 log.debug("Dragging %s" % data)
113
114 selection.set(selection.target, 8, data)
115
117 """
118 DnD magic. do not touch
119 """
120 self.tree.emit_stop_by_name('drag-data-delete')
121
123 """
124 Return the currently selected category name
125 """
126 iter = self.combo.get_active_iter ()
127
128 if not iter:
129 return None
130
131 return self.combo.get_model().get_value (iter, 0)
132
139
141 """
142 Reloads the current category
143 """
144 category_name = self.get_current_category()
145 log.info("Loading category: %s" % category_name)
146
147 self.dp_store.clear()
148
149 for dp in self.categories[category_name]:
150 self.dp_store.append ((dp.get_descriptive_icon(), dp.name, dp.get_key()))
151