Package conduit :: Package hildonui :: Module List
[hide private]

Source Code for Module conduit.hildonui.List

  1  import gtk 
  2  import logging 
  3  log = logging.getLogger("hildonui.List") 
  4   
  5  import conduit 
  6   
7 -class DataProviderBox(gtk.VBox):
8 DND_TARGETS = [ 9 ('conduit/element-name', 0, 0) 10 ]
11 - def __init__(self):
12 gtk.VBox.__init__(self) 13 14 # MODEL 15 # keep a dict of category - dp list 16 self.categories = {} 17 self.combo = gtk.combo_box_new_text () 18 self.dp_store = gtk.ListStore(gtk.gdk.Pixbuf, str, str) 19 # populate with dataproviders 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 # VIEW 27 # category combo 28 self.combo.connect ("changed", self.on_combo_changed) 29 self.pack_start(self.combo, False, False) 30 # tree view 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 # Dnd 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 #self.connect('drag-begin', self.on_drag_begin) 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
54 - def on_dataprovider_available(self, loader, dataprovider):
55 if dataprovider.enabled: 56 self.add_dataprovider (dataprovider)
57
58 - def on_dataprovider_unavailable (self, loader, dataprovider):
59 self.remove_dataprovider (dataprovider)
60
61 - def add_dataproviders(self, dpw=[]):
62 """ 63 Adds all enabled dataproviders to the model 64 """ 65 #Only display enabled modules 66 module_wrapper_list = [m for m in dpw if m.enabled] 67 68 #Add them to the module 69 for mod in module_wrapper_list: 70 self.add_dataprovider(mod)
71
72 - def add_dataprovider (self, dpw):
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
88 - def remove_dataprovider (self, dpw):
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
100 - def on_combo_changed (self, combo):
101 """ 102 Reload the category if the combo changes 103 """ 104 self.reload_category ()
105
106 - def on_drag_data_get (self, treeview, context, selection, target_id, etime):
107 treeselection = treeview.get_selection() 108 model, iter = treeselection.get_selected() 109 #get the classname 110 data = model.get_value(iter, 2) 111 112 log.debug("Dragging %s" % data) 113 114 selection.set(selection.target, 8, data)
115
116 - def on_drag_data_delete (self, context, etime):
117 """ 118 DnD magic. do not touch 119 """ 120 self.tree.emit_stop_by_name('drag-data-delete')
121
122 - def get_current_category (self):
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
133 - def reload_category_if_current (self, category_name):
134 """ 135 Only reloads the category if the given name is the current one 136 """ 137 if category_name == self.get_current_category(): 138 self.reload_category()
139
140 - def reload_category (self):
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