PyScore

001: # -*- python -*-
002: # numbersscon.py # python package PyScore.timesheet module numbers.controller #
003: 
004: # PyScore
005: # a race scoring programme
006: # written by Matt Draisey
007: # 2004 April 6
008: 
009: reloadable=True
010: reloadables=[]
011: 
012: # numbersscon.py # python package PyScore.timesheet module numbers.controller #
013: 
014: import gtk,pango
015: from treemodel import sorttab
016: from utility import utils,guiutils
017: from timesheet import entriesmod as modeller
018: from timesheet import numbersview as view
019: 
020: # the initial model and model constants
021: 
022: mastermodel=sorttab.SortMaster()
023: 
024: for n in modeller.iter_numbers():
025:     mastermodel.add_to_multiset(n)
026: 
027: view.listview.set_model(mastermodel.SortShiftedCombo())
028: 
029: # the number tracking interface
030: 
031: def default_number(n):
032:     return mastermodel.get_available_with_lower_bound(n)
033: 
034: def number_enter(n):
035:     mastermodel.add_to_multiset(n)
036: 
037: def number_rollback(n):
038:     mastermodel.remove_from_multiset(n)
039: 
040: # the entry interface
041: 
042: def entry_open(n):
043:     if n>0:
044:         s=str(n)
045:     else:
046:         s=""
047:     model=mastermodel.SortShiftedCombo()
048:     model.filter_comprehend(s)
049:     reset_entry(model,s)
050: 
051: def entry_close():
052:     clear_entry()
053: 
054: # constants and numbers globals # (re)initialization interface
055: 
056: basecolour=view.listview.get_style().base[gtk.STATE_NORMAL]
057: colcolour=gtk.gdk.color_parse("#ffcc99")
058: view.renderer.set_property("cell-background-gdk",colcolour)
059: 
060: class Numbers(object):
061:     model=view.listview.get_model()
062: 
063: if Numbers.model.filter_nonempty():
064:     view.listview.set_cursor((0,))
065: 
066: def reset_entry(model,text):
067:     view.box.set_text(text)
068:     view.listview.set_model(model)
069:     Numbers.model=model
070:     if view.listview.get_model().filter_nonempty():
071:         view.listview.set_cursor((0,))
072: 
073: def clear_entry():
074:     view.listview.set_model(None)
075:     Numbers.model=None
076:     view.box.set_text("")
077: 
078: # gui callbacks
079: 
080: def on_box_changed(box):
081:     assert box==view.box
082:     if not Numbers.model: return
083:     Numbers.model.filter_comprehend(box.get_text())
084:     bestfit=Numbers.model.best_fit()
085:     assert bestfit<>None
086:     view.listview.set_cursor(bestfit)
087: 
088: def on_box_key_press(widget,event):
089:     assert widget==view.box
090:     if not Numbers.model: return
091:     k=event.keyval
092:     if k in guiutils.cursor_mover:
093:         view_move_cursor(view.listview,*guiutils.cursor_mover[k])
094:         return 1
095: 
096: def view_move_cursor(tree,*mover):
097:     assert tree==view.listview
098:     if Numbers.model.filter_nonempty():
099:         rsize=Numbers.model.filtered_size()
100:         (r,c)=view.listview.get_cursor()
101:         r=guiutils.page_cursor_move(r,rsize,*mover)
102:         view.listview.set_cursor(r,c)
103:     return 1
104: 
105: def on_view_cursor_changed(tree):
106:     assert tree==view.listview
107:     (r,c)=view.listview.get_cursor()
108:     (n,)=Numbers.model.get_row(r)
109:     modeller.set_number_entry(n)
110: 
111: ######## register reloadables ########
112: 
113: reloadables+=[guiutils]
114: reloadables+=[sorttab,utils]
115: 
116: # numbersscon.py # python package PyScore.timesheet module numbers.controller #