1
2
3
4
5
6
7
8
9
10
11 import pygtk
12 pygtk.require("2.0")
13 import gtk, gobject
14 from iceprod.core.dataclasses import *
15 import logging
16
17 logger = logging.getLogger('GtkIceProdPostList')
18
20 """ The GUI class is the controller for our application """
21
22 fooname = 'foo'
23 fooclass = 'FOOBAR'
24 fooproject = 'iceprod.modules'
25
26 - def __init__(self,iconfig,pdb,gtkmod,title="Available IceProdPost Modules"):
27
28 self.iconfig = iconfig
29 self.pdb = pdb
30 self.gtkmod = gtkmod
31 self.printer = None
32 self.display()
33
34
35 self.root = gtk.Window(type=gtk.WINDOW_TOPLEVEL)
36 self.sw = gtk.ScrolledWindow()
37 self.root.set_title(title)
38 self.root.set_size_request(600, 475)
39
40
41 self.view = self.make_view( self.store )
42
43 b = gtk.Button(stock=gtk.STOCK_APPLY)
44 b.connect('clicked', self.commit_changes)
45 self.hbbox = gtk.HButtonBox()
46 self.hbbox.pack_start(b, False, False, 1)
47
48
49 self.sw.add(self.view)
50
51 self.vbox = gtk.VBox(False,0)
52 self.vbox.pack_start(self.sw,True,True,2)
53 self.vbox.pack_end(self.hbbox,False,False,2)
54 self.root.add(self.vbox)
55 self.root.show_all()
56 return
57
58 - def SetPrinter(self,printer):
59 self.printer = printer
60
61 - def SetParent(self,parent):
63
64 - def Print(self,txt):
65 if self.printer:
66 self.printer(txt)
67 else:
68 print txt
69
70
72 """ Sets up and populates gtk.TreeStore """
73 self.store = gtk.TreeStore( int, str, str, str, gobject.TYPE_BOOLEAN )
74 row = [0,self.fooname,self.fooclass, self.fooproject,False]
75 self.store.append(None, row )
76
77 if not self.pdb.cached and not self.pdb.connect(): return
78 modules = self.pdb.GetIceProdModules()
79 for m in modules:
80 if not self.iconfig.GetIceProdPost(m.GetName()):
81 row = [m.GetId(),m.GetName(), m.GetClass(),'iceprod.modules',False]
82 logger.debug('|'.join(map(str,row)))
83 self.store.append(None, row )
84
85 - def add_module(self, tv, path, viewcol):
86 """
87 Add IceProdPost
88 """
89 sel = tv.get_selection()
90 sel.select_path(path)
91 model, iter = sel.get_selected()
92 id = model.get_value(iter, 0)
93 name = model.get_value(iter, 1)
94 cname = model.get_value(iter, 2)
95 proj_name = "iceprod.modules"
96
97 newmod = IceProdPost()
98 newmod.SetName(name)
99 newmod.SetClass(cname)
100
101 if not self.pdb.cached and not self.pdb.connect(): return
102 parameters = self.pdb.GetParameters(int(id))
103 for p in parameters:
104 param = Parameter()
105 param.SetName(p.GetName())
106 param.SetType(p.GetType())
107 param.SetDescription(p.GetDescription())
108 param.SetValue(p.GetValue())
109 newmod.AddParameter(param)
110
111 self.iconfig.AddIceProdPost(newmod)
112 self.gtkmod.showmodules()
113 self.root.destroy()
114
115 - def commit_changes(self, widget, data=None):
116 model = self.store
117 self.mdict = {}
118 if not self.pdb.cached and not self.pdb.connect(): return
119 model.foreach(self.do_change)
120 return
121
122 - def do_change(self, model, path, iter,connect=True):
123 """
124 Add IceProdPost
125 """
126 if model[path][4]:
127 id = model[path][0]
128 name = model[path][1]
129 cname = model[path][2]
130
131 proj_name = "iceprod.modules"
132 proj = self.iconfig.GetProject(proj_name)
133
134 newmod = IceProdPost()
135 newmod.SetName(name)
136 newmod.SetClass(cname)
137
138 parameters = self.pdb.GetParameters(int(id))
139 for p in parameters:
140 param = Parameter()
141 param.SetName(p.GetName())
142 param.SetType(p.GetType())
143 param.SetDescription(p.GetDescription())
144 param.SetValue(p.GetValue())
145 newmod.AddParameter(param)
146
147 self.iconfig.AddIceProdPost(newmod)
148 self.gtkmod.showmodules()
149 self.root.destroy()
150
151 - def col_edited( self, cell, path, new_text, model , column):
152 """
153 Canges the name of the module
154 @todo: add type checking for input values
155 @todo: add descriptions
156 """
157 row = model[path]
158 row[column] = u'%s' % new_text
159
160
161 - def row_toggled( self,cell, path):
162 """
163 Sets the toggled state on the toggle button to true or false.
164 """
165 model = self.store
166 model[path][4] = not model[path][4]
167
168 if not model[path][4]:
169 self.renderer[1].set_property('editable', False)
170 self.renderer[2].set_property('editable', False)
171 self.renderer[3].set_property('editable', False)
172 return
173
174 if model[path][3] == self.fooproject:
175 self.renderer[3].set_property('editable', True)
176 self.renderer[3].connect( 'edited', self.col_edited,self.store,3)
177 if model[path][2] == self.fooclass:
178 self.renderer[2].set_property('editable', True)
179 self.renderer[2].connect( 'edited', self.col_edited,self.store,2)
180 if model[path][1] == self.fooname:
181 self.renderer[1].set_property('editable', True)
182 self.renderer[1].connect( 'edited', self.col_edited,self.store,1)
183
184
185 - def make_view( self, model ):
186 """ Form a view for the Tree Model """
187 self.view = gtk.TreeView( model )
188 self.view.connect('row-activated', self.add_module)
189
190
191
192 self.renderer = [None]*5
193 for i in range(4):
194 self.renderer[i] = gtk.CellRendererText()
195 self.renderer[4] = gtk.CellRendererToggle()
196 self.renderer[4].set_property('activatable', True)
197 self.renderer[4].connect( 'toggled', self.row_toggled)
198
199 self.column = [None]*5
200 self.column[0] = gtk.TreeViewColumn("DbID",self.renderer[0], text=0)
201 self.column[0].set_sort_column_id(0)
202 self.column[1] = gtk.TreeViewColumn("Default Name",self.renderer[1], text=1)
203 self.column[1].set_sort_column_id(1)
204 self.column[2] = gtk.TreeViewColumn("Class",self.renderer[2], text=2)
205 self.column[2].set_sort_column_id(2)
206 self.column[3] = gtk.TreeViewColumn("Project",self.renderer[3],text=3 )
207 self.column[4] = gtk.TreeViewColumn('Selected')
208 self.column[4].pack_start(self.renderer[4], True)
209 self.column[4].add_attribute( self.renderer[4], "active", 4)
210
211 for i in range(5):
212 self.view.append_column( self.column[i] )
213 return self.view
214