1
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
22 """ The GUI class is the controller for our application """
24
25 self.cobj = cobj
26 self.parent = parent
27 self.store = InfoModel(cobj)
28 self.display = DisplayModel(cobj)
29
30
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
37 self.sw = gtk.ScrolledWindow()
38
39
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
56 self.root.add(self.vbox)
57 self.root.show_all()
58 return
59
60
62 """ The model class holds the information we want to display """
63
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
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
91 """ Returns the model """
92 if self.tree_store:
93 return self.tree_store
94 else:
95 return None
96
98 """ Displays the Info_Model model in a view """
100 self.cobj = cobj
101 self.tips = gtk.Tooltips()
102 self.tips.enable()
103
104
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
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
129
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
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
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
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