Mercurial > code > home > repos > light9
annotate light8/Subs.py @ 1428:7fd31c549e17
notes about effecteval
Ignore-this: 1f132f9161fd22f290e906597ed1069
author | drewp@bigasterisk.com |
---|---|
date | Sat, 11 Jun 2016 04:34:07 +0000 |
parents | 177e9ba0b4a7 |
children |
rev | line source |
---|---|
0 | 1 from Patch import * |
2 from time import time | |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
36
diff
changeset
|
3 from Tix import * |
0 | 4 from types import TupleType |
5 | |
6 stdfont = ('Arial', 8) | |
7 | |
8 class Param: # abstract | |
9 def get_value(self): | |
10 pass | |
28 | 11 def set_value(self, v): |
0 | 12 pass |
13 def draw_tk(self, frame): | |
14 pass | |
28 | 15 def __getstate__(self): |
16 return {'value' : self.get_value()} | |
17 def __setstate__(self, dict): | |
18 self.value = StringVar() | |
19 self.set_value(dict['value']) | |
0 | 20 |
21 class CheckboxParam(Param): | |
22 def __init__(self, initial=0): | |
23 self.value = IntVar() | |
24 self.value.set(initial) | |
25 def get_value(self): | |
26 return self.value.get() | |
27 def draw_tk(self, frame): | |
28 self.c = Checkbutton(frame, variable=self.value) | |
29 self.c.pack() | |
30 | |
31 class SliderParam(Param): | |
32 def __init__(self, range=(0, 1), res=0.01, initial=0, orient='v', | |
33 **options): | |
34 self.value = DoubleVar() | |
35 self.value.set(initial) | |
36 self.options = {'res' : res, 'to' : range[0], 'from' : range[1], | |
37 'orient' : orient, | |
38 'font' : stdfont, 'length' : 50, 'sliderlength' : 10, | |
39 'width' : 10} | |
40 self.options.update(options) | |
41 def get_value(self): | |
42 return self.value.get() | |
43 def draw_tk(self, frame): | |
44 s = Scale(frame, variable=self.value, **self.options) | |
45 s.pack() | |
46 | |
47 class TextParam(Param): | |
48 def __init__(self, initial=''): | |
49 self.value = StringVar() | |
50 self.value.set(initial) | |
51 def get_value(self): | |
52 return self.value.get() | |
53 def select_all(self, evt): | |
54 self.e.select_range(0, END) | |
55 def unfocus(self, evt): | |
56 self.frame.focus() | |
57 def draw_tk(self, frame): | |
58 self.frame = frame | |
59 self.e = Entry(frame, textvariable=self.value) | |
60 self.e.bind("<Return>", self.unfocus) | |
61 self.e.pack() | |
62 | |
63 class ListParam(Param): | |
64 def __init__(self, options=(), multiple=0, initial=''): | |
65 self.value = StringVar() | |
66 self.value.set(initial) | |
67 self.options = options | |
68 if multiple: | |
69 self.selectmode = 'MULTIPLE' | |
70 else: | |
71 self.selectmode = 'SINGLE' | |
72 def get_value(self): | |
73 try: | |
74 return self.l.get(self.l.curselection()) | |
75 except: | |
76 return '' | |
77 def draw_tk(self, frame): | |
78 self.l = Listbox(frame, selectmode=self.selectmode, font=stdfont, | |
79 width=max([len(o) for o in self.options]), | |
21 | 80 height=len(self.options), exportselection=0) |
0 | 81 for o in self.options: |
82 self.l.insert(END, o) | |
83 self.l.pack() | |
84 | |
85 class LabelParam(Param): | |
86 def __init__(self, initial=''): | |
87 self.value = StringVar() | |
88 self.value.set(initial) | |
89 def get_value(self): | |
90 return self.value.get() | |
91 def set_value(self, v): | |
28 | 92 if 'value' not in self.__dict__: |
93 self.value = StringVar() | |
0 | 94 self.value.set(v) |
95 def draw_tk(self, frame): | |
96 l = Label(frame, textvariable=self.value, font=stdfont) | |
97 l.pack() | |
98 | |
99 class ButtonParam(Param): | |
100 def __init__(self, text, **options): | |
101 self.options = {'text' : text} | |
102 self.options.update(options) | |
103 self.pressed = 0 | |
104 self.unread = 0 # unread button presses | |
105 def draw_tk(self, frame): | |
106 b = Button(frame, **self.options) | |
107 b.pack() | |
108 b.bind('<ButtonPress>', self.activate) | |
109 b.bind('<ButtonRelease>', self.deactivate) | |
110 def get_value(self): | |
111 if self.unread: | |
112 self.unread = 0 | |
113 return 1 | |
114 | |
115 return self.pressed | |
116 def activate(self, evt): | |
117 self.pressed = 1 | |
118 self.unread = 1 | |
119 def deactivate(self, evt): | |
120 self.pressed = 0 | |
121 | |
122 class Params: | |
123 def __init__(self): | |
124 self.params = {} | |
125 def add_param(self, name, param): | |
126 self.params[name] = param | |
127 def get_param_value(self, name): | |
128 return self.params[name].get_value() | |
129 def __getitem__(self, name): | |
130 return self.params[name].get_value() | |
131 def __setitem__(self, name, value): | |
132 self.params[name].set_value(value) | |
133 def draw_tk(self, frame): | |
134 for name,param in self.params.items(): | |
135 f = Frame(frame) | |
136 l = Label(f, text=name, font=stdfont) | |
137 l.pack(side='left') | |
138 pframe = Frame(f) | |
139 param.draw_tk(pframe) | |
140 pframe.pack(side='right') | |
141 f.pack() | |
142 | |
143 class SliderAdjuster: | |
144 def __init__(self): | |
145 self.var = None | |
146 self.atzero = 0 | |
147 def set(self, level): | |
148 if self.var is not None: | |
149 self.var.set(level) | |
150 def get(self, level): | |
151 if self.var is not None: | |
152 return self.var.get() | |
153 return None | |
154 def justturnedon(self): | |
155 return self.atzero | |
28 | 156 def __getstate__(self): |
157 state = self.__dict__.copy() | |
158 # remove var (non-pickleable) | |
159 try: | |
160 del state['var'] | |
161 except KeyError: | |
162 pass | |
163 return state | |
164 # no setstate needed | |
0 | 165 |
166 class Sub: | |
36 | 167 def __init__(self, name, levels, dimmers=68, color=None): |
168 self.name = name # keep this consistent please | |
0 | 169 self.levels = levels |
28 | 170 self.dimmers = dimmers # needed? |
0 | 171 self.is_effect = callable(self.levels) |
172 self.slideradjuster = SliderAdjuster() | |
71 | 173 self.namecache = {} |
0 | 174 if self.is_effect: |
175 self.params = Params() | |
176 self.generator = self.levels(self.params, self.slideradjuster) | |
177 self.generator.next() | |
178 self.color = color | |
71 | 179 def resolve_name(self, ch_name): |
180 if ch_name in self.namecache: | |
181 return self.namecache[ch_name] | |
182 else: | |
183 resolved = get_dmx_channel(ch_name) | |
184 self.namecache[ch_name] = resolved | |
185 return resolved | |
0 | 186 def set_slider_var(self, slidervar): |
187 if self.is_effect: | |
188 self.slideradjuster.var = slidervar | |
189 def draw_tk(self, frame): | |
190 if self.is_effect: | |
191 self.params.draw_tk(frame) | |
192 def get_state(self): | |
28 | 193 state = self.__dict__.copy() |
194 if self.is_effect: | |
195 del state['levels'] | |
196 del state['generator'] | |
197 | |
198 return state | |
199 def set_state(self, statedict): | |
200 self.__dict__.update(statedict) | |
0 | 201 def get_levels(self, level): |
71 | 202 """returns a scaled version of the levels in the sub; channel names |
203 are resolved to numbers""" | |
0 | 204 d = {} |
205 if level == 0: | |
206 self.slideradjuster.atzero = 1 | |
207 return d | |
29
f595fdd4c548
minor cleanups, convert parallel port controller to a class
dmcc
parents:
28
diff
changeset
|
208 if self.is_effect: # effect |
0 | 209 d = self.generator.next() |
210 self.slideradjuster.atzero = 0 | |
71 | 211 return dict([(get_dmx_channel(ch), float(lev) * float(level)) |
212 for ch, lev in d.items()]) | |
0 | 213 else: # dictionary (standard) |
214 d = self.levels | |
71 | 215 return dict([(self.resolve_name(ch), float(lev) * float(level)) |
216 for ch, lev in d.items()]) | |
0 | 217 |
36 | 218 # |
219 # methods for Subediting to use | |
220 # | |
221 def getlevels(self): | |
222 return self.levels.copy() | |
223 def reviselevels(self,levels): | |
224 # we can accept these new levels; subediting has done all the work | |
225 self.levels.update(levels) | |
226 | |
227 | |
228 | |
0 | 229 def reload_data(dummy): |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
36
diff
changeset
|
230 global subs, cues |
0 | 231 if dummy: |
232 import ConfigDummy as Config | |
233 else: | |
234 import Config | |
235 | |
236 reload(Config) | |
237 | |
238 subs = {} | |
239 for name, levels in Config.subs.items(): | |
240 if type(name) == TupleType: | |
241 name, color = name | |
242 else: | |
28 | 243 color = None |
0 | 244 |
36 | 245 subs[name] = Sub(name, levels, color=color) |
0 | 246 |
247 # subs = dict([(name, Sub(levels)) for name, levels in Config.subs.items()]) | |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
36
diff
changeset
|
248 |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
36
diff
changeset
|
249 cues = Config.cues |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
36
diff
changeset
|
250 |
36 | 251 def longestsubname(): |
252 return max([len(x) for x in subs.keys()]) |