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()