0
|
1 from __future__ import nested_scopes
|
111
|
2 import sys
|
0
|
3 sys.path.append('..')
|
|
4 from Widgets.Fadable import Fadable
|
|
5
|
|
6 from Tix import *
|
111
|
7 import math
|
|
8 from Timeline import LevelFrame
|
|
9
|
|
10 Submaster = LevelFrame
|
0
|
11
|
|
12 nudge_keys = {
|
|
13 'up' : list('qwertyuiop'),
|
|
14 'down' : list('asdfghjkl')
|
|
15 }
|
|
16 nudge_keys['down'].append('semicolon')
|
|
17
|
|
18 class SubScale(Scale, Fadable):
|
|
19 def __init__(self, master, *args, **kw):
|
|
20 self.scale_var = kw.get('variable') or DoubleVar()
|
|
21 kw.update({'variable' : self.scale_var,
|
111
|
22 'from' : 100, 'to' : 0, 'showvalue' : 0,
|
|
23 'sliderlength' : 10})
|
0
|
24 Scale.__init__(self, master, *args, **kw)
|
111
|
25 Fadable.__init__(self, var=self.scale_var)
|
0
|
26
|
|
27 class SubmasterTk(Frame):
|
|
28 def __init__(self, master, name, current_level):
|
111
|
29 Frame.__init__(self, master)
|
0
|
30 self.slider_var = DoubleVar()
|
|
31 self.slider_var.set(current_level)
|
|
32 self.scale = SubScale(self, variable=self.slider_var, width=20)
|
111
|
33 textlabel = Label(self, text=name)
|
|
34 textlabel.pack(side=TOP)
|
0
|
35 self.scale.pack(side=BOTTOM, expand=1, fill=BOTH)
|
|
36
|
|
37 class KeyboardComposer(Frame):
|
111
|
38 def __init__(self, root, submasters, current_sub_levels=None):
|
|
39 Frame.__init__(self, root)
|
0
|
40 self.submasters = submasters
|
111
|
41 self.current_sub_levels = current_sub_levels or {}
|
0
|
42
|
|
43 self.rows = [] # this holds Tk Frames for each row
|
|
44 self.slider_vars = {} # this holds subname:sub Tk vars
|
|
45 self.slider_table = {} # this holds coords:sub Tk vars
|
|
46 self.current_row = 0
|
|
47
|
|
48 self.make_key_hints()
|
|
49 self.draw_sliders()
|
|
50 self.highlight_row(self.current_row)
|
|
51 self.rows[self.current_row].focus()
|
|
52 def make_key_hints(self):
|
|
53 keyhintrow = Frame(self)
|
|
54
|
|
55 col = 0
|
|
56 for upkey, downkey in zip(nudge_keys['up'],
|
|
57 nudge_keys['down']):
|
|
58 # what a hack!
|
|
59 downkey = downkey.replace('semicolon', ';')
|
|
60
|
|
61 # another what a hack!
|
|
62 keylabel = Label(keyhintrow, text='%s\n%s' % (upkey, downkey),
|
111
|
63 width=3, font=('Arial Bold', 12), bg='red', fg='white')
|
0
|
64 keylabel.pack(side=LEFT, expand=1, fill=X)
|
|
65 col += 1
|
|
66
|
|
67 keyhintrow.pack(fill=X, expand=0)
|
|
68 self.keyhints = keyhintrow
|
|
69 def setup_key_nudgers(self, tkobject):
|
|
70 for d, keys in nudge_keys.items():
|
|
71 for key in keys:
|
|
72 # lowercase makes full=0
|
|
73 keysym = "<KeyPress-%s>" % key
|
|
74 tkobject.bind(keysym, \
|
|
75 lambda evt, num=keys.index(key), d=d: \
|
|
76 self.got_nudger(num, d))
|
|
77
|
|
78 # uppercase makes full=1
|
|
79 keysym = "<KeyPress-%s>" % key.upper()
|
|
80 keysym = keysym.replace('SEMICOLON', 'colon')
|
|
81 tkobject.bind(keysym, \
|
|
82 lambda evt, num=keys.index(key), d=d: \
|
|
83 self.got_nudger(num, d, full=1))
|
|
84
|
|
85 # page up and page down change the row
|
|
86 for key in '<Prior> <Next> <Control-n> <Control-p>'.split():
|
|
87 tkobject.bind(key, self.change_row)
|
|
88
|
|
89 def change_row(self, event):
|
|
90 diff = 1
|
111
|
91 if event.keysym in ('Prior', '<Control-p>'):
|
0
|
92 diff = -1
|
|
93 old_row = self.current_row
|
|
94 self.current_row += diff
|
|
95 self.current_row = max(0, self.current_row)
|
|
96 self.current_row = min(len(self.rows) - 1, self.current_row)
|
|
97 self.unhighlight_row(old_row)
|
|
98 self.highlight_row(self.current_row)
|
|
99 row = self.rows[self.current_row]
|
|
100 self.keyhints.pack_configure(before=row)
|
|
101 def got_nudger(self, number, direction, full=0):
|
111
|
102 print "got_nudger", number, direction, full
|
0
|
103 subtk = self.slider_table[(self.current_row, number)]
|
|
104 if direction == 'up':
|
|
105 if full:
|
111
|
106 subtk.scale.fade(100)
|
0
|
107 else:
|
|
108 subtk.scale.increase()
|
|
109 else:
|
|
110 if full:
|
|
111 subtk.scale.fade(0)
|
|
112 else:
|
|
113 subtk.scale.decrease()
|
|
114 def draw_sliders(self):
|
|
115 self.tk_focusFollowsMouse()
|
|
116
|
|
117 rowcount = -1
|
|
118 col = 0
|
111
|
119 for sub in self.submasters:
|
0
|
120 if col == 0: # make new row
|
|
121 row = self.make_row()
|
|
122 rowcount += 1
|
|
123 current_level = self.current_sub_levels.get(sub.name, 0)
|
|
124 subtk = self.draw_sub_slider(row, col, sub.name, current_level)
|
|
125 self.slider_table[(rowcount, col)] = subtk
|
|
126 col += 1
|
|
127 col %= 10
|
|
128 def make_row(self):
|
111
|
129 row = Frame(self, bd=2)
|
0
|
130 row.pack(expand=1, fill=BOTH)
|
|
131 self.setup_key_nudgers(row)
|
|
132 self.rows.append(row)
|
|
133 return row
|
|
134 def draw_sub_slider(self, row, col, name, current_level):
|
|
135 subtk = SubmasterTk(row, name, current_level)
|
|
136 subtk.place(relx=col * 0.1, rely=0, relwidth=0.1, relheight=1)
|
|
137 self.setup_key_nudgers(subtk.scale)
|
|
138
|
|
139 self.slider_vars[name] = subtk.slider_var
|
|
140 return subtk
|
|
141 def highlight_row(self, row):
|
|
142 row = self.rows[row]
|
|
143 row['bg'] = 'red'
|
|
144 def unhighlight_row(self, row):
|
|
145 row = self.rows[row]
|
111
|
146 row['bg'] = '#d9d9d9'
|
0
|
147 def get_levels(self):
|
|
148 return dict([(name, slidervar.get())
|
|
149 for name, slidervar in self.slider_vars.items()])
|
|
150
|
|
151 if __name__ == "__main__":
|
111
|
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}))
|
0
|
158
|
|
159 root = Tk()
|
111
|
160 root.wm_geometry('400x400')
|
|
161 kc = KeyboardComposer(root, subs)
|
0
|
162 kc.pack(fill=BOTH, expand=1)
|
111
|
163 mainloop()
|