Mercurial > code > home > repos > light9
annotate light8/ExtSliderMapper.py @ 92:827a675131dc
better attach behavior, "attached" -> "synced"
author | dmcc |
---|---|
date | Sat, 13 Jul 2002 03:01:42 +0000 |
parents | a5c0b7ac63cf |
children | 29a8b23d8db5 |
rev | line source |
---|---|
80 | 1 """some more of the panels""" |
0 | 2 from Tix import * |
3 | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
4 class SliderMapping: |
92 | 5 def __init__(self, default='disconnected', synced=0, extinputlevel=0, |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
6 sublevel=0): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
7 self.subname = StringVar() # name of submaster we're connected to |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
8 self.subname.set(default) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
9 self.sublevel = DoubleVar() # scalelevel variable of that submaster |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
10 self.sublevel.set(sublevel) |
92 | 11 self.synced = BooleanVar() # currently synced |
12 self.synced.set(synced) | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
13 self.extlevel = DoubleVar() # external slider's input |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
14 self.extlevel.set(extinputlevel) |
87 | 15 self.widgets = [] # list of widgets drawn |
16 self.sublabel = None # the label which represents a sub level. we hold on to | |
17 # it so we can change its textvariable | |
18 self.lastbgcolor = None # last background color drawn to avoid unnecessary | |
19 # updates | |
92 | 20 self.ignoreunsync = 0 # whether to ignore the next request to unsync |
21 # this is because we trace the slider variable, but | |
22 # we are also semi-responsible for setting it in | |
23 # Lightboard.changelevels. | |
24 def ignorenextunync(self): | |
25 print "skipping next unsync" | |
26 self.ignoreunsync += 1 | |
27 self.sync() | |
28 # self.color_bg() | |
29 def sync(self, *args): | |
30 # print "syncing" | |
31 self.synced.set(1) | |
32 # self.color_bg() | |
33 def unsync(self, *args): | |
34 if self.ignoreunsync > 0: | |
35 print "skipped unsync", self.ignoreunsync | |
36 self.synced.set(1) | |
37 self.color_bg() | |
38 self.ignoreunsync -= 1 | |
39 return | |
40 ''' | |
41 print "unsyncing" | |
42 ''' | |
43 self.synced.set(0) | |
44 # self.color_bg() | |
45 def issynced(self): | |
46 return self.synced.get() | |
47 def disconnect(self, *args): | |
48 self.set_subname('disconnected') # a bit hack-like | |
49 self.sublabel.configure(text="N/A") | |
50 self.color_bg() | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
51 def isdisconnected(self): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
52 return self.subname.get() == 'disconnected' |
92 | 53 def check_synced(self, *args): |
54 'If external level is near than the sublevel, it synces' | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
55 if self.isdisconnected(): |
92 | 56 self.unsync() |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
57 return |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
58 |
92 | 59 if abs(self.extlevel.get() - self.sublevel.get()) <= 0.02: |
60 self.sync() | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
61 def changed_extinput(self, newlevel): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
62 'When a new external level is received, this incorporates it' |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
63 self.extlevel.set(newlevel) |
92 | 64 self.check_synced() |
65 self.color_bg() | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
66 def set_subname(self, newname): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
67 self.subname.set(newname) |
92 | 68 self.unsync() |
69 self.color_bg() | |
70 def color_bg(self): | |
87 | 71 if self.widgets: |
92 | 72 self.check_synced() |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
73 if self.isdisconnected(): |
87 | 74 color = 'honeyDew4' |
92 | 75 elif self.issynced(): |
76 # elif abs(self.extlevel.get() - self.sublevel.get()) <= 0.02: | |
87 | 77 color = 'honeyDew2' |
92 | 78 else: # unsynced |
87 | 79 color = 'red' |
80 | |
92 | 81 # print "color", color, "lastbgcolor", self.lastbgcolor |
87 | 82 if self.lastbgcolor == color: return |
83 for widget in self.widgets: | |
84 widget.configure(bg=color) | |
85 self.lastbgcolor = color | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
86 def set_sublevel_var(self, newvar): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
87 'newvar is one of the variables in scalelevels' |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
88 self.sublevel = newvar |
92 | 89 self.sublevel.trace('w', self.unsync) |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
90 if self.sublabel: |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
91 self.sublabel.configure(textvariable=newvar) |
92 | 92 self.check_synced() |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
93 def get_mapping(self): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
94 'Get name of submaster currently mapped' |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
95 return self.subname.get() |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
96 def get_level_pair(self): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
97 'Returns suitable output for ExtSliderMapper.get_levels()' |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
98 return (self.subname.get(), self.extlevel.get()) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
99 def draw_interface(self, master, subnames): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
100 'Draw interface into master, given a list of submaster names' |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
101 frame = Frame(master) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
102 c = ComboBox(frame, variable=self.subname) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
103 c.slistbox.listbox.insert(END, "disconnected") |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
104 for s in subnames: |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
105 c.slistbox.listbox.insert(END, s) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
106 c.entry.configure(width=12) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
107 statframe = Frame(frame) |
92 | 108 cb = Checkbutton(statframe, variable=self.synced, |
109 text="Synced") | |
87 | 110 cb.grid(columnspan=2, sticky=W) |
111 ilabel = Label(statframe, text="Input", fg='blue') | |
112 ilabel.grid(row=1, sticky=W) | |
113 extlabel = Label(statframe, textvariable=self.extlevel, width=5) | |
114 extlabel.grid(row=1, column=1) | |
115 rlabel = Label(statframe, text="Real") | |
116 rlabel.grid(row=2, sticky=W) | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
117 self.sublabel = Label(statframe, text="N/A", width=5) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
118 self.sublabel.grid(row=2, column=1) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
119 statframe.pack(side=BOTTOM, expand=1, fill=X) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
120 c.pack() |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
121 frame.pack(side=LEFT, expand=1, fill=BOTH) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
122 |
87 | 123 self.widgets = [frame, c, statframe, cb, ilabel, extlabel, rlabel, |
124 self.sublabel] | |
125 | |
0 | 126 class ExtSliderMapper(Frame): |
80 | 127 def __init__(self, parent, sliderlevels, sliderinput, filename='slidermapping', |
128 numsliders=4): | |
0 | 129 'Slider levels is scalelevels, sliderinput is an ExternalInput object' |
80 | 130 Frame.__init__(self, parent) |
0 | 131 self.parent = parent |
132 self.sliderlevels = sliderlevels | |
133 self.sliderinput = sliderinput | |
134 self.filename = filename | |
135 self.numsliders = numsliders | |
136 self.file = None | |
137 | |
138 # don't call setup, let them do that when scalelevels is created | |
139 def setup(self): | |
140 self.subnames = self.sliderlevels.keys() | |
141 self.subnames.sort() | |
142 self.presets = {} | |
143 self.load_presets() | |
144 | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
145 self.current_preset = StringVar() # name of current preset |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
146 self.current_mappings = [] |
80 | 147 for i in range(self.numsliders): |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
148 self.current_mappings.append(SliderMapping()) |
0 | 149 |
150 self.draw_interface() | |
80 | 151 def load_presets(self): |
0 | 152 self.file = open(self.filename, 'r') |
153 lines = self.file.readlines() | |
154 for l in lines: | |
155 tokens = l[:-1].split('\t') | |
156 name = tokens.pop(0) | |
157 self.presets[name] = tokens | |
158 self.file.close() | |
159 def save_presets(self): | |
160 self.file = open(self.filename, 'w') | |
161 self.file.seek(0) | |
162 preset_names = self.presets.keys() | |
163 preset_names.sort() | |
164 for p in preset_names: | |
165 s = '\t'.join([p] + self.presets[p]) + '\n' | |
166 self.file.write(s) | |
167 self.file.close() | |
168 def load_scalelevels(self): | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
169 for slidermap in self.current_mappings: |
0 | 170 try: |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
171 v = self.sliderlevels[slidermap.get_mapping()] |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
172 slidermap.set_sublevel_var(v) |
0 | 173 except KeyError: |
80 | 174 pass |
0 | 175 |
176 def get_levels(self): | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
177 'Called by changelevels, returns a dict of new values for submasters' |
0 | 178 if not self.sliderinput: return {} |
179 | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
180 self.load_scalelevels() # freshen our input from the physical sliders |
0 | 181 |
182 rawlevels = self.sliderinput.get_levels() | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
183 for rawlev, slidermap in zip(rawlevels, self.current_mappings): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
184 slidermap.changed_extinput(rawlev) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
185 |
80 | 186 outputlevels = {} |
92 | 187 for m in self.current_mappings: |
188 if m.issynced(): | |
189 k, v = m.get_level_pair() | |
190 outputlevels[k] = v | |
191 m.ignorenextunync() | |
192 return outputlevels | |
193 ''' | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
194 return dict([m.get_level_pair() |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
195 for m in self.current_mappings |
92 | 196 if m.issynced()]) |
197 ''' | |
0 | 198 def draw_interface(self): |
80 | 199 self.reallevellabels = [] |
200 subchoiceframe = Frame(self) | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
201 for m in self.current_mappings: |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
202 m.draw_interface(subchoiceframe, self.subnames) |
0 | 203 subchoiceframe.pack() |
204 | |
80 | 205 presetframe = Frame(self) |
206 Label(presetframe, text="Preset:").pack(side=LEFT) | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
207 self.presetcombo = ComboBox(presetframe, variable=self.current_preset, |
80 | 208 editable=1, command=self.apply_preset) |
0 | 209 self.draw_presets() |
210 self.presetcombo.pack(side=LEFT) | |
80 | 211 Button(presetframe, text="Add", padx=0, pady=0, |
0 | 212 command=self.add_preset).pack(side=LEFT) |
80 | 213 Button(presetframe, text="Delete", padx=0, pady=0, |
0 | 214 command=self.delete_preset).pack(side=LEFT) |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
215 Button(presetframe, text="Disconnect", padx=0, pady=0, |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
216 command=self.disconnect_all).pack(side=LEFT) |
0 | 217 presetframe.pack(side=BOTTOM) |
218 def apply_preset(self, preset): | |
219 if not preset: return | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
220 preset_mapping = self.presets.get(preset) |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
221 if not preset_mapping: return |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
222 for subname, slidermap in zip(preset_mapping, self.current_mappings): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
223 slidermap.set_subname(subname) |
0 | 224 def delete_preset(self, *args): |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
225 del self.presets[self.current_preset.get()] |
0 | 226 self.presetcombo.slistbox.listbox.delete(0, END) |
227 self.draw_presets() | |
228 self.save_presets() | |
229 def add_preset(self, *args): | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
230 self.presets[self.current_preset.get()] = [m.get_mapping() |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
231 for m in self.current_mappings] |
0 | 232 self.presetcombo.slistbox.listbox.delete(0, END) |
233 self.draw_presets() | |
234 self.save_presets() | |
235 def draw_presets(self): | |
236 preset_names = self.presets.keys() | |
237 preset_names.sort() | |
238 for p in preset_names: | |
239 self.presetcombo.slistbox.listbox.insert(END, p) | |
86
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
240 def disconnect_all(self): |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
241 for m in self.current_mappings: |
5a162150b68d
new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents:
80
diff
changeset
|
242 m.disconnect() |