Mercurial > code > home > repos > light9
annotate light8/Fader.py @ 53:032b2b67bc10
result of July 7th on-site editing
author | dmcc |
---|---|
date | Mon, 08 Jul 2002 14:31:20 +0000 |
parents | 065896b0913c |
children | 3011c1028eb7 |
rev | line source |
---|---|
0 | 1 from Tix import * |
52 | 2 from time import time # time is on my side |
3 from util import subsetdict | |
53 | 4 from FlyingFader import FlyingFader |
52 | 5 |
6 # statuses are: | |
53 | 7 # stopped - no cue is loaded or cue is stopped |
52 | 8 # running - cue is running, not complete |
9 # finished - cue is finished, next is loaded | |
0 | 10 |
11 stdfont = ('Arial', 10) | |
12 | |
13 class Fader(Frame): | |
14 'User interface for cue fader' | |
15 def __init__(self, master, cues, scalelevels): | |
16 self.master = master | |
17 self.cues = cues | |
18 self.scalelevels = scalelevels | |
53 | 19 self.time_start = 0 |
0 | 20 self.init_layout() |
53 | 21 self.stop() |
0 | 22 def init_layout(self): |
23 Frame.__init__(self, self.master) | |
24 | |
52 | 25 # info variables |
0 | 26 self.cuename = StringVar() |
27 self.cuelength = DoubleVar() | |
52 | 28 self.cuetarget = StringVar() |
29 | |
30 # info about a running cue | |
31 self.cuestatus = StringVar() # text description | |
32 self.cuestatus.set("stopped") | |
33 | |
34 self.cuepercent = DoubleVar() # percent complete | |
35 self.cuepercent.set(0) | |
53 | 36 self.cuepercent.trace('w', self.update_percent) |
37 self.cuetimeelapse = StringVar() # time elapsed | |
38 self.cuetimeelapse.set('0s') | |
39 self.cuetimeleft = StringVar() # time left | |
40 self.cuetimeleft.set('0s') | |
0 | 41 |
42 buttonframe = Frame(self) | |
43 | |
53 | 44 self.listbox = ScrolledListBox(buttonframe, |
45 command=self.update_selection) | |
46 self.listbox.listbox.configure({'exportselection' : 0, | |
47 'selectmode' : EXTENDED}) | |
0 | 48 for c in self.cues: |
49 self.listbox.listbox.insert(END, c.name) | |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
0
diff
changeset
|
50 self.listbox.pack(side=TOP) |
53 | 51 self.listbox.listbox.bind("<<ListboxSelect>>", self.update_selection, |
52 add=1) | |
53 Button(buttonframe, text="Go", command=self.go, font=stdfont, | |
54 bg='green').pack(side=LEFT) | |
55 Button(buttonframe, text="Stop", command=self.stop, font=stdfont, | |
56 bg='red').pack(side=LEFT) | |
57 Button(buttonframe, text="Prev", command=self.prev, | |
58 font=stdfont).pack(side=LEFT) | |
59 Button(buttonframe, text="Next", command=self.next, | |
60 font=stdfont).pack(side=LEFT) | |
0 | 61 |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
0
diff
changeset
|
62 infoframe = Frame(self) |
0 | 63 Label(infoframe, textvariable=self.cuename, |
53 | 64 font=('Arial', 12), bg='lightBlue').grid(columnspan=4, sticky=NE+SW) |
52 | 65 |
0 | 66 Label(infoframe, text="Length", font=stdfont, |
67 bg='lightPink').grid(row=1, sticky=NE+SW) | |
68 Label(infoframe, textvariable=self.cuelength, | |
53 | 69 font=stdfont).grid(row=1, column=1, columnspan=3, sticky=NE+SW) |
52 | 70 |
0 | 71 Label(infoframe, text="Target", font=stdfont, |
52 | 72 bg='lightPink', wraplength=50).grid(row=2, sticky=NE+SW) |
73 Label(infoframe, textvariable=self.cuetarget, | |
53 | 74 font=stdfont).grid(row=2, column=1, columnspan=3, sticky=NE+SW) |
52 | 75 |
76 Label(infoframe, text="Status", font=stdfont, | |
77 bg='lightPink').grid(row=3, sticky=NE+SW) | |
78 Label(infoframe, textvariable=self.cuestatus, | |
53 | 79 font=stdfont).grid(row=3, column=1, columnspan=3, sticky=NE+SW) |
52 | 80 |
53 | 81 Label(infoframe, text="Time Elapsed", font=stdfont, |
52 | 82 bg='lightPink').grid(row=4, sticky=NE+SW) |
53 | 83 Label(infoframe, textvariable=self.cuetimeelapse, |
52 | 84 font=stdfont).grid(row=4, column=1, sticky=NE+SW) |
85 | |
53 | 86 Label(infoframe, text="Time Remain", font=stdfont, |
87 bg='lightPink').grid(row=4, column=2, sticky=NE+SW) | |
88 Label(infoframe, textvariable=self.cuetimeleft, | |
89 font=stdfont).grid(row=4, column=3, sticky=NE+SW) | |
90 | |
52 | 91 Label(infoframe, text="Percent Complete", font=stdfont, |
53 | 92 bg='lightPink').grid(row=5, column=0, sticky=NE+SW) |
93 self.percentlabel = Label(infoframe, | |
94 font=stdfont) | |
95 self.percentlabel.grid(row=5, column=1, columnspan=3, sticky=NE+SW) | |
96 | |
97 s = Scale(infoframe, variable=self.cuepercent, | |
98 showvalue=0, length=220, | |
99 width=18, sliderlength=30, | |
100 to=100,res=.1,from_=0,bd=1, font=stdfont, | |
101 orient='horiz') | |
102 s.grid(row=6, columnspan=4, sticky='ew') | |
52 | 103 |
0 | 104 infoframe.pack(side=RIGHT, fill=BOTH, expand=1) |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
0
diff
changeset
|
105 buttonframe.pack(side=BOTTOM) |
0 | 106 |
107 self.listbox.listbox.select_set(0) | |
108 self.update_selection() | |
53 | 109 def update_percent(self, *args): |
110 if self.cuestatus.get() != 'running': | |
111 self.cuestatus.set("running") | |
112 self.time_start = time() | |
113 startlevels = dict([(k, v.get()) | |
114 for k, v in self.scalelevels.items()]) | |
115 self.current.start(startlevels, self.time_start) | |
116 | |
117 percent = self.cuepercent.get() | |
118 self.percentlabel.config(text='%.1f%%' % percent) | |
119 percent /= 100 | |
120 | |
121 elapsed = percent * self.current.dur | |
122 self.cuetimeelapse.set('%.1fs' % elapsed) | |
123 self.cuetimeleft.set('%.1fs' % (self.current.dur - elapsed)) | |
124 newlevels = self.current.get_levels(self.time_start + elapsed) | |
125 for ch, lev in newlevels.items(): | |
126 try: | |
127 self.scalelevels[ch].set(lev / 100.0) | |
128 except KeyError: | |
129 pass | |
130 | |
131 def update_selection(self, *args): | |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
0
diff
changeset
|
132 selection = int(self.listbox.listbox.curselection()[0]) # blech |
0 | 133 self.current = self.cues[selection] |
134 self.cuename.set(self.current.name) | |
135 self.cuelength.set(self.current.dur) | |
53 | 136 target = ', '.join(['%s -> %.1f' % (n, lev) |
137 for n, lev in self.current.get_end_levels().items()]) | |
138 self.cuetarget.set(target) | |
139 self.cuetimeelapse.set('0s') | |
140 self.cuetimeleft.set('%.1fs' % self.current.dur) | |
141 self.cuepercent.set(0) | |
0 | 142 def go(self): |
53 | 143 self.update_selection() |
52 | 144 self.cuestatus.set("running") |
145 self.time_start = time() | |
146 startlevels = dict([(k, v.get()) for k, v in self.scalelevels.items()]) | |
147 self.current.start(startlevels, self.time_start) | |
148 self.running_loop() | |
53 | 149 def stop(self): |
150 self.cuestatus.set('stopped') | |
151 def prev(self): | |
152 self.cuestatus.set('stopped') | |
153 selection = int(self.listbox.listbox.curselection()[0]) # blech | |
154 if selection != 0: | |
155 self.listbox.listbox.select_clear(selection) | |
156 self.listbox.listbox.select_set(selection - 1) | |
157 self.update_selection() | |
158 def next(self): | |
159 self.cuestatus.set('stopped') | |
160 selection = int(self.listbox.listbox.curselection()[0]) # blech | |
161 if selection != self.listbox.listbox.size() - 1: | |
162 self.listbox.listbox.select_clear(selection) | |
163 self.listbox.listbox.select_set(selection + 1) | |
164 self.update_selection() | |
52 | 165 def running_loop(self): |
53 | 166 if self.cuestatus.get() == 'stopped': |
52 | 167 return |
53 | 168 curtime = time() |
169 elapsed = (curtime - self.time_start) | |
170 if elapsed > self.current.dur: | |
171 self.cuestatus.set('finished') | |
172 self.cuepercent.set(100) | |
173 | |
174 # advance cues if okay | |
175 self.next() | |
176 return | |
177 | |
178 self.cuepercent.set(100 * elapsed / self.current.dur) | |
52 | 179 self.after(30, self.running_loop) |