Package iceprod :: Package client :: Module GtkVector
[hide private]
[frames] | no frames]

Source Code for Module iceprod.client.GtkVector

  1  #!/bin/env python 
  2  # 
  3  """ 
  4    IceTray connections frame for GtkIcetraConfig application 
  5   
  6    copyright  (c) 2005 the icecube collaboration 
  7   
  8    @version: $Revision: $ 
  9    @date: $Date:  $ 
 10    @author: Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu> 
 11  """ 
 12   
 13  import pygtk 
 14  pygtk.require("2.0") 
 15  import gtk, gobject 
 16  from iceprod.core.dataclasses import * 
 17  import logging 
 18   
 19  logger = logging.getLogger('GtkVector') 
 20   
21 -class GtkVector:
22 """ The GUI class is the controller for our application """
23 - def __init__(self,cobj,parent):
24 25 self.cobj = cobj 26 self.parent = parent 27 self.store = InfoModel(cobj) 28 self.display = DisplayModel(cobj) 29 30 # setup the main window 31 self.root = gtk.Window(type=gtk.WINDOW_TOPLEVEL) 32 self.root.connect("delete_event", self.parent.redraw) 33 self.root.set_title("Vector Contents") 34 self.root.set_size_request(400, 500) 35 36 # Add scrolled window 37 self.sw = gtk.ScrolledWindow() 38 39 # Get the model and attach it to the view 40 self.mdl = self.store.get_model() 41 self.view = self.display.make_view( self.mdl ) 42 self.vbox = gtk.VBox() 43 self.sw.add(self.view) 44 self.vbox.pack_start(self.sw) 45 46 self.hbbox = gtk.HButtonBox() 47 self.b0 = gtk.Button('Add Entry') 48 self.b1 = gtk.Button('Delete Entry') 49 self.b0.connect('clicked', self.display.add_entry,self.store) 50 self.b1.connect('clicked', self.display.delete_entry,self.mdl) 51 self.hbbox.pack_start(self.b0, False, False, 1) 52 self.hbbox.pack_start(self.b1, False, False, 1) 53 54 self.vbox.pack_start(self.hbbox, False) 55 # Add our view into the main window 56 self.root.add(self.vbox) 57 self.root.show_all() 58 return
59 60
61 -class InfoModel:
62 """ The model class holds the information we want to display """ 63
64 - def __init__(self,cobj):
65 """ Sets up and populates our gtk.TreeStore """ 66 self.tree_store = gtk.ListStore( int, str, str , str) 67 self.cobj = cobj 68 self.redraw()
69
70 - def redraw(self):
71 72 self.tree_store.clear() 73 for i in range(len(self.cobj.GetValue())): 74 p = self.cobj.GetValue()[i] 75 ptype = self.cobj.GetType().strip('v') 76 if ptype == 'OMKey': 77 value = "OMKey(%s,%s)" % (p.stringid,p.omid) 78 row = [i, ptype, value, '' ] 79 else: 80 row = [i, ptype,p.GetValue(), p.GetUnit() or '' ] 81 self.tree_store.append( row ) 82 logger.debug(str(row))
83 84
85 - def add_entry(self, val,index):
86 row = [index,self.cobj.GetType().strip('v'),val.GetValue(),val.GetUnit() or '' ] 87 self.tree_store.append( row ) 88 logger.debug(str(row))
89
90 - def get_model(self):
91 """ Returns the model """ 92 if self.tree_store: 93 return self.tree_store 94 else: 95 return None
96
97 -class DisplayModel:
98 """ Displays the Info_Model model in a view """
99 - def __init__(self,cobj):
100 self.cobj = cobj 101 self.tips = gtk.Tooltips() 102 self.tips.enable()
103 104
105 - def on_selection_changed(self,selection):
106 pname = None 107 108 model, iter = selection.get_selected() 109 if iter: 110 try: 111 pindex = model.get_value(iter, 0) 112 ptype = model.get_value(iter, 1) 113 param = self.cobj.GetValue()[pindex] 114 logger.debug("selected: %s %s" % (pindex,ptype)) 115 116 self.tips.disable() 117 self.tips.set_tip(self.view, param.GetDescription()) 118 self.tips.enable() 119 except: pass
120 121
122 - def make_view( self, model ):
123 """ Form a view for the Tree Model """ 124 self.view = gtk.TreeView( model ) 125 self.selection = self.view.get_selection() 126 self.selection.connect('changed', self.on_selection_changed) 127 128 # setup the text cell renderer and allows these 129 # cells to be edited. 130 self.renderer0 = gtk.CellRendererText() 131 self.renderer0.set_property( 'editable', False) 132 133 self.renderer1 = gtk.CellRendererText() 134 self.renderer1.set_property( 'editable', False) 135 136 self.renderer2 = gtk.CellRendererText() 137 self.renderer2.set_property( 'editable', True ) 138 self.renderer2.connect( 'edited', self.col2_edited_cb, model ) 139 140 self.renderer3 = gtk.CellRendererText() 141 self.renderer3.set_property( 'editable', True ) 142 self.renderer3.connect( 'edited', self.col3_edited_cb, model ) 143 144 self.column0 = gtk.TreeViewColumn("Index",self.renderer0, text=0) 145 self.column1 = gtk.TreeViewColumn("Type",self.renderer1, text=1) 146 self.column2 = gtk.TreeViewColumn("Value",self.renderer2,text=2 ) 147 self.column3 = gtk.TreeViewColumn("Unit",self.renderer3,text=3 ) 148 149 self.view.append_column( self.column0 ) 150 self.view.append_column( self.column1 ) 151 self.view.append_column( self.column2 ) 152 self.view.append_column( self.column3 ) 153 return self.view
154 155
156 - def col2_edited_cb( self, cell, path, new_text, model ):
157 """ 158 Canges the value of the entry 159 @todo: add type checking for input values 160 @todo: add descriptions 161 """ 162 logger.debug("Change '%s' to '%s'" % (model[path][2], new_text)) 163 row = model[path][0] 164 165 if row < len(self.cobj.GetValue()): 166 # Some kind of type checking should happen here 167 entry = self.cobj.GetValue()[row] 168 try: 169 unit = model[path][3] 170 if self.cobj.GetType().startswith('OMKey'): 171 if new_text.startswith("OMKey"): 172 val = new_text.replace("OMKey",'').replace("(",'') 173 val = val.replace(")",'').split(",") 174 self.cobj.GetValue()[row] = pyOMKey(val[0],val[1]) 175 else: 176 entry.SetValue(new_text) 177 if unit: 178 entry.SetUnit(unit) 179 model[path][2] = u'%s' % new_text 180 except Exception,e: 181 logger.error(str(e)+": unable to parse value '%s'"% new_text) 182 else: 183 logger.error("index %d out of bounds: %d" % ( row , len(self.cobj.GetValue())))
184
185 - def col3_edited_cb( self, cell, path, new_text, model ):
186 """ 187 Canges the value of the entry 188 @todo: add type checking for input values 189 @todo: add descriptions 190 """ 191 logger.debug("Change '%s' to '%s'" % (model[path][3], new_text)) 192 row = model[path][0] 193 if row < len(self.cobj.GetValue()) and new_text: 194 param = self.cobj.GetValue()[row] 195 if param.GetType().startswith('OMKey'): 196 logger.error("type '%s' - does not accept I3Units"%param.GetType()) 197 return 198 elif param.GetType() in VectorTypes: 199 map(lambda x:x.SetUnit(u'%s' % new_text),param.GetValue()) 200 else: 201 param.GetValue().SetUnit(u'%s' % new_text) 202 model[path][3] = u'%s' % new_text
203
204 - def add_entry(self, b, model):
205 """ 206 Manually add a entry 207 """ 208 val = Value('NULL') 209 index = len(self.cobj.GetValue()) 210 self.cobj.GetValue().append(val) 211 model.add_entry(val,index)
212 213
214 - def delete_entry(self, b, mymodel):
215 sel = self.view.get_selection() 216 model, iter = sel.get_selected() 217 index = mymodel.get_value(iter,0) 218 logger.debug("deleting %d" % index) 219 del self.cobj.GetValue()[index] 220 model.remove(iter)
221