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)