annotate flax/KeyboardRecorder.py @ 62:2f2eb802e93d

stage shows levels now. aims have blue halo for easy recognition. stage shows levels now. aims have blue halo for easy recognition. old dummy config stored
author dmcc
date Tue, 09 Jul 2002 08:35:27 +0000
parents 45b12307c695
children
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 nested_scopes
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 import sys, time
45b12307c695 Initial revision
drewp
parents:
diff changeset
3 sys.path.append('..')
45b12307c695 Initial revision
drewp
parents:
diff changeset
4 from Widgets.Fadable import Fadable
45b12307c695 Initial revision
drewp
parents:
diff changeset
5
45b12307c695 Initial revision
drewp
parents:
diff changeset
6 from Tix import *
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 import math, atexit, pickle
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 from sets import Set
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 from Submaster import Submasters, sub_maxes
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 import dmxclient
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 from uihelpers import toplevelat
45b12307c695 Initial revision
drewp
parents:
diff changeset
12
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 # idea is that one system handles all the level logging persistence
45b12307c695 Initial revision
drewp
parents:
diff changeset
14 # (it also needs to know which song we're currently working on)
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 # SubLevelLogger is not yet written
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 from SubLevelLogger import SubLevelLogger
45b12307c695 Initial revision
drewp
parents:
diff changeset
17
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 nudge_keys = {
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 'up' : list('qwertyuiop'),
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 'down' : list('asdfghjkl')
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 }
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 nudge_keys['down'].append('semicolon')
45b12307c695 Initial revision
drewp
parents:
diff changeset
23
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 class SubScale(Scale, Fadable):
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 def __init__(self, master, *args, **kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 self.scale_var = kw.get('variable') or DoubleVar()
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 kw.update({'variable' : self.scale_var,
45b12307c695 Initial revision
drewp
parents:
diff changeset
28 'from' : 1, 'to' : 0, 'showvalue' : 0,
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 'sliderlength' : 15, 'res' : 0.01,
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 'width' : 40, 'troughcolor' : 'black', 'bg' : 'grey40',
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 'highlightthickness' : 1, 'bd' : 1,
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 'highlightcolor' : 'red', 'highlightbackground' : 'black',
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 'activebackground' : 'red'})
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 Scale.__init__(self, master, *args, **kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 Fadable.__init__(self, var=self.scale_var, wheel_step=0.05)
45b12307c695 Initial revision
drewp
parents:
diff changeset
36 self.draw_indicator_colors()
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 def draw_indicator_colors(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 if self.scale_var.get() == 0:
45b12307c695 Initial revision
drewp
parents:
diff changeset
39 self['troughcolor'] = 'black'
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
41 self['troughcolor'] = 'blue'
45b12307c695 Initial revision
drewp
parents:
diff changeset
42
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 class SubmasterTk(Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 def __init__(self, master, name, current_level, kbrecorder=None):
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 """kbrecorder is a KeyboardRecorder instance -- take that, Java"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 Frame.__init__(self, master, bd=1, relief='raised', bg='black')
45b12307c695 Initial revision
drewp
parents:
diff changeset
47 self.slider_var = DoubleVar()
45b12307c695 Initial revision
drewp
parents:
diff changeset
48 self.slider_var.set(current_level)
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 self.scale = SubScale(self, variable=self.slider_var, width=20)
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 self.namelabel = Label(self, text=name, font="Arial 8", bg='black',
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 fg='white')
45b12307c695 Initial revision
drewp
parents:
diff changeset
52 self.namelabel.pack(side=TOP)
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 self.levellabel = Label(self,
45b12307c695 Initial revision
drewp
parents:
diff changeset
54 font="Arial 8", bg='black', fg='white')
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 self.levellabel.pack(side=TOP)
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 self.scale.pack(side=BOTTOM, expand=1, fill=BOTH)
45b12307c695 Initial revision
drewp
parents:
diff changeset
57
45b12307c695 Initial revision
drewp
parents:
diff changeset
58 # recording bits
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 self.kbrecorder = kbrecorder
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 self.recording = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 self.name = name
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 self._last_recorded_value = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 for obj in (self, self.levellabel, self.namelabel, self.scale):
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 obj.bind('<3>', self.toggle_record)
45b12307c695 Initial revision
drewp
parents:
diff changeset
65
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 self.slider_var.trace('w', self.draw_level)
45b12307c695 Initial revision
drewp
parents:
diff changeset
67 self.draw_level()
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 def draw_level(self, *args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 self.levellabel['text'] = "%d" % (self.slider_var.get() * 100)
45b12307c695 Initial revision
drewp
parents:
diff changeset
70 def toggle_record(self, evt):
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 self.kbrecorder.toggle_sub_recording(self.name)
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 self.recording = not self.recording
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 if self.recording:
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 conf = {'bg' : 'red'}
45b12307c695 Initial revision
drewp
parents:
diff changeset
75 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
76 conf = {'bg' : 'black'}
45b12307c695 Initial revision
drewp
parents:
diff changeset
77
45b12307c695 Initial revision
drewp
parents:
diff changeset
78 for obj in (self, self.levellabel, self.namelabel):
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 obj.config(**conf)
45b12307c695 Initial revision
drewp
parents:
diff changeset
80 def record(self, timestamp):
45b12307c695 Initial revision
drewp
parents:
diff changeset
81 """This is called whenever we get a timestamp and we're recording."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
82 new_value = self.scale.scale_var.get()
45b12307c695 Initial revision
drewp
parents:
diff changeset
83 if new_value != self._last_recorded_value:
45b12307c695 Initial revision
drewp
parents:
diff changeset
84 s = SubLevelLogger()
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 s.save_level(name, timestamp, new_value)
45b12307c695 Initial revision
drewp
parents:
diff changeset
86
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 self._last_recorded_value = new_value
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 def get_recorded_level(self, timestamp):
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 """This is called whenever we get a timestamp and we're not
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 recording.
45b12307c695 Initial revision
drewp
parents:
diff changeset
91
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 TODO: independent subs don't playback from recorded levels"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 s = SubLevelLogger()
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 new_value = s.load_level(name, timestamp)
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 self.scale.scale_var.set(new_value)
45b12307c695 Initial revision
drewp
parents:
diff changeset
96
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 class KeyboardRecorder(Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 def __init__(self, root, submasters, current_sub_levels=None, dmxdummy=0):
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 Frame.__init__(self, root, bg='black')
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 self.submasters = submasters
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 self.dmxdummy = dmxdummy
45b12307c695 Initial revision
drewp
parents:
diff changeset
102
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 self.current_sub_levels = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
104 if current_sub_levels:
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 self.current_sub_levels = current_sub_levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
106 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
108 self.current_sub_levels = \
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 pickle.load(file('.keyboardcomposer.savedlevels'))
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 except IOError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 pass
45b12307c695 Initial revision
drewp
parents:
diff changeset
112
45b12307c695 Initial revision
drewp
parents:
diff changeset
113 self.subs_being_recorded = Set() # yay, this is the first time I've
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 # used Set!
45b12307c695 Initial revision
drewp
parents:
diff changeset
115
45b12307c695 Initial revision
drewp
parents:
diff changeset
116 self.draw_ui()
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 self.send_levels_loop()
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 def draw_ui(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 self.rows = [] # this holds Tk Frames for each row
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 self.slider_vars = {} # this holds subname:sub Tk vars
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 self.slider_table = {} # this holds coords:sub Tk vars
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 self.name_to_subtk = {} # subname : SubmasterTk instance
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 self.current_row = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
124
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 self.make_key_hints()
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 self.draw_sliders()
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 self.highlight_row(self.current_row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
128 self.rows[self.current_row].focus()
45b12307c695 Initial revision
drewp
parents:
diff changeset
129
45b12307c695 Initial revision
drewp
parents:
diff changeset
130 self.buttonframe = Frame(self, bg='black')
45b12307c695 Initial revision
drewp
parents:
diff changeset
131 self.buttonframe.pack(side=BOTTOM)
45b12307c695 Initial revision
drewp
parents:
diff changeset
132 self.refreshbutton = Button(self.buttonframe, text="Refresh",
45b12307c695 Initial revision
drewp
parents:
diff changeset
133 command=self.refresh, bg='black', fg='white')
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 self.refreshbutton.pack(side=LEFT)
45b12307c695 Initial revision
drewp
parents:
diff changeset
135 self.save_stage_button = Button(self.buttonframe, text="Save",
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 command=lambda: self.save_current_stage(self.sub_name.get()),
45b12307c695 Initial revision
drewp
parents:
diff changeset
137 bg='black', fg='white')
45b12307c695 Initial revision
drewp
parents:
diff changeset
138 self.save_stage_button.pack(side=LEFT)
45b12307c695 Initial revision
drewp
parents:
diff changeset
139 self.sub_name = Entry(self.buttonframe, bg='black', fg='white')
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 self.sub_name.pack(side=LEFT)
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 self.stop_frequent_update_time = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
142 def make_key_hints(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
143 keyhintrow = Frame(self)
45b12307c695 Initial revision
drewp
parents:
diff changeset
144
45b12307c695 Initial revision
drewp
parents:
diff changeset
145 col = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
146 for upkey, downkey in zip(nudge_keys['up'],
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 nudge_keys['down']):
45b12307c695 Initial revision
drewp
parents:
diff changeset
148 # what a hack!
45b12307c695 Initial revision
drewp
parents:
diff changeset
149 downkey = downkey.replace('semicolon', ';')
45b12307c695 Initial revision
drewp
parents:
diff changeset
150 upkey, downkey = (upkey.upper(), downkey.upper())
45b12307c695 Initial revision
drewp
parents:
diff changeset
151
45b12307c695 Initial revision
drewp
parents:
diff changeset
152 # another what a hack!
45b12307c695 Initial revision
drewp
parents:
diff changeset
153 keylabel = Label(keyhintrow, text='%s\n%s' % (upkey, downkey),
45b12307c695 Initial revision
drewp
parents:
diff changeset
154 width=1, font=('Arial', 10), bg='red', fg='white', anchor='c')
45b12307c695 Initial revision
drewp
parents:
diff changeset
155 keylabel.pack(side=LEFT, expand=1, fill=X)
45b12307c695 Initial revision
drewp
parents:
diff changeset
156 col += 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
157
45b12307c695 Initial revision
drewp
parents:
diff changeset
158 keyhintrow.pack(fill=X, expand=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
159 self.keyhints = keyhintrow
45b12307c695 Initial revision
drewp
parents:
diff changeset
160 def setup_key_nudgers(self, tkobject):
45b12307c695 Initial revision
drewp
parents:
diff changeset
161 for d, keys in nudge_keys.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
162 for key in keys:
45b12307c695 Initial revision
drewp
parents:
diff changeset
163 # lowercase makes full=0
45b12307c695 Initial revision
drewp
parents:
diff changeset
164 keysym = "<KeyPress-%s>" % key
45b12307c695 Initial revision
drewp
parents:
diff changeset
165 tkobject.bind(keysym, \
45b12307c695 Initial revision
drewp
parents:
diff changeset
166 lambda evt, num=keys.index(key), d=d: \
45b12307c695 Initial revision
drewp
parents:
diff changeset
167 self.got_nudger(num, d))
45b12307c695 Initial revision
drewp
parents:
diff changeset
168
45b12307c695 Initial revision
drewp
parents:
diff changeset
169 # uppercase makes full=1
45b12307c695 Initial revision
drewp
parents:
diff changeset
170 keysym = "<KeyPress-%s>" % key.upper()
45b12307c695 Initial revision
drewp
parents:
diff changeset
171 keysym = keysym.replace('SEMICOLON', 'colon')
45b12307c695 Initial revision
drewp
parents:
diff changeset
172 tkobject.bind(keysym, \
45b12307c695 Initial revision
drewp
parents:
diff changeset
173 lambda evt, num=keys.index(key), d=d: \
45b12307c695 Initial revision
drewp
parents:
diff changeset
174 self.got_nudger(num, d, full=1))
45b12307c695 Initial revision
drewp
parents:
diff changeset
175
45b12307c695 Initial revision
drewp
parents:
diff changeset
176 # Row changing:
45b12307c695 Initial revision
drewp
parents:
diff changeset
177 # Page dn, C-n, and ] do down
45b12307c695 Initial revision
drewp
parents:
diff changeset
178 # Page up, C-p, and ' do up
45b12307c695 Initial revision
drewp
parents:
diff changeset
179 for key in '<Prior> <Next> <Control-n> <Control-p> ' \
45b12307c695 Initial revision
drewp
parents:
diff changeset
180 '<Key-bracketright> <Key-apostrophe>'.split():
45b12307c695 Initial revision
drewp
parents:
diff changeset
181 tkobject.bind(key, self.change_row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
182
45b12307c695 Initial revision
drewp
parents:
diff changeset
183 def change_row(self, event):
45b12307c695 Initial revision
drewp
parents:
diff changeset
184 diff = 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
185 if event.keysym in ('Prior', 'p', 'bracketright'):
45b12307c695 Initial revision
drewp
parents:
diff changeset
186 diff = -1
45b12307c695 Initial revision
drewp
parents:
diff changeset
187 old_row = self.current_row
45b12307c695 Initial revision
drewp
parents:
diff changeset
188 self.current_row += diff
45b12307c695 Initial revision
drewp
parents:
diff changeset
189 self.current_row = max(0, self.current_row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
190 self.current_row = min(len(self.rows) - 1, self.current_row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
191 self.unhighlight_row(old_row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
192 self.highlight_row(self.current_row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
193 row = self.rows[self.current_row]
45b12307c695 Initial revision
drewp
parents:
diff changeset
194 self.keyhints.pack_configure(before=row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
195 def got_nudger(self, number, direction, full=0):
45b12307c695 Initial revision
drewp
parents:
diff changeset
196 subtk = self.slider_table[(self.current_row, number)]
45b12307c695 Initial revision
drewp
parents:
diff changeset
197 if direction == 'up':
45b12307c695 Initial revision
drewp
parents:
diff changeset
198 if full:
45b12307c695 Initial revision
drewp
parents:
diff changeset
199 subtk.scale.fade(1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
200 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
201 subtk.scale.increase()
45b12307c695 Initial revision
drewp
parents:
diff changeset
202 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
203 if full:
45b12307c695 Initial revision
drewp
parents:
diff changeset
204 subtk.scale.fade(0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
205 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
206 subtk.scale.decrease()
45b12307c695 Initial revision
drewp
parents:
diff changeset
207 def draw_sliders(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
208 self.tk_focusFollowsMouse()
45b12307c695 Initial revision
drewp
parents:
diff changeset
209
45b12307c695 Initial revision
drewp
parents:
diff changeset
210 rowcount = -1
45b12307c695 Initial revision
drewp
parents:
diff changeset
211 col = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
212 for sub in self.submasters.get_all_subs():
45b12307c695 Initial revision
drewp
parents:
diff changeset
213 if col == 0: # make new row
45b12307c695 Initial revision
drewp
parents:
diff changeset
214 row = self.make_row()
45b12307c695 Initial revision
drewp
parents:
diff changeset
215 rowcount += 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
216 current_level = self.current_sub_levels.get(sub.name, 0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
217 subtk = self.draw_sub_slider(row, col, sub.name, current_level)
45b12307c695 Initial revision
drewp
parents:
diff changeset
218 self.slider_table[(rowcount, col)] = subtk
45b12307c695 Initial revision
drewp
parents:
diff changeset
219 self.name_to_subtk[sub.name] = subtk
45b12307c695 Initial revision
drewp
parents:
diff changeset
220 col += 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
221 col %= 10
45b12307c695 Initial revision
drewp
parents:
diff changeset
222
45b12307c695 Initial revision
drewp
parents:
diff changeset
223 def slider_changed(x, y, z, subtk=subtk):
45b12307c695 Initial revision
drewp
parents:
diff changeset
224 subtk.scale.draw_indicator_colors()
45b12307c695 Initial revision
drewp
parents:
diff changeset
225 self.send_levels()
45b12307c695 Initial revision
drewp
parents:
diff changeset
226
45b12307c695 Initial revision
drewp
parents:
diff changeset
227 subtk.slider_var.trace('w', slider_changed)
45b12307c695 Initial revision
drewp
parents:
diff changeset
228 def make_row(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
229 row = Frame(self, bd=2, bg='black')
45b12307c695 Initial revision
drewp
parents:
diff changeset
230 row.pack(expand=1, fill=BOTH)
45b12307c695 Initial revision
drewp
parents:
diff changeset
231 self.setup_key_nudgers(row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
232 self.rows.append(row)
45b12307c695 Initial revision
drewp
parents:
diff changeset
233 return row
45b12307c695 Initial revision
drewp
parents:
diff changeset
234 def draw_sub_slider(self, row, col, name, current_level):
45b12307c695 Initial revision
drewp
parents:
diff changeset
235 subtk = SubmasterTk(row, name, current_level, self)
45b12307c695 Initial revision
drewp
parents:
diff changeset
236 subtk.place(relx=col * 0.1, rely=0, relwidth=0.1, relheight=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
237 self.setup_key_nudgers(subtk.scale)
45b12307c695 Initial revision
drewp
parents:
diff changeset
238
45b12307c695 Initial revision
drewp
parents:
diff changeset
239 self.slider_vars[name] = subtk.slider_var
45b12307c695 Initial revision
drewp
parents:
diff changeset
240 return subtk
45b12307c695 Initial revision
drewp
parents:
diff changeset
241 def highlight_row(self, row):
45b12307c695 Initial revision
drewp
parents:
diff changeset
242 row = self.rows[row]
45b12307c695 Initial revision
drewp
parents:
diff changeset
243 row['bg'] = 'red'
45b12307c695 Initial revision
drewp
parents:
diff changeset
244 def unhighlight_row(self, row):
45b12307c695 Initial revision
drewp
parents:
diff changeset
245 row = self.rows[row]
45b12307c695 Initial revision
drewp
parents:
diff changeset
246 row['bg'] = 'black'
45b12307c695 Initial revision
drewp
parents:
diff changeset
247 def get_levels(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
248 return dict([(name, slidervar.get())
45b12307c695 Initial revision
drewp
parents:
diff changeset
249 for name, slidervar in self.slider_vars.items()])
45b12307c695 Initial revision
drewp
parents:
diff changeset
250 def get_levels_as_sub(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
251 scaledsubs = [self.submasters.get_sub_by_name(sub) * level \
45b12307c695 Initial revision
drewp
parents:
diff changeset
252 for sub, level in self.get_levels().items()]
45b12307c695 Initial revision
drewp
parents:
diff changeset
253
45b12307c695 Initial revision
drewp
parents:
diff changeset
254 maxes = sub_maxes(*scaledsubs)
45b12307c695 Initial revision
drewp
parents:
diff changeset
255 return maxes
45b12307c695 Initial revision
drewp
parents:
diff changeset
256 def save_current_stage(self, subname):
45b12307c695 Initial revision
drewp
parents:
diff changeset
257 print "saving current levels as", subname
45b12307c695 Initial revision
drewp
parents:
diff changeset
258 sub = self.get_levels_as_sub()
45b12307c695 Initial revision
drewp
parents:
diff changeset
259 sub.name = subname
45b12307c695 Initial revision
drewp
parents:
diff changeset
260 sub.save()
45b12307c695 Initial revision
drewp
parents:
diff changeset
261
45b12307c695 Initial revision
drewp
parents:
diff changeset
262 def save(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
263 pickle.dump(self.get_levels(),
45b12307c695 Initial revision
drewp
parents:
diff changeset
264 file('.keyboardcomposer.savedlevels', 'w'))
45b12307c695 Initial revision
drewp
parents:
diff changeset
265 def send_frequent_updates(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
266 """called when we get a fade -- send events as quickly as possible"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
267 if time.time() <= self.stop_frequent_update_time:
45b12307c695 Initial revision
drewp
parents:
diff changeset
268 self.send_levels()
45b12307c695 Initial revision
drewp
parents:
diff changeset
269 self.after(10, self.send_frequent_updates)
45b12307c695 Initial revision
drewp
parents:
diff changeset
270
45b12307c695 Initial revision
drewp
parents:
diff changeset
271 def get_dmx_list(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
272 maxes = self.get_levels_as_sub()
45b12307c695 Initial revision
drewp
parents:
diff changeset
273 return maxes.get_dmx_list()
45b12307c695 Initial revision
drewp
parents:
diff changeset
274 def send_levels(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
275 if not self.dmxdummy:
45b12307c695 Initial revision
drewp
parents:
diff changeset
276 levels = self.get_dmx_list()
45b12307c695 Initial revision
drewp
parents:
diff changeset
277 dmxclient.outputlevels(levels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
278 # print "sending levels", levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
279 def send_levels_loop(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
280 self.send_levels()
45b12307c695 Initial revision
drewp
parents:
diff changeset
281 self.after(1000, self.send_levels_loop)
45b12307c695 Initial revision
drewp
parents:
diff changeset
282 def refresh(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
283 self.save()
45b12307c695 Initial revision
drewp
parents:
diff changeset
284 self.submasters = Submasters()
45b12307c695 Initial revision
drewp
parents:
diff changeset
285 self.current_sub_levels = \
45b12307c695 Initial revision
drewp
parents:
diff changeset
286 pickle.load(file('.keyboardcomposer.savedlevels'))
45b12307c695 Initial revision
drewp
parents:
diff changeset
287 for r in self.rows:
45b12307c695 Initial revision
drewp
parents:
diff changeset
288 r.destroy()
45b12307c695 Initial revision
drewp
parents:
diff changeset
289 self.keyhints.destroy()
45b12307c695 Initial revision
drewp
parents:
diff changeset
290 self.buttonframe.destroy()
45b12307c695 Initial revision
drewp
parents:
diff changeset
291 self.draw_ui()
45b12307c695 Initial revision
drewp
parents:
diff changeset
292 def toggle_sub_recording(self, subname):
45b12307c695 Initial revision
drewp
parents:
diff changeset
293 # xor the set with the subname
45b12307c695 Initial revision
drewp
parents:
diff changeset
294 self.subs_being_recorded = self.subs_being_recorded ^ Set([subname])
45b12307c695 Initial revision
drewp
parents:
diff changeset
295 def got_timestamp(self, timestamp):
45b12307c695 Initial revision
drewp
parents:
diff changeset
296 """Music player should ultimately call this (over XML-RPC).
45b12307c695 Initial revision
drewp
parents:
diff changeset
297
45b12307c695 Initial revision
drewp
parents:
diff changeset
298 For subs not being recorded, we bring up their values (unless
45b12307c695 Initial revision
drewp
parents:
diff changeset
299 they're independent maybe? -- independence not implemented yet).
45b12307c695 Initial revision
drewp
parents:
diff changeset
300
45b12307c695 Initial revision
drewp
parents:
diff changeset
301 For subs being recorded, we record their values to disk.
45b12307c695 Initial revision
drewp
parents:
diff changeset
302
45b12307c695 Initial revision
drewp
parents:
diff changeset
303 Each SubmasterTk talks to the SubLevelLogger to record and playback
45b12307c695 Initial revision
drewp
parents:
diff changeset
304 levels."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
305 for sub in self.submasters.get_all_subs():
45b12307c695 Initial revision
drewp
parents:
diff changeset
306 name = sub.name
45b12307c695 Initial revision
drewp
parents:
diff changeset
307 subtk = self.name_to_subtk[name]
45b12307c695 Initial revision
drewp
parents:
diff changeset
308 if name in self.subs_being_recorded:
45b12307c695 Initial revision
drewp
parents:
diff changeset
309 subtk.record(timestamp)
45b12307c695 Initial revision
drewp
parents:
diff changeset
310 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
311 subtk.get_recorded_level(timestamp)
45b12307c695 Initial revision
drewp
parents:
diff changeset
312
45b12307c695 Initial revision
drewp
parents:
diff changeset
313 if __name__ == "__main__":
45b12307c695 Initial revision
drewp
parents:
diff changeset
314 s = Submasters()
45b12307c695 Initial revision
drewp
parents:
diff changeset
315
45b12307c695 Initial revision
drewp
parents:
diff changeset
316 root = Tk()
45b12307c695 Initial revision
drewp
parents:
diff changeset
317 tl = toplevelat("Keyboard Recorder XP MX 2004 Gold", existingtoplevel=root)
45b12307c695 Initial revision
drewp
parents:
diff changeset
318 kc = KeyboardRecorder(tl, s, dmxdummy=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
319 kc.pack(fill=BOTH, expand=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
320 atexit.register(kc.save)
45b12307c695 Initial revision
drewp
parents:
diff changeset
321 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
322 mainloop()
45b12307c695 Initial revision
drewp
parents:
diff changeset
323 except KeyboardInterrupt:
45b12307c695 Initial revision
drewp
parents:
diff changeset
324 tl.destroy()
45b12307c695 Initial revision
drewp
parents:
diff changeset
325 sys.exit()