Mercurial > code > home > repos > light9
comparison flax/KeyboardComposer.py @ 111:0c619695d6c6
all in a days work
author | dmcc |
---|---|
date | Wed, 11 Jun 2003 09:36:07 +0000 |
parents | 45b12307c695 |
children | 2ed9bfd1dd0e |
comparison
equal
deleted
inserted
replaced
110:490843093506 | 111:0c619695d6c6 |
---|---|
1 from __future__ import nested_scopes | 1 from __future__ import nested_scopes |
2 import sys, time | 2 import sys |
3 sys.path.append('..') | 3 sys.path.append('..') |
4 from Widgets.Fadable import Fadable | 4 from Widgets.Fadable import Fadable |
5 | 5 |
6 from Tix import * | 6 from Tix import * |
7 import math, atexit, pickle | 7 import math |
8 from Submaster import Submasters, sub_maxes | 8 from Timeline import LevelFrame |
9 import dmxclient | 9 |
10 from uihelpers import toplevelat | 10 Submaster = LevelFrame |
11 | 11 |
12 nudge_keys = { | 12 nudge_keys = { |
13 'up' : list('qwertyuiop'), | 13 'up' : list('qwertyuiop'), |
14 'down' : list('asdfghjkl') | 14 'down' : list('asdfghjkl') |
15 } | 15 } |
17 | 17 |
18 class SubScale(Scale, Fadable): | 18 class SubScale(Scale, Fadable): |
19 def __init__(self, master, *args, **kw): | 19 def __init__(self, master, *args, **kw): |
20 self.scale_var = kw.get('variable') or DoubleVar() | 20 self.scale_var = kw.get('variable') or DoubleVar() |
21 kw.update({'variable' : self.scale_var, | 21 kw.update({'variable' : self.scale_var, |
22 'from' : 1, 'to' : 0, 'showvalue' : 0, | 22 'from' : 100, 'to' : 0, 'showvalue' : 0, |
23 'sliderlength' : 15, 'res' : 0.01, | 23 'sliderlength' : 10}) |
24 'width' : 40, 'troughcolor' : 'black', 'bg' : 'grey40', | |
25 'highlightthickness' : 1, 'bd' : 1, | |
26 'highlightcolor' : 'red', 'highlightbackground' : 'black', | |
27 'activebackground' : 'red'}) | |
28 Scale.__init__(self, master, *args, **kw) | 24 Scale.__init__(self, master, *args, **kw) |
29 Fadable.__init__(self, var=self.scale_var, wheel_step=0.05) | 25 Fadable.__init__(self, var=self.scale_var) |
30 self.draw_indicator_colors() | |
31 def draw_indicator_colors(self): | |
32 if self.scale_var.get() == 0: | |
33 self['troughcolor'] = 'black' | |
34 else: | |
35 self['troughcolor'] = 'blue' | |
36 | 26 |
37 class SubmasterTk(Frame): | 27 class SubmasterTk(Frame): |
38 def __init__(self, master, name, current_level): | 28 def __init__(self, master, name, current_level): |
39 Frame.__init__(self, master, bd=1, relief='raised', bg='black') | 29 Frame.__init__(self, master) |
40 self.slider_var = DoubleVar() | 30 self.slider_var = DoubleVar() |
41 self.slider_var.set(current_level) | 31 self.slider_var.set(current_level) |
42 self.scale = SubScale(self, variable=self.slider_var, width=20) | 32 self.scale = SubScale(self, variable=self.slider_var, width=20) |
43 namelabel = Label(self, text=name, font="Arial 8", bg='black', | 33 textlabel = Label(self, text=name) |
44 fg='white') | 34 textlabel.pack(side=TOP) |
45 namelabel.pack(side=TOP) | |
46 levellabel = Label(self, textvariable=self.slider_var, font="Arial 8", | |
47 bg='black', fg='white') | |
48 levellabel.pack(side=TOP) | |
49 self.scale.pack(side=BOTTOM, expand=1, fill=BOTH) | 35 self.scale.pack(side=BOTTOM, expand=1, fill=BOTH) |
50 | 36 |
51 class KeyboardComposer(Frame): | 37 class KeyboardComposer(Frame): |
52 def __init__(self, root, submasters, current_sub_levels=None, dmxdummy=0): | 38 def __init__(self, root, submasters, current_sub_levels=None): |
53 Frame.__init__(self, root, bg='black') | 39 Frame.__init__(self, root) |
54 self.submasters = submasters | 40 self.submasters = submasters |
55 self.dmxdummy = dmxdummy | 41 self.current_sub_levels = current_sub_levels or {} |
56 | 42 |
57 self.current_sub_levels = {} | |
58 if current_sub_levels: | |
59 self.current_sub_levels = current_sub_levels | |
60 else: | |
61 try: | |
62 self.current_sub_levels = \ | |
63 pickle.load(file('.keyboardcomposer.savedlevels')) | |
64 except IOError: | |
65 pass | |
66 | |
67 self.draw_ui() | |
68 self.send_levels_loop() | |
69 def draw_ui(self): | |
70 self.rows = [] # this holds Tk Frames for each row | 43 self.rows = [] # this holds Tk Frames for each row |
71 self.slider_vars = {} # this holds subname:sub Tk vars | 44 self.slider_vars = {} # this holds subname:sub Tk vars |
72 self.slider_table = {} # this holds coords:sub Tk vars | 45 self.slider_table = {} # this holds coords:sub Tk vars |
73 self.current_row = 0 | 46 self.current_row = 0 |
74 | 47 |
75 self.make_key_hints() | 48 self.make_key_hints() |
76 self.draw_sliders() | 49 self.draw_sliders() |
77 self.highlight_row(self.current_row) | 50 self.highlight_row(self.current_row) |
78 self.rows[self.current_row].focus() | 51 self.rows[self.current_row].focus() |
79 | |
80 self.buttonframe = Frame(self, bg='black') | |
81 self.buttonframe.pack(side=BOTTOM) | |
82 self.refreshbutton = Button(self.buttonframe, text="Refresh", | |
83 command=self.refresh, bg='black', fg='white') | |
84 self.refreshbutton.pack(side=LEFT) | |
85 self.save_stage_button = Button(self.buttonframe, text="Save", | |
86 command=lambda: self.save_current_stage(self.sub_name.get()), | |
87 bg='black', fg='white') | |
88 self.save_stage_button.pack(side=LEFT) | |
89 self.sub_name = Entry(self.buttonframe, bg='black', fg='white') | |
90 self.sub_name.pack(side=LEFT) | |
91 self.stop_frequent_update_time = 0 | |
92 def make_key_hints(self): | 52 def make_key_hints(self): |
93 keyhintrow = Frame(self) | 53 keyhintrow = Frame(self) |
94 | 54 |
95 col = 0 | 55 col = 0 |
96 for upkey, downkey in zip(nudge_keys['up'], | 56 for upkey, downkey in zip(nudge_keys['up'], |
97 nudge_keys['down']): | 57 nudge_keys['down']): |
98 # what a hack! | 58 # what a hack! |
99 downkey = downkey.replace('semicolon', ';') | 59 downkey = downkey.replace('semicolon', ';') |
100 upkey, downkey = (upkey.upper(), downkey.upper()) | |
101 | 60 |
102 # another what a hack! | 61 # another what a hack! |
103 keylabel = Label(keyhintrow, text='%s\n%s' % (upkey, downkey), | 62 keylabel = Label(keyhintrow, text='%s\n%s' % (upkey, downkey), |
104 width=1, font=('Arial', 10), bg='red', fg='white', anchor='c') | 63 width=3, font=('Arial Bold', 12), bg='red', fg='white') |
105 keylabel.pack(side=LEFT, expand=1, fill=X) | 64 keylabel.pack(side=LEFT, expand=1, fill=X) |
106 col += 1 | 65 col += 1 |
107 | 66 |
108 keyhintrow.pack(fill=X, expand=0) | 67 keyhintrow.pack(fill=X, expand=0) |
109 self.keyhints = keyhintrow | 68 self.keyhints = keyhintrow |
127 for key in '<Prior> <Next> <Control-n> <Control-p>'.split(): | 86 for key in '<Prior> <Next> <Control-n> <Control-p>'.split(): |
128 tkobject.bind(key, self.change_row) | 87 tkobject.bind(key, self.change_row) |
129 | 88 |
130 def change_row(self, event): | 89 def change_row(self, event): |
131 diff = 1 | 90 diff = 1 |
132 if event.keysym in ('Prior', 'p'): | 91 if event.keysym in ('Prior', '<Control-p>'): |
133 diff = -1 | 92 diff = -1 |
134 old_row = self.current_row | 93 old_row = self.current_row |
135 self.current_row += diff | 94 self.current_row += diff |
136 self.current_row = max(0, self.current_row) | 95 self.current_row = max(0, self.current_row) |
137 self.current_row = min(len(self.rows) - 1, self.current_row) | 96 self.current_row = min(len(self.rows) - 1, self.current_row) |
138 self.unhighlight_row(old_row) | 97 self.unhighlight_row(old_row) |
139 self.highlight_row(self.current_row) | 98 self.highlight_row(self.current_row) |
140 row = self.rows[self.current_row] | 99 row = self.rows[self.current_row] |
141 self.keyhints.pack_configure(before=row) | 100 self.keyhints.pack_configure(before=row) |
142 def got_nudger(self, number, direction, full=0): | 101 def got_nudger(self, number, direction, full=0): |
102 print "got_nudger", number, direction, full | |
143 subtk = self.slider_table[(self.current_row, number)] | 103 subtk = self.slider_table[(self.current_row, number)] |
144 if direction == 'up': | 104 if direction == 'up': |
145 if full: | 105 if full: |
146 subtk.scale.fade(1) | 106 subtk.scale.fade(100) |
147 else: | 107 else: |
148 subtk.scale.increase() | 108 subtk.scale.increase() |
149 else: | 109 else: |
150 if full: | 110 if full: |
151 subtk.scale.fade(0) | 111 subtk.scale.fade(0) |
154 def draw_sliders(self): | 114 def draw_sliders(self): |
155 self.tk_focusFollowsMouse() | 115 self.tk_focusFollowsMouse() |
156 | 116 |
157 rowcount = -1 | 117 rowcount = -1 |
158 col = 0 | 118 col = 0 |
159 for sub in self.submasters.get_all_subs(): | 119 for sub in self.submasters: |
160 if col == 0: # make new row | 120 if col == 0: # make new row |
161 row = self.make_row() | 121 row = self.make_row() |
162 rowcount += 1 | 122 rowcount += 1 |
163 current_level = self.current_sub_levels.get(sub.name, 0) | 123 current_level = self.current_sub_levels.get(sub.name, 0) |
164 subtk = self.draw_sub_slider(row, col, sub.name, current_level) | 124 subtk = self.draw_sub_slider(row, col, sub.name, current_level) |
165 self.slider_table[(rowcount, col)] = subtk | 125 self.slider_table[(rowcount, col)] = subtk |
166 col += 1 | 126 col += 1 |
167 col %= 10 | 127 col %= 10 |
168 | |
169 def slider_changed(x, y, z, subtk=subtk): | |
170 subtk.scale.draw_indicator_colors() | |
171 self.send_levels() | |
172 | |
173 subtk.slider_var.trace('w', slider_changed) | |
174 def make_row(self): | 128 def make_row(self): |
175 row = Frame(self, bd=2, bg='black') | 129 row = Frame(self, bd=2) |
176 row.pack(expand=1, fill=BOTH) | 130 row.pack(expand=1, fill=BOTH) |
177 self.setup_key_nudgers(row) | 131 self.setup_key_nudgers(row) |
178 self.rows.append(row) | 132 self.rows.append(row) |
179 return row | 133 return row |
180 def draw_sub_slider(self, row, col, name, current_level): | 134 def draw_sub_slider(self, row, col, name, current_level): |
187 def highlight_row(self, row): | 141 def highlight_row(self, row): |
188 row = self.rows[row] | 142 row = self.rows[row] |
189 row['bg'] = 'red' | 143 row['bg'] = 'red' |
190 def unhighlight_row(self, row): | 144 def unhighlight_row(self, row): |
191 row = self.rows[row] | 145 row = self.rows[row] |
192 row['bg'] = 'black' | 146 row['bg'] = '#d9d9d9' |
193 def get_levels(self): | 147 def get_levels(self): |
194 return dict([(name, slidervar.get()) | 148 return dict([(name, slidervar.get()) |
195 for name, slidervar in self.slider_vars.items()]) | 149 for name, slidervar in self.slider_vars.items()]) |
196 def get_levels_as_sub(self): | |
197 scaledsubs = [self.submasters.get_sub_by_name(sub) * level \ | |
198 for sub, level in self.get_levels().items()] | |
199 | |
200 maxes = sub_maxes(*scaledsubs) | |
201 return maxes | |
202 def save_current_stage(self, subname): | |
203 print "saving current levels as", subname | |
204 sub = self.get_levels_as_sub() | |
205 sub.name = subname | |
206 sub.save() | |
207 | |
208 def save(self): | |
209 pickle.dump(self.get_levels(), | |
210 file('.keyboardcomposer.savedlevels', 'w')) | |
211 def send_frequent_updates(self): | |
212 """called when we get a fade -- send events as quickly as possible""" | |
213 if time.time() <= self.stop_frequent_update_time: | |
214 self.send_levels() | |
215 self.after(10, self.send_frequent_updates) | |
216 | |
217 def get_dmx_list(self): | |
218 maxes = self.get_levels_as_sub() | |
219 return maxes.get_dmx_list() | |
220 def send_levels(self): | |
221 if not self.dmxdummy: | |
222 levels = self.get_dmx_list() | |
223 dmxclient.outputlevels(levels) | |
224 # print "sending levels", levels | |
225 def send_levels_loop(self): | |
226 self.send_levels() | |
227 self.after(1000, self.send_levels_loop) | |
228 def refresh(self): | |
229 self.save() | |
230 self.submasters = Submasters() | |
231 self.current_sub_levels = \ | |
232 pickle.load(file('.keyboardcomposer.savedlevels')) | |
233 for r in self.rows: | |
234 r.destroy() | |
235 self.keyhints.destroy() | |
236 self.buttonframe.destroy() | |
237 self.draw_ui() | |
238 | 150 |
239 if __name__ == "__main__": | 151 if __name__ == "__main__": |
240 s = Submasters() | 152 reds = Submaster('reds', {'red1' : 20, 'red2' : 30, 'red3' : 80}) |
153 blues = Submaster('blues', {'blue1' : 60, 'blue2' : 80, 'blue3' : 20}) | |
154 | |
155 subs = [] | |
156 for scenename in 'warmers house god spot explosion booth stageleft stageright donkey elvis sun fiddler satan lola bed treehouse motel6 deadmics suck burninggels firelights sodacan lighting homestar strongbad coachz pompom marzipan bubs thecheat'.split(): | |
157 subs.append(Submaster(scenename, {'dummy' : 20})) | |
241 | 158 |
242 root = Tk() | 159 root = Tk() |
243 tl = toplevelat("Keyboard Composer", existingtoplevel=root) | 160 root.wm_geometry('400x400') |
244 kc = KeyboardComposer(tl, s, dmxdummy=0) | 161 kc = KeyboardComposer(root, subs) |
245 kc.pack(fill=BOTH, expand=1) | 162 kc.pack(fill=BOTH, expand=1) |
246 atexit.register(kc.save) | 163 mainloop() |
247 try: | |
248 mainloop() | |
249 except KeyboardInterrupt: | |
250 tl.destroy() | |
251 sys.exit() |