Mercurial > code > home > repos > light9
comparison flax/KeyboardComposer.py @ 205:3905d3c92aaa
twisted mainloop, more row-change keys, xmlrpc fadesub command on port 8050
author | drewp |
---|---|
date | Sun, 10 Apr 2005 15:03:24 +0000 |
parents | 79bc84310e80 |
children |
comparison
equal
deleted
inserted
replaced
204:186a66095036 | 205:3905d3c92aaa |
---|---|
1 from __future__ import nested_scopes | 1 from __future__ import division,nested_scopes |
2 import sys, time | 2 import sys, time |
3 sys.path.append('..') | 3 sys.path.append('..') |
4 from Widgets.Fadable import Fadable | 4 from Widgets.Fadable import Fadable |
5 | 5 |
6 from twisted.internet import reactor,tksupport | |
7 from twisted.web import xmlrpc, server | |
6 from Tix import * | 8 from Tix import * |
7 import math, atexit, pickle | 9 import math, atexit, pickle |
8 from Submaster import Submasters, sub_maxes | 10 from Submaster import Submasters, sub_maxes |
9 import dmxclient | 11 import dmxclient |
10 from uihelpers import toplevelat | 12 from uihelpers import toplevelat |
38 def __init__(self, master, name, current_level): | 40 def __init__(self, master, name, current_level): |
39 Frame.__init__(self, master, bd=1, relief='raised', bg='black') | 41 Frame.__init__(self, master, bd=1, relief='raised', bg='black') |
40 self.slider_var = DoubleVar() | 42 self.slider_var = DoubleVar() |
41 self.slider_var.set(current_level) | 43 self.slider_var.set(current_level) |
42 self.scale = SubScale(self, variable=self.slider_var, width=20) | 44 self.scale = SubScale(self, variable=self.slider_var, width=20) |
43 namelabel = Label(self, text=name, font="Arial 8", bg='black', | 45 namelabel = Label(self, text=name, font="Arial 11", bg='black', |
44 fg='white') | 46 fg='white') |
45 namelabel.pack(side=TOP) | 47 namelabel.pack(side=TOP) |
46 levellabel = Label(self, textvariable=self.slider_var, font="Arial 8", | 48 levellabel = Label(self, textvariable=self.slider_var, font="Arial 11", |
47 bg='black', fg='white') | 49 bg='black', fg='white') |
48 levellabel.pack(side=TOP) | 50 levellabel.pack(side=TOP) |
49 self.scale.pack(side=BOTTOM, expand=1, fill=BOTH) | 51 self.scale.pack(side=BOTTOM, expand=1, fill=BOTH) |
50 | 52 |
51 class KeyboardComposer(Frame): | 53 class KeyboardComposer(Frame): |
68 self.send_levels_loop() | 70 self.send_levels_loop() |
69 def draw_ui(self): | 71 def draw_ui(self): |
70 self.rows = [] # this holds Tk Frames for each row | 72 self.rows = [] # this holds Tk Frames for each row |
71 self.slider_vars = {} # this holds subname:sub Tk vars | 73 self.slider_vars = {} # this holds subname:sub Tk vars |
72 self.slider_table = {} # this holds coords:sub Tk vars | 74 self.slider_table = {} # this holds coords:sub Tk vars |
75 self.name_to_subtk = {} # subname : SubmasterTk instance | |
73 self.current_row = 0 | 76 self.current_row = 0 |
74 | 77 |
75 self.make_key_hints() | 78 self.make_key_hints() |
76 self.draw_sliders() | 79 self.draw_sliders() |
77 self.highlight_row(self.current_row) | 80 self.highlight_row(self.current_row) |
121 keysym = keysym.replace('SEMICOLON', 'colon') | 124 keysym = keysym.replace('SEMICOLON', 'colon') |
122 tkobject.bind(keysym, \ | 125 tkobject.bind(keysym, \ |
123 lambda evt, num=keys.index(key), d=d: \ | 126 lambda evt, num=keys.index(key), d=d: \ |
124 self.got_nudger(num, d, full=1)) | 127 self.got_nudger(num, d, full=1)) |
125 | 128 |
126 # page up and page down change the row | 129 # Row changing: |
127 for key in '<Prior> <Next> <Control-n> <Control-p>'.split(): | 130 # Page dn, C-n, and ] do down |
131 # Page up, C-p, and ' do up | |
132 for key in '<Prior> <Next> <Control-n> <Control-p> ' \ | |
133 '<Key-bracketright> <Key-apostrophe>'.split(): | |
128 tkobject.bind(key, self.change_row) | 134 tkobject.bind(key, self.change_row) |
129 | 135 |
130 def change_row(self, event): | 136 def change_row(self, event): |
131 diff = 1 | 137 diff = 1 |
132 if event.keysym in ('Prior', 'p'): | 138 if event.keysym in ('Prior', 'p', 'bracketright'): |
133 diff = -1 | 139 diff = -1 |
134 old_row = self.current_row | 140 old_row = self.current_row |
135 self.current_row += diff | 141 self.current_row += diff |
136 self.current_row = max(0, self.current_row) | 142 self.current_row = max(0, self.current_row) |
137 self.current_row = min(len(self.rows) - 1, self.current_row) | 143 self.current_row = min(len(self.rows) - 1, self.current_row) |
161 row = self.make_row() | 167 row = self.make_row() |
162 rowcount += 1 | 168 rowcount += 1 |
163 current_level = self.current_sub_levels.get(sub.name, 0) | 169 current_level = self.current_sub_levels.get(sub.name, 0) |
164 subtk = self.draw_sub_slider(row, col, sub.name, current_level) | 170 subtk = self.draw_sub_slider(row, col, sub.name, current_level) |
165 self.slider_table[(rowcount, col)] = subtk | 171 self.slider_table[(rowcount, col)] = subtk |
172 self.name_to_subtk[sub.name] = subtk | |
166 col += 1 | 173 col += 1 |
167 col %= 10 | 174 col %= 10 |
168 | 175 |
169 def slider_changed(x, y, z, subtk=subtk): | 176 def slider_changed(x, y, z, subtk=subtk): |
170 subtk.scale.draw_indicator_colors() | 177 subtk.scale.draw_indicator_colors() |
201 return maxes | 208 return maxes |
202 def save_current_stage(self, subname): | 209 def save_current_stage(self, subname): |
203 print "saving current levels as", subname | 210 print "saving current levels as", subname |
204 sub = self.get_levels_as_sub() | 211 sub = self.get_levels_as_sub() |
205 sub.name = subname | 212 sub.name = subname |
213 sub.temporary = 0 | |
206 sub.save() | 214 sub.save() |
207 | 215 |
208 def save(self): | 216 def save(self): |
209 pickle.dump(self.get_levels(), | 217 pickle.dump(self.get_levels(), |
210 file('.keyboardcomposer.savedlevels', 'w')) | 218 file('.keyboardcomposer.savedlevels', 'w')) |
234 r.destroy() | 242 r.destroy() |
235 self.keyhints.destroy() | 243 self.keyhints.destroy() |
236 self.buttonframe.destroy() | 244 self.buttonframe.destroy() |
237 self.draw_ui() | 245 self.draw_ui() |
238 | 246 |
247 class LevelServer(xmlrpc.XMLRPC): | |
248 def __init__(self,name_to_subtk): | |
249 self.name_to_subtk = name_to_subtk | |
250 | |
251 def xmlrpc_fadesub(self,subname,level,secs): | |
252 """submaster will fade to level in secs""" | |
253 try: | |
254 self.name_to_subtk[subname].scale.fade(level,secs) | |
255 ret='ok' | |
256 except Exception,e: | |
257 ret=str(e) | |
258 return ret | |
259 | |
260 | |
239 if __name__ == "__main__": | 261 if __name__ == "__main__": |
240 s = Submasters() | 262 s = Submasters() |
241 | 263 |
242 root = Tk() | 264 root = Tk() |
243 tl = toplevelat("Keyboard Composer", existingtoplevel=root) | 265 tl = toplevelat("Keyboard Composer", existingtoplevel=root) |
244 kc = KeyboardComposer(tl, s, dmxdummy=0) | 266 kc = KeyboardComposer(tl, s, dmxdummy=0) |
245 kc.pack(fill=BOTH, expand=1) | 267 kc.pack(fill=BOTH, expand=1) |
246 atexit.register(kc.save) | 268 |
247 try: | 269 ls = LevelServer(kc.name_to_subtk) |
248 mainloop() | 270 reactor.listenTCP(8050, server.Site(ls)) |
249 except KeyboardInterrupt: | 271 |
250 tl.destroy() | 272 root.bind("<Destroy>",reactor.stop) |
251 sys.exit() | 273 root.protocol('WM_DELETE_WINDOW', reactor.stop) |
274 reactor.addSystemEventTrigger('after','shutdown',kc.save) | |
275 tksupport.install(root,ms=10) | |
276 reactor.run() |