annotate flax/zoomcontrol.py @ 156:224505b0c21e

smaller text smaller text better bounds updating (now only on mouse-up) cooler demo
author drewp
date Mon, 07 Jul 2003 06:56:50 +0000
parents 45b12307c695
children 3905d3c92aaa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 from __future__ import division
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 import Tkinter as tk
45b12307c695 Initial revision
drewp
parents:
diff changeset
3 from dispatch import dispatcher
45b12307c695 Initial revision
drewp
parents:
diff changeset
4
45b12307c695 Initial revision
drewp
parents:
diff changeset
5 class Zoomcontrol(object,tk.Canvas):
45b12307c695 Initial revision
drewp
parents:
diff changeset
6
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 def maxtime():
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 doc = "seconds at the right edge of the bar"
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 def fget(self): return self._maxtime
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 def fset(self, value):
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 self._maxtime = value
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 self.updatewidget()
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 return locals()
45b12307c695 Initial revision
drewp
parents:
diff changeset
14 maxtime = property(**maxtime())
45b12307c695 Initial revision
drewp
parents:
diff changeset
15
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 def start():
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 def fget(self): return self._start
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 def fset(self,v): self._start = max(0,v)
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 return locals()
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 start = property(**start())
45b12307c695 Initial revision
drewp
parents:
diff changeset
21
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 def end():
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 def fget(self): return self._end
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 def fset(self,v): self._end = min(self.maxtime,v)
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 return locals()
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 end = property(**end())
45b12307c695 Initial revision
drewp
parents:
diff changeset
27
45b12307c695 Initial revision
drewp
parents:
diff changeset
28
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 def __init__(self,master,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 self.maxtime=370
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 self.start=0
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 self.end=20
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 tk.Canvas.__init__(self,master,width=250,height=30,
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 relief='raised',bd=1,bg='gray60',**kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 self.leftbrack = self.create_line(0,0,0,0,0,0,0,0,width=5)
45b12307c695 Initial revision
drewp
parents:
diff changeset
36 self.rightbrack = self.create_line(0,0,0,0,0,0,0,0,width=5)
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 self.shade = self.create_rectangle(0,0,0,0,fill='gray70',outline=None)
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 self.time = self.create_line(0,0,0,0,fill='red',width=2)
45b12307c695 Initial revision
drewp
parents:
diff changeset
39 self.updatewidget()
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 self.bind("<Configure>",self.updatewidget)
45b12307c695 Initial revision
drewp
parents:
diff changeset
41
45b12307c695 Initial revision
drewp
parents:
diff changeset
42 self.bind("<ButtonPress-1>",lambda ev: setattr(self,'lastx',ev.x))
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 self.tag_bind(self.leftbrack,"<B1-Motion>",
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 lambda ev: self.adjust('start',ev))
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 self.tag_bind(self.rightbrack,"<B1-Motion>",
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 lambda ev: self.adjust('end',ev))
45b12307c695 Initial revision
drewp
parents:
diff changeset
47 self.tag_bind(self.shade,"<B1-Motion>",
45b12307c695 Initial revision
drewp
parents:
diff changeset
48 lambda ev: self.adjust('offset',ev))
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 dispatcher.connect(lambda: (self.start,self.end),"zoom area",weak=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 dispatcher.connect(self.input_time,"input time")
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 dispatcher.connect(lambda maxtime: (setattr(self,'maxtime',maxtime),
45b12307c695 Initial revision
drewp
parents:
diff changeset
52 self.updatewidget()),"max time",weak=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 self.created=1
45b12307c695 Initial revision
drewp
parents:
diff changeset
54 def input_time(self,val):
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 t=val
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 x=self.can_for_t(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 self.coords(self.time,x,0,x,self.winfo_height())
45b12307c695 Initial revision
drewp
parents:
diff changeset
58
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 def adjust(self,attr,ev):
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 if not hasattr(self,'lastx'):
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 return
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 new = self.can_for_t(getattr(self,attr)) + (ev.x - self.lastx)
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 self.lastx = ev.x
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 setattr(self,attr,self.t_for_can(new))
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 self.updatewidget()
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 dispatcher.send("zoom changed")
45b12307c695 Initial revision
drewp
parents:
diff changeset
67
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 def offset():
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 doc = "virtual attr that adjusts start and end together"
45b12307c695 Initial revision
drewp
parents:
diff changeset
70 def fget(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 return self.start
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 def fset(self, value):
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 d = self.end-self.start
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 self.start = value
45b12307c695 Initial revision
drewp
parents:
diff changeset
75 self.end = self.start+d
45b12307c695 Initial revision
drewp
parents:
diff changeset
76 return locals()
45b12307c695 Initial revision
drewp
parents:
diff changeset
77 offset = property(**offset())
45b12307c695 Initial revision
drewp
parents:
diff changeset
78
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 def can_for_t(self,t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
80 return t/self.maxtime*(self.winfo_width()-30)+20
45b12307c695 Initial revision
drewp
parents:
diff changeset
81 def t_for_can(self,x):
45b12307c695 Initial revision
drewp
parents:
diff changeset
82 return (x-20)/(self.winfo_width()-30)*self.maxtime
45b12307c695 Initial revision
drewp
parents:
diff changeset
83
45b12307c695 Initial revision
drewp
parents:
diff changeset
84 def updatewidget(self,*args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 """redraw pieces based on start/end"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
86 if not hasattr(self,'created'): return
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 y1,y2=3,self.winfo_height()-3
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 lip = 6
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 scan = self.can_for_t(self.start)
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 ecan = self.can_for_t(self.end)
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 self.coords(self.leftbrack,scan+lip,y1,scan,y1,scan,y2,scan+lip,y2)
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 self.coords(self.rightbrack,ecan-lip,y1,ecan,y1,ecan,y2,ecan-lip,y2)
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 self.coords(self.shade,scan+3,y1+lip,ecan-3,y2-lip)
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 self.delete("tics")
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 lastx=-1000
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 for t in range(0,int(self.maxtime)):
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 x = self.can_for_t(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 if 0<x<self.winfo_width() and x-lastx>30:
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 txt=str(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 if lastx==-1000:
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 txt=txt+"sec"
45b12307c695 Initial revision
drewp
parents:
diff changeset
102 self.create_line(x,0,x,15,
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 tags=('tics',))
45b12307c695 Initial revision
drewp
parents:
diff changeset
104 self.create_text(x,self.winfo_height()-1,anchor='s',
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 text=txt,tags=('tics',),font='6x13')
45b12307c695 Initial revision
drewp
parents:
diff changeset
106 lastx = x