Mercurial > code > home > repos > light9
annotate light8/Subs.py @ 29:f595fdd4c548
minor cleanups, convert parallel port controller to a class
author | dmcc |
---|---|
date | Sun, 07 Jul 2002 10:41:06 +0000 |
parents | b0342f9ee328 |
children | d07b3a20c48e |
rev | line source |
---|---|
0 | 1 from Patch import * |
2 from time import time | |
4 | 3 from Tkinter 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: | |
4 | 167 def __init__(self, levels, dimmers=68, color=None): |
0 | 168 self.levels = levels |
28 | 169 self.dimmers = dimmers # needed? |
0 | 170 self.is_effect = callable(self.levels) |
171 self.slideradjuster = SliderAdjuster() | |
172 if self.is_effect: | |
173 self.params = Params() | |
174 self.generator = self.levels(self.params, self.slideradjuster) | |
175 self.generator.next() | |
176 self.color = color | |
177 def set_slider_var(self, slidervar): | |
178 if self.is_effect: | |
179 self.slideradjuster.var = slidervar | |
180 def draw_tk(self, frame): | |
181 if self.is_effect: | |
182 self.params.draw_tk(frame) | |
183 def get_state(self): | |
28 | 184 state = self.__dict__.copy() |
185 if self.is_effect: | |
186 del state['levels'] | |
187 del state['generator'] | |
188 | |
189 return state | |
190 def set_state(self, statedict): | |
191 self.__dict__.update(statedict) | |
0 | 192 def get_levels(self, level): |
193 d = {} | |
194 if level == 0: | |
195 self.slideradjuster.atzero = 1 | |
196 return d | |
29
f595fdd4c548
minor cleanups, convert parallel port controller to a class
dmcc
parents:
28
diff
changeset
|
197 if self.is_effect: # effect |
0 | 198 d = self.generator.next() |
199 self.slideradjuster.atzero = 0 | |
200 else: # dictionary (standard) | |
201 d = self.levels | |
4 | 202 return dict([(get_dmx_channel(ch), float(lev) * float(level)) |
203 for ch, lev in d.items()]) | |
0 | 204 |
205 def reload_data(dummy): | |
4 | 206 global subs |
0 | 207 if dummy: |
208 import ConfigDummy as Config | |
209 else: | |
210 import Config | |
211 | |
212 reload(Config) | |
213 | |
214 subs = {} | |
215 for name, levels in Config.subs.items(): | |
216 if type(name) == TupleType: | |
217 name, color = name | |
218 else: | |
28 | 219 color = None |
0 | 220 |
4 | 221 subs[name] = Sub(levels, color=color) |
0 | 222 |
223 # subs = dict([(name, Sub(levels)) for name, levels in Config.subs.items()]) |