001:
002:
003:
004:
005:
006:
007:
008:
009: reloadable=True
010: reloadables=[]
011:
012:
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:
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:
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:
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:
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:
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:
112:
113: reloadables+=[guiutils]
114: reloadables+=[sorttab,utils]
115:
116:
PyScore
A badly written regatta scoring programme in Python and PyGtk.
register
relational
standing
tabulate
timesheet
treemodel
utility
Copyright 2004, M.E.J.Draisey
This file is part of pyscore.
pyscore is free software; you can redistribute it and/or modify it under
the terms of the GNU General
Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
pyscore is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with pyscore; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Formatted with
GNU source-highlight:
http:// www.gnu.org/ software/ src-highlite