Mercurial > code > home > repos > light9
comparison light8/ExtSliderMapper.py @ 101:a995fd1a8f03
result of 7.12 performance
author | dmcc |
---|---|
date | Sun, 14 Jul 2002 02:44:27 +0000 |
parents | f13cf18224f2 |
children | e04f7b552bcd |
comparison
equal
deleted
inserted
replaced
100:f13cf18224f2 | 101:a995fd1a8f03 |
---|---|
1 """ The External Slider Mapping widget determines which pots map to which | 1 """ The External Slider Mapping widget determines which pots map to which |
2 submasters. It tells you the status of each mapping and saves and loads | 2 submasters. It tells you the status of each mapping and saves and loads |
3 presets. The show is relying on this module! Do not lose it! | 3 presets. The show is relying on this module! Do not lose it! |
4 | 4 |
5 FUQ (frequently unasked question) | 5 FUQ (frequently unasked question(s)) |
6 | 6 |
7 1. What's with all the *args? | 7 1. What's with all the *args? |
8 | 8 |
9 It lets functions take any number of arguments and throw them away. | 9 It lets functions take any number of arguments and throw them away. |
10 Callbacks do this, and we typically don't care about what they have to say. """ | 10 Callbacks do this, and we typically don't care about what they have to say. """ |
11 | 11 |
12 from Tix import * | 12 from Tix import * |
13 from uihelpers import FancyDoubleVar | |
14 | |
15 stdfont = ('Arial', 8) | |
13 | 16 |
14 class SliderMapping: | 17 class SliderMapping: |
15 def __init__(self, default='disconnected', synced=0, extinputlevel=0, | 18 def __init__(self, default='disconnected', synced=0, extinputlevel=0, |
16 sublevel=0): | 19 sublevel=0): |
17 self.subname = StringVar() # name of submaster we're connected to | 20 self.subname = StringVar() # name of submaster we're connected to |
18 self.subname.set(default) | 21 self.subname.set(default) |
19 self.sublevel = DoubleVar() # scalelevel variable of that submaster | 22 self.sublevel = DoubleVar() # scalelevel variable of that submaster |
23 # self.sublevel = FancyDoubleVar() # scalelevel variable of that submaster | |
20 self.sublevel.set(sublevel) | 24 self.sublevel.set(sublevel) |
21 self.synced = BooleanVar() # currently synced | 25 self.synced = BooleanVar() # currently synced |
22 self.synced.set(synced) | 26 self.synced.set(synced) |
23 self.extlevel = DoubleVar() # external slider's input | 27 self.extlevel = DoubleVar() # external slider's input |
24 self.extlevel.set(extinputlevel) | 28 self.extlevel.set(extinputlevel) |
37 self.color_bg() | 41 self.color_bg() |
38 def issynced(self): | 42 def issynced(self): |
39 return self.synced.get() | 43 return self.synced.get() |
40 def disconnect(self, *args): | 44 def disconnect(self, *args): |
41 self.set_subname('disconnected') # a bit hack-like | 45 self.set_subname('disconnected') # a bit hack-like |
46 # self.sublevel.delete_named('sync') | |
47 ''' | |
48 try: | |
49 if self.sublevel.unsync_trace_cbname is not None: | |
50 # self.sublevel.trace_vdelete('w', | |
51 # self.sublevel.unsync_trace_cbname) | |
52 self.sublevel._tk.call('trace', 'vdelete', self.sublevel._name, | |
53 'w', self.sublevel.unsync_trace_cbname) | |
54 self.sublevel.unsync_trace_cbname = None | |
55 except AttributeError: | |
56 pass | |
57 ''' | |
58 | |
42 self.sublabel.configure(text="N/A") | 59 self.sublabel.configure(text="N/A") |
43 self.color_bg() | 60 self.color_bg() |
44 def isdisconnected(self): | 61 def isdisconnected(self): |
45 return self.subname.get() == 'disconnected' # a bit more hack-like | 62 return self.subname.get() == 'disconnected' # a bit more hack-like |
46 def check_synced(self, *args): | 63 def check_synced(self, *args): |
86 self.lastbgcolor = color | 103 self.lastbgcolor = color |
87 def set_sublevel_var(self, newvar): | 104 def set_sublevel_var(self, newvar): |
88 'newvar is one of the variables in scalelevels' | 105 'newvar is one of the variables in scalelevels' |
89 | 106 |
90 if newvar is not self.sublevel: | 107 if newvar is not self.sublevel: |
108 # self.sublevel.delete_named('sync') | |
109 self.sublevel = newvar | |
110 self.sublabel.configure(textvariable=newvar) | |
111 # self.sublevel.trace_named('sync', lambda *args: self.unsync(*args)) | |
112 ''' | |
91 try: | 113 try: |
92 # remove an old trace | 114 if self.sublevel.unsync_trace_cbname is not None: |
93 self.sublevel.trace_vdelete('w', | 115 # remove an old trace |
94 self.sublevel.unsync_trace_cbname) | 116 self.sublevel.trace_vdelete('w', |
117 self.sublevel.unsync_trace_cbname) | |
95 except AttributeError: | 118 except AttributeError: |
96 pass # it didn't have one | 119 pass # it didn't have one |
97 | 120 |
98 self.sublevel = newvar | 121 self.sublevel = newvar |
99 self.sublevel.unsync_trace_cbname = self.sublevel.trace('w', | 122 self.sublevel.unsync_trace_cbname = self.sublevel.trace('w', |
100 self.unsync) | 123 self.unsync) |
101 | 124 ''' |
102 if self.sublabel: | 125 |
103 self.sublabel.configure(textvariable=newvar) | 126 # if self.sublabel: |
127 # self.sublabel.configure(textvariable=newvar) | |
104 self.check_synced() | 128 self.check_synced() |
105 def get_mapping(self): | 129 def get_mapping(self): |
106 'Get name of submaster currently mapped' | 130 'Get name of submaster currently mapped' |
107 return self.subname.get() | 131 return self.subname.get() |
108 def get_level_pair(self): | 132 def get_level_pair(self): |
109 'Returns suitable output for ExtSliderMapper.get_levels()' | 133 'Returns suitable output for ExtSliderMapper.get_levels()' |
110 return (self.subname.get(), self.extlevel.get()) | 134 return (self.subname.get(), self.extlevel.get()) |
111 def draw_interface(self, master, subnames): | 135 def draw_interface(self, master, subnames): |
112 'Draw interface into master, given a list of submaster names' | 136 'Draw interface into master, given a list of submaster names' |
113 frame = Frame(master) | 137 frame = Frame(master) |
114 c = ComboBox(frame, variable=self.subname) | 138 c = ComboBox(frame, variable=self.subname, dropdown=0) |
115 c.slistbox.listbox.insert(END, "disconnected") | 139 c.slistbox.listbox.insert(END, "disconnected") |
140 # c.listbox.insert(END, "disconnected") | |
116 for s in subnames: | 141 for s in subnames: |
117 c.slistbox.listbox.insert(END, s) | 142 c.slistbox.listbox.insert(END, s) |
118 c.entry.configure(width=12) | 143 # c.listbox.insert(END, s) |
144 c.entry.configure(width=12, font=stdfont) | |
145 c.slistbox.listbox.configure(font=stdfont, exportselection=0) | |
119 statframe = Frame(frame) | 146 statframe = Frame(frame) |
120 | 147 |
121 self.statuslabel = Label(statframe, text="No sync") | 148 self.statuslabel = Label(statframe, text="No sync", width=15, font=stdfont) |
122 self.statuslabel.grid(columnspan=2, sticky=W) | 149 self.statuslabel.grid(columnspan=2, sticky=W) |
123 ilabel = Label(statframe, text="Input", fg='blue') | 150 ilabel = Label(statframe, text="Input", fg='blue', font=stdfont) |
124 ilabel.grid(row=1, sticky=W) | 151 ilabel.grid(row=1, sticky=W) |
125 extlabel = Label(statframe, textvariable=self.extlevel, width=5) | 152 extlabel = Label(statframe, textvariable=self.extlevel, width=5, font=stdfont) |
126 extlabel.grid(row=1, column=1) | 153 extlabel.grid(row=1, column=1) |
127 rlabel = Label(statframe, text="Real") | 154 rlabel = Label(statframe, text="Real", font=stdfont) |
128 rlabel.grid(row=2, sticky=W) | 155 rlabel.grid(row=2, sticky=W) |
129 self.sublabel = Label(statframe, text="N/A", width=5) | 156 self.sublabel = Label(statframe, text="N/A", width=5, font=stdfont) |
130 self.sublabel.grid(row=2, column=1) | 157 self.sublabel.grid(row=2, column=1) |
131 statframe.pack(side=BOTTOM, expand=1, fill=X) | 158 disc_button = Button(statframe, text="Disconnect", |
132 c.pack() | 159 command=self.disconnect, padx=0, pady=0, font=stdfont) |
160 disc_button.grid(row=3, columnspan=2) | |
161 statframe.pack(side=BOTTOM, expand=1, fill=BOTH) | |
162 c.pack(expand=1, fill=BOTH) | |
133 frame.pack(side=LEFT, expand=1, fill=BOTH) | 163 frame.pack(side=LEFT, expand=1, fill=BOTH) |
134 | 164 |
135 self.widgets = [frame, c, statframe, self.statuslabel, ilabel, extlabel, | 165 self.widgets = [frame, c, statframe, self.statuslabel, ilabel, extlabel, |
136 rlabel, self.sublabel] | 166 rlabel, self.sublabel, disc_button] |
137 | 167 |
138 class ExtSliderMapper(Frame): | 168 class ExtSliderMapper(Frame): |
139 def __init__(self, parent, sliderlevels, sliderinput, filename='slidermapping', | 169 def __init__(self, parent, sliderlevels, sliderinput, filename='slidermapping', |
140 numsliders=4): | 170 numsliders=4): |
141 'Slider levels is scalelevels, sliderinput is an ExternalInput object' | 171 'Slider levels is scalelevels, sliderinput is an ExternalInput object' |
159 for i in range(self.numsliders): | 189 for i in range(self.numsliders): |
160 self.current_mappings.append(SliderMapping()) | 190 self.current_mappings.append(SliderMapping()) |
161 | 191 |
162 self.draw_interface() | 192 self.draw_interface() |
163 def load_presets(self): | 193 def load_presets(self): |
194 self.presets = {} | |
164 self.file = open(self.filename, 'r') | 195 self.file = open(self.filename, 'r') |
165 lines = self.file.readlines() | 196 lines = self.file.readlines() |
166 for l in lines: | 197 for l in lines: |
167 tokens = l[:-1].split('\t') | 198 tokens = l[:-1].split('\t') |
168 name = tokens.pop(0) | 199 name = tokens.pop(0) |
181 for slidermap in self.current_mappings: | 212 for slidermap in self.current_mappings: |
182 try: | 213 try: |
183 v = self.sliderlevels[slidermap.get_mapping()] | 214 v = self.sliderlevels[slidermap.get_mapping()] |
184 slidermap.set_sublevel_var(v) | 215 slidermap.set_sublevel_var(v) |
185 except KeyError: | 216 except KeyError: |
186 pass | 217 name = slidermap.get_mapping() |
218 if name != 'disconnected': | |
219 print "ESM: No submaster named", name | |
187 | 220 |
188 def get_levels(self): | 221 def get_levels(self): |
189 'Called by changelevels, returns a dict of new values for submasters' | 222 'Called by changelevels, returns a dict of new values for submasters' |
190 if not self.sliderinput: return {} | 223 if not self.sliderinput: return {} |
191 | 224 |
192 self.load_scalelevels() # freshen our input from the physical sliders | 225 self.load_scalelevels() # freshen our input from the submasters |
193 | 226 |
194 rawlevels = self.sliderinput.get_levels() | 227 rawlevels = self.sliderinput.get_levels() |
195 for rawlev, slidermap in zip(rawlevels, self.current_mappings): | 228 for rawlev, slidermap in zip(rawlevels, self.current_mappings): |
196 slidermap.changed_extinput(rawlev) | 229 slidermap.changed_extinput(rawlev) |
197 | 230 |
215 command=self.add_preset).pack(side=LEFT) | 248 command=self.add_preset).pack(side=LEFT) |
216 Button(presetframe, text="Delete", padx=0, pady=0, | 249 Button(presetframe, text="Delete", padx=0, pady=0, |
217 command=self.delete_preset).pack(side=LEFT) | 250 command=self.delete_preset).pack(side=LEFT) |
218 Button(presetframe, text="Disconnect", padx=0, pady=0, | 251 Button(presetframe, text="Disconnect", padx=0, pady=0, |
219 command=self.disconnect_all).pack(side=LEFT) | 252 command=self.disconnect_all).pack(side=LEFT) |
253 Button(presetframe, text="Reload", padx=0, pady=0, | |
254 command=self.load_presets).pack(side=LEFT) | |
220 presetframe.pack(side=BOTTOM) | 255 presetframe.pack(side=BOTTOM) |
221 def apply_preset(self, preset): | 256 def apply_preset(self, preset): |
222 if not preset: return | 257 if not preset: return |
223 preset_mapping = self.presets.get(preset) | 258 preset_mapping = self.presets.get(preset) |
224 if not preset_mapping: return | 259 if not preset_mapping: return |
260 self.disconnect_all() | |
225 for subname, slidermap in zip(preset_mapping, self.current_mappings): | 261 for subname, slidermap in zip(preset_mapping, self.current_mappings): |
226 slidermap.set_subname(subname) | 262 slidermap.set_subname(subname) |
227 def delete_preset(self, *args): | 263 def delete_preset(self, *args): |
228 del self.presets[self.current_preset.get()] | 264 del self.presets[self.current_preset.get()] |
229 self.presetcombo.slistbox.listbox.delete(0, END) | 265 self.presetcombo.slistbox.listbox.delete(0, END) |