PyScore

001: # -*- python -*-
002: #### registergui.py #### python package PyScore.register module registergui ####
003: 
004: # PyScore
005: # a race scoring programme
006: # written by Matt Draisey
007: # 2004 April 6
008: 
009: #### registergui.py #### python package PyScore.register module registergui ####
010: 
011: import sys,os
012: import gtk,gtk.glade,gobject
013: 
014: ######## ######## ######## import controllers ######## ######## ########
015: 
016: from register import framescon,dataframes
017: 
018: ######## ######## containers for data frame organization ######## ########
019: 
020: class NodeSelectionTree(object): pass
021: 
022: class NodeDataFrame(object): pass
023: 
024: ######## ######## ######## the main window widget ######## ######## ########
025: 
026: class RegisterWindow(object):
027:     def __init__(self):
028:         self.widgets=gtk.glade.XML(
029:             os.path.join(sys.path[0],'glade/registerfat.pyscore.glade')
030:         )
031:         self.window=self.widgets.get_widget('register_window1')
032:         #self.about=self.widgets.get_widget('dialog1')
033:         #self.about.set_transient_for(self.window)
034:         self.widgets.signal_autoconnect(self)
035: 
036:         self.init_data_frames()
037: 
038:         self.page={}
039:         self.page["quickform"]=QuickformPage(self,"quickform")
040:         self.page["detail"]=DetailPage(self,"detail")
041: 
042:         self.sortbutton=self.widgets.get_widget('detail_button5')
043:         self.sortbutton.connect(
044:             "clicked",framescon.on_sortbutton_clicked,self,
045:         )
046: 
047:         self.mergebutton=self.widgets.get_widget('detail_button6')
048:         self.mergebutton.connect(
049:             "clicked",framescon.on_mergebutton_clicked,self,
050:         )
051: 
052:         self.purgebutton=self.widgets.get_widget('detail_button7')
053:         self.purgebutton.connect(
054:             "clicked",framescon.on_purgebutton_clicked,self,
055:         )
056: 
057:     def gtk_main_quit(*x): gtk.main_quit()
058: 
059:     def on_quit1_activate(*x): gtk.main_quit()
060: 
061:     def on_delete_event_activate(*x): gtk.main_quit()
062: 
063:     def on_about1_activate(self,menuitem):
064:         self.about.show_all()
065:         return True
066: 
067:     def on_closebutton1_clicked(self,*x):
068:         self.about.hide_all()
069:         return True
070: 
071:     def init_data_frames(self):
072:         self.boid=NodeDataFrame()
073:         self.cert=NodeDataFrame()
074:         self.flco=NodeDataFrame()
075:         self.regi=NodeDataFrame()
076: 
077:         self.cert.allauthorities=gtk.ListStore(str)
078:         for a in ["CSCA","DRYA","ECPHRF","ILYA"]:
079:             self.cert.allauthorities.append((a,))
080:         self.cert.allhandicapped={"DRYA":True,"ECPHRF":True,"ILYA":True}
081:         self.cert.allonedesign={"CSCA":True}
082: 
083:         self.flco.alldivisions=gtk.ListStore(str)
084:         for d in ["PHRF A","PHRF B","PHRF C","JOG A","JOG B","Shark"]:
085:             self.flco.alldivisions.append((d,))
086:         self.flco.allfleets=gtk.ListStore(str)
087:         for f in ["Series","Series Silver","Casual"]:
088:             self.flco.allfleets.append((f,))
089: 
090:     def show(self):
091:         dataframes.init_boids_model(self.page.values())
092:         dataframes.init_bcfrs_model(self.page["detail"])
093:         self.window.show_all()
094: 
095: ######## ######## ######## tree views ######## ######## ########
096: 
097: def append_columns(view,columns,**extras):
098:     for (col,(name,field,xalign)) in enumerate(columns):
099:         renderer=gtk.CellRendererText()
100:         renderer.set_property("xalign",xalign)
101:         column=gtk.TreeViewColumn(name,renderer,text=field,**extras)
102:         column.set_resizable(False)
103:         view.append_column(column)
104: 
105: ######## ######## pages of the main register window ######## ########
106: 
107: class RegisterPage(object):
108:     """Pages of the main register window."""
109: 
110:     def __init__(self,parent,pagename):
111:         self.parent=parent
112:         self.pagename=pagename
113:         self.widget=self.pw('_page_box')
114: 
115:         self.init_selection_trees()
116:         self.init_data_frames()
117: 
118:     def pw(self,widgetname):
119:         return self.parent.widgets.get_widget(
120:             '%s_%s'%(self.pagename,widgetname)
121:         )
122: 
123:     def pwn(self,widgetname,number):
124:         return self.parent.widgets.get_widget(
125:             '%s_%s%i'%(self.pagename,widgetname,number)
126:         )
127: 
128:     def get_view(self,depth,columns,**extras):
129:         try:
130:             number={"boid":1,"cert":2,"flco":3,"regi":4,"bcfr":5}[depth]
131:         except KeyError:
132:             return
133:         view=self.pwn("treeview",number)
134:         append_columns(view,columns,**extras)
135:         selection=view.get_selection()
136:         selection.set_mode(gtk.SELECTION_BROWSE)
137:         return view
138: 
139:     def init_selection_trees(self):
140:         self.boids=NodeSelectionTree()
141:         self.boids.view=self.get_view("boid",[
142:             ("Sail Number",10,1.0),
143:             ("Boat Name",11,0.0),
144:         ],strikethrough=7)
145:         self.certs=NodeSelectionTree()
146:         self.flcos=NodeSelectionTree()
147:         self.regis=NodeSelectionTree()
148: 
149:         self.selectiontrees=[self.boids,self.certs,self.flcos,self.regis]
150: 
151:     def init_data_frames(self):
152:         self.boid=NodeDataFrame()
153:         self.cert=NodeDataFrame()
154:         self.flco=NodeDataFrame()
155:         self.regi=NodeDataFrame()
156: 
157:         self.dataframes=[self.boid,self.cert,self.flco,self.regi]
158: 
159: class QuickformPage(RegisterPage):
160:     def __init__(self,*p,**pp):
161:         RegisterPage.__init__(self,*p,**pp)
162: 
163:     def init_selection_trees(self,*p,**pp):
164:         RegisterPage.init_selection_trees(self,*p,**pp)
165: 
166:     def init_data_frames(self,*p,**pp):
167:         RegisterPage.init_data_frames(self,*p,**pp)
168: 
169:         self.boid.label=self.pwn('label',1)
170: 
171: class DetailPage(RegisterPage):
172:     def __init__(self,*p,**pp):
173:         RegisterPage.__init__(self,*p,**pp)
174: 
175:         for (depth,(nodetree,nodeframe)) in enumerate(
176:             zip(self.selectiontrees,self.dataframes)
177:         ): nodetree.view.connect(
178:             "cursor-changed",framescon.on_detail_cursor_changed,
179:             self,depth,nodetree,nodeframe,
180:         )
181: 
182:     def init_selection_trees(self,*p,**pp):
183:         RegisterPage.init_selection_trees(self,*p,**pp)
184: 
185:         self.boids.view.connect(
186:             "cursor-changed",framescon.on_browse_boids_cursor_changed,self,
187:         )
188: 
189:         self.bcfrs=NodeSelectionTree()
190:         self.bcfrs.view=self.pwn("treeview",5)
191:         append_columns(self.bcfrs.view,[("Register Entry",9,0.0)],style=5)
192:         self.bcfrs.view.connect(
193:             "cursor-changed",framescon.on_bcfrs_cursor_changed,self,
194:         )
195: 
196:         self.certs.view=self.get_view(
197:             "cert",[("Certification",11,0.0)],strikethrough=7
198:         )
199: 
200:         self.flcos.view=self.get_view("flco",[
201:             ("Class and Division",10,1.0),
202:             ("Series Fleet or Casual Configuration",11,0.0),
203:         ],strikethrough=7)
204: 
205:         self.regis.view=self.get_view(
206:             "regi",[("Registration",11,0.0)],strikethrough=7
207:         )
208: 
209:         self.certs.model=None
210:         self.certs.view.set_model()
211: 
212:         self.flcos.model=None
213:         self.flcos.view.set_model()
214: 
215:         self.regis.model=None
216:         self.regis.view.set_model()
217: 
218:     def init_data_frames(self,*p,**pp):
219:         RegisterPage.init_data_frames(self,*p,**pp)
220: 
221:         self.boid.box=[self.pwn('entry',x) for x in range(1,5)]
222: 
223:         self.cert.combo=self.pwn('entry',5)
224:         self.cert.combo.set_model(self.parent.cert.allauthorities)
225:         self.cert.box=\
226:             [self.cert.combo.child]+\
227:             [self.pwn('entry',x) for x in range(6,8)]
228:         self.cert.radio=[self.pwn('radiobutton',x) for x in range(1,4)]
229: 
230:         self.flco.combo=[self.pwn('entry',x) for x in range(8,10)]
231:         self.flco.combo[0].set_model(self.parent.flco.alldivisions)
232:         self.flco.combo[1].set_model(self.parent.flco.allfleets)
233:         self.flco.box=\
234:             [self.flco.combo[1].child]+\
235:             [self.pwn('entry',x) for x in range(10,13)]
236:         self.flco.radio=[self.pwn('radiobutton',x) for x in range(4,7)]
237: 
238:         self.regi.combo=[self.pwn('entry',x) for x in range(13,15)]
239:         self.regi.radio=[self.pwn('radiobutton',x) for x in range(7,11)]
240:         self.regi.box=self.pwn('entry',15)
241: 
242: 
243:         self.boid.check=self.pwn('checkbutton',1)
244:         self.boid.label=self.pwn('label',1)
245:         self.boid.newbutton=self.pwn('button',1)
246:         self.boid.frames=[self.pwn('dataframe',1),self.pwn('selection',2)]
247:         self.boid.check.connect(
248:             "toggled",framescon.on_boid_check_toggled,self,
249:         )
250:         self.boid.newbutton.connect(
251:             "clicked",framescon.on_boid_newbutton_clicked,self,
252:         )
253:         for k in range(4): self.boid.box[k].connect(
254:             "changed",framescon.on_boid_entrybox_changed,self,k,
255:         )
256: 
257:         self.cert.check=self.pwn('checkbutton',2)
258:         self.cert.label=self.pwn('label',2)
259:         self.cert.newbutton=self.pwn('button',2)
260:         self.cert.frames=[self.pwn('dataframe',2),self.pwn('selection',3)]
261:         self.cert.check.connect(
262:             "toggled",framescon.on_cert_check_toggled,self,
263:         )
264:         self.cert.newbutton.connect(
265:             "clicked",framescon.on_cert_newbutton_clicked,self,
266:         )
267:         for k in range(2): self.cert.box[k].connect(
268:             "changed",framescon.on_cert_box_changed,self,k,
269:         )
270:         for k in range(3): self.cert.radio[k].connect(
271:             "toggled",framescon.on_cert_radiobutton_toggled,
272:             self,k,
273:         )
274: 
275:         self.flco.check=self.pwn('checkbutton',3)
276:         self.flco.label=self.pwn('label',3)
277:         self.flco.newbutton=self.pwn('button',3)
278:         self.flco.frames=[self.pwn('dataframe',3),self.pwn('selection',4)]
279:         self.flco.check.connect(
280:             "toggled",framescon.on_flco_check_toggled,self,
281:         )
282:         self.flco.newbutton.connect(
283:             "clicked",framescon.on_flco_newbutton_clicked,self,
284:         )
285:         for k in range(1): self.flco.combo[k].connect(
286:             "changed",framescon.on_flco_combobox_changed,self,k,
287:         )
288:         for k in range(2): self.flco.box[k].connect(
289:             "changed",framescon.on_flco_entrybox_changed,self,k,
290:         )
291: 
292:         self.regi.check=self.pwn('checkbutton',4)
293:         self.regi.label=self.pwn('label',4)
294:         self.regi.newbutton=self.pwn('button',4)
295:         self.regi.frames=[self.pwn('dataframe',4)]
296:         self.regi.check.connect(
297:             "toggled",framescon.on_regi_check_toggled,self,
298:         )
299:         self.regi.newbutton.connect(
300:             "clicked",framescon.on_regi_newbutton_clicked,self,
301:         )
302:         for i in range(4): self.regi.radio[i].connect(
303:             "toggled",framescon.on_regi_radiobutton_toggled,self,i,
304:         )
305:         for i in range(2): self.regi.combo[i].connect(
306:             "changed",framescon.on_regi_combobox_changed,self,i,
307:         )
308: 
309: ######## ######## ######## the widget instances ######## ######## ########
310: 
311: def window():
312:     global registerwindow
313:     registerwindow=RegisterWindow()
314:     registerwindow.show()
315:     return registerwindow
316: 
317: #### registergui.py #### python package PyScore.register module registergui ####