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