PyScore

001: # -*- python -*-
002: ## framescon.py ## python package PyScore.register module frames.controller ##
003: 
004: # PyScore
005: # a race scoring programme
006: # written by Matt Draisey
007: # 2004 April 6
008: 
009: ## framescon.py ## python package PyScore.register module frames.controller ##
010: 
011: import datetime
012: import gtk
013: from register import basetree,dataframes,validdata
014: 
015: #import gtk,gobject,pango
016: #from register import basetree,dataframes
017: #from utility import utils
018: 
019: ######## ######## ######## gui callbacks ######## ######## ########
020: 
021: def on_browse_boids_cursor_changed(tree,page):
022:         assert page.pagename in ["quickform","detail"] and tree==page.boids.view
023:         (r,c)=tree.get_cursor()
024:         rref=gtk.TreeRowReference(
025:                 basetree.model,page.bcfrs.model.convert_path_to_child_path(r),
026:         )
027:         if rref<>None:
028:                 r=page.bcfrs.model.convert_child_path_to_path(rref.get_path())
029:                 page.bcfrs.view.collapse_all()
030:                 page.bcfrs.view.expand_to_path(r)
031:                 page.bcfrs.view.expand_row(r,True)
032:                 page.bcfrs.view.set_cursor(r)
033:                 page.bcfrs.view.scroll_to_cell(r,None,True,0.05,0.0)
034:         else:
035:                 page.bcfrs.view.get_selection().unselect_all()
036:         #page.boids.view.get_selection().unselect_all()
037: 
038: def on_detail_cursor_changed(tree,page,depth,nodetree,nodeframe):
039:         assert page.pagename=="detail" and tree==nodetree.view
040:         (r,c)=tree.get_cursor()
041:         rref=gtk.TreeRowReference(
042:                 basetree.model,nodetree.model.convert_path_to_child_path(r),
043:         )
044:         dataframes.load_at_depth(page,depth,rref)
045: 
046: def on_bcfrs_cursor_changed(tree,page):
047:         assert page.pagename=="detail" and tree==page.bcfrs.view
048:         (r,c)=tree.get_cursor()
049:         depth=page.bcfrs.model.get_value(page.bcfrs.model.get_iter(r),4)
050:         rref=gtk.TreeRowReference(
051:                 basetree.model,page.bcfrs.model.convert_path_to_child_path(r),
052:         )
053:         dataframes.load_at_depth(page,depth,rref)
054: 
055: #       bookpage=page.book.get_nth_page(depth)
056: #       bookpage.set_sensitive(True)
057: #       page.book.get_tab_label(bookpage).set_sensitive(True)
058: #
059: #       page.book.set_current_page(depth)
060: #
061: #       for d in range(0,depth)+range(depth+1,4):
062: #               bookpage=page.book.get_nth_page(d)
063: #               bookpage.set_sensitive(False)
064: #               page.book.get_tab_label(bookpage).set_sensitive(False)
065: #
066: #               dataframes.clear_at_depth(page,d)
067: 
068: ######## ######## ######## gui callbacks ######## ######## ########
069: 
070: def on_boid_check_toggled(box,page):
071:     assert page.pagename in ["detail"]
072:     rref=page.boid.treeref
073:     if rref<>None:
074:         baserow=basetree.model[rref.get_path()]
075:         baserow[7]=not page.boid.check.get_active()
076:     
077: def on_boid_newbutton_clicked(button,page):
078:     assert page.pagename in ["detail"]
079:     try:
080:         position=page.boid.treeref.get_path()[-1]
081:     except AttributeError:
082:         position=page.boids.model.iter_n_children(None)
083:     validdata.new_boid(position)
084:     page.boids.view.set_cursor(position)
085: 
086: def on_boid_entrybox_changed(box,page,k):
087:     assert page.pagename in ["quickform","detail"] and box==page.boid.box[k]
088:     if k&-2==0:
089:         title=dataframes.boid_title_from_input(page)
090:         page.boid.label.set_text("'%s'"%(title,))
091: 
092:     if k==2:
093:         validdata.limit_cert(page,page.boid.box[k].get_text().strip())
094: 
095:     rref=page.boid.treeref
096:     if rref<>None:
097:         baserow=basetree.model[rref.get_path()]
098:         if k&-2==0:
099:             baserow[9]="Boat Identification: '%s'"%(title,)
100:         baserow[10+k]=page.boid.box[k].get_text().strip()
101: 
102:         #basetree.model.set(
103:         #       basetree.model.get_iter(rref.get_path()),
104:         #       8,"Boat Identification: '%s'"%(title,),
105:         #       9+k,boid.box[k].get_text().strip()
106:         #)
107: 
108: def on_cert_check_toggled(box,page):
109:     assert page.pagename in ["detail"]
110:     rref=page.cert.treeref
111:     if rref<>None:
112:         baserow=basetree.model[rref.get_path()]
113:         baserow[7]=not page.cert.check.get_active()
114:     
115: def on_cert_newbutton_clicked(button,page):
116:     assert page.pagename in ["detail"]
117:     try:
118:         position=page.cert.treeref.get_path()[-1]
119:     except AttributeError:
120:         position=page.certs.model.iter_n_children(None)
121:     validdata.new_cert(page.boid.treeref.get_path(),position)
122:     page.certs.view.set_cursor(position)
123: 
124: def on_cert_box_changed(box,page,k):
125:     assert page.pagename in ["detail"] and box==page.cert.box[k]
126:     if k==0:
127:         authority=page.cert.box[0].get_text()
128:         title=dataframes.cert_title_from_input(page)
129:         page.cert.label.set_text("'%s'"%(title,))
130:         # normalize
131:         authorityd=dict([
132:             (a.upper(),j)
133:             for (j,(a,)) in enumerate(page.cert.combo.get_model())
134:         ])
135:         a=authority.upper()
136:         try:
137:             page.cert.combo.set_active(authorityd[a])
138:         except KeyError:
139:             pass
140:         if a in page.parent.cert.allhandicapped:
141:             page.cert.radio[0].set_sensitive(True)
142:             page.cert.radio[1].set_sensitive(True)
143:             page.cert.radio[2].set_sensitive(False)
144:         elif a in page.parent.cert.allonedesign:
145:             page.cert.radio[0].set_sensitive(False)
146:             page.cert.radio[1].set_sensitive(False)
147:             page.cert.radio[2].set_sensitive(True)
148:         else:
149:             page.cert.radio[0].set_sensitive(True)
150:             page.cert.radio[1].set_sensitive(True)
151:             page.cert.radio[2].set_sensitive(True)
152:     else: #if k==1
153:         rating=page.cert.box[1].get_text()
154:         title=dataframes.cert_title_from_input(page)
155:         page.cert.label.set_text("'%s'"%(title,))
156:         try:
157:             page.cert.box[2].set_text(str(int(rating)%3))
158:         except ValueError:
159:             page.cert.box[2].set_text("0")
160: 
161:     rref=page.cert.treeref
162:     if rref<>None:
163:         baserow=basetree.model[rref.get_path()]
164:         if k==0:
165:             baserow[9]="Certification: '%s'"%(title,)
166:             baserow[11]=title
167:             baserow[12]=authority
168:         elif k==1:
169:             baserow[11]=title
170:             baserow[13]=rating
171: 
172: def on_cert_radiobutton_toggled(radiobutton,page,k):
173:     assert page.pagename in ["detail"] and radiobutton==page.cert.radio[k]
174:     if radiobutton.get_active():
175:         title=dataframes.cert_title_from_input(page)
176:         page.cert.label.set_text("'%s'"%(title,))
177: 
178:         rref=page.cert.treeref
179:         if rref<>None:
180:             baserow=basetree.model[rref.get_path()]
181:             baserow[9]="Certification: '%s'"%(title,)
182:             baserow[11]=title
183:             baserow[14]=k
184: 
185: def on_flco_check_toggled(box,page):
186:     assert page.pagename in ["detail"]
187:     rref=page.flco.treeref
188:     if rref<>None:
189:         baserow=basetree.model[rref.get_path()]
190:         baserow[7]=not page.flco.check.get_active()
191:     
192: def on_flco_newbutton_clicked(button,page):
193:     assert page.pagename in ["detail"]
194:     try:
195:         position=page.flco.treeref.get_path()[-1]
196:     except AttributeError:
197:         position=page.flcos.model.iter_n_children(None)
198:     validdata.new_flco(page.cert.treeref.get_path(),position)
199:     page.flcos.view.set_cursor(position)
200: 
201: def on_flco_combobox_changed(box,page,k):
202:     assert page.pagename in ["detail"] and k==0 and box==page.flco.combo[k]
203:     title=dataframes.flco_title_from_input(page)
204:     page.flco.label.set_text("'%s'"%(title,))
205: 
206:     rref=page.flco.treeref
207:     if rref<>None:
208:         baserow=basetree.model[rref.get_path()]
209:         division={
210:             0:'PHRF A',1:'PHRF B',2:'PHRF C',
211:             3:'JOG A',4:'JOG B',5:'Shark',-1:'Unknown',
212:         }[page.flco.combo[0].get_active()]
213:         baserow[9]="Fleet Configuration: '%s'"%(title,)
214:         baserow[10]=division
215: 
216: def on_flco_entrybox_changed(box,page,k):
217:     assert page.pagename in ["detail"] and box==page.flco.box[k]
218:     if k==0:
219:         coname=page.flco.box[k].get_text()
220:         title=dataframes.flco_title_from_input(page)
221:         page.flco.label.set_text("'%s'"%(title,))
222:         # normalize
223:         fleetd=dict([
224:             (c.upper(),j)
225:             for (j,(c,))
226:             in enumerate(page.flco.combo[0].get_model())
227:         ])
228:         try:
229:             page.flco.combo[1].set_active(fleetd[coname.upper()])
230:         except KeyError:
231:             pass
232:     else: #if k==1
233:         try:
234:             deltarating=int(page.flco.box[1].get_text())
235:         except ValueError:
236:             deltarating=0
237: 
238:     rref=page.flco.treeref
239:     if rref<>None:
240:         path=rref.get_path()
241:         baserow=basetree.model[path]
242:         if k==0:
243:             baserow[9]="Fleet Configuration: '%s'"%(title,)
244:             baserow[11]=coname
245:             #baserow[12]=str(enumstat.FleetEnum(coname))
246:         else: #if k==1
247:             baserow[13]=str(deltarating)
248:             c4=basetree.model[path[:2]][13]
249:             try:
250:                 rating=int(c4)+deltarating
251:             except ValueError:
252:                 rating=0
253:                 page.flco.box[2].set_text("")
254:                 page.flco.box[3].set_text("0")
255:             else:
256:                 page.flco.box[2].set_text(str(rating))
257:                 page.flco.box[3].set_text(str(rating%3))
258: 
259: def on_regi_check_toggled(box,page):
260:     assert page.pagename in ["detail"]
261:     rref=page.regi.treeref
262:     if rref<>None:
263:         baserow=basetree.model[rref.get_path()]
264:         baserow[7]=not page.regi.check.get_active()
265:     
266: def on_regi_newbutton_clicked(button,page):
267:     assert page.pagename in ["detail"]
268:     try:
269:         position=page.regi.treeref.get_path()[-1]
270:     except AttributeError:
271:         position=page.regis.model.iter_n_children(None)
272:     validdata.new_regi(page.flco.treeref.get_path(),position)
273:     page.regis.view.set_cursor(position)
274: 
275: def on_regi_radiobutton_toggled(radiobutton,page,k):
276:     assert page.pagename in ["detail"] \
277:     and radiobutton==page.regi.radio[k]
278:     if radiobutton.get_active():
279:         title=dataframes.regi_title_from_input(page)
280:         page.regi.label.set_text("'%s'"%(title,))
281:         rref=page.regi.treeref
282:         if rref<>None:
283:             basetree.model.set(
284:                 basetree.model.get_iter(rref.get_path()),
285:                 9,"Registration: '%s'"%(title,),
286:                 11,title,
287:                 14,int(k),
288:             )
289: 
290: def on_regi_combobox_changed(combobox,page,k):
291:     assert page.pagename in ["detail"] and combobox==page.regi.combo[k]
292:     title=dataframes.regi_title_from_input(page)
293:     page.regi.label.set_text("'%s'"%(title,))
294:     rref=page.regi.treeref
295:     if rref<>None:
296:         r=combobox.get_active()
297:         basetree.model.set(
298:             basetree.model.get_iter(rref.get_path()),
299:             9,"Registration: '%s'"%(title,),
300:             11,title,
301:             12+k,str(r+1)
302:         )
303: 
304: ######## ######## Detail Page Purge Button Callbacks ######## ########
305: 
306: def on_recheck_clicked(button):
307:     def rechecker(model,path,i):
308:         basetree.model.set_value(i,7,False)
309:     basetree.model.foreach(rechecker)
310: 
311: def on_sortbutton_clicked(button,window):
312:     pass
313: 
314: def on_mergebutton_clicked(button,window):
315:     pass
316: 
317: def on_purgebutton_clicked(button,window):
318:     def recursive_purge(i):
319:         basepath=basetree.model.get_path(i)
320:         if basetree.model.get_value(i,7):
321:             basetree.model.remove(i)
322:             try:
323:                 return basetree.model.get_iter(basepath)
324:             except ValueError:
325:                 return None
326:         else:
327:             j=basetree.model.iter_children(i)
328:             while j:
329:                 j=recursive_purge(j)
330:             i=basetree.model.get_iter(basepath)
331:             return basetree.model.iter_next(i)
332: 
333:     j=basetree.model.get_iter_first()
334:     while j:
335:         j=recursive_purge(j)
336: 
337:     for page in window.page.values():
338:         for (frame,clearer) in {
339:             page.boid:dataframes.clear_boat_identification,
340:             page.cert:dataframes.clear_certification,
341:             page.flco:dataframes.clear_fleet_configuration,
342:             page.regi:dataframes.clear_registration,
343:         }.items():
344:             try:
345:                 if frame.treeref and not frame.treeref.valid():
346:                     clearer(page)
347:             except AttributeError:
348:                 pass
349: 
350: ## framescon.py ## python package PyScore.register module frames.controller ##