comparison light8/ExtSliderMapper.py @ 86:5a162150b68d

new slidermappings, extslidermapping modularized and slightly smarter
author dmcc
date Fri, 12 Jul 2002 12:08:43 +0000
parents 5f0c6bc8e9de
children a5c0b7ac63cf
comparison
equal deleted inserted replaced
85:174b35926067 86:5a162150b68d
1 """some more of the panels""" 1 """some more of the panels"""
2 from Tix import * 2 from Tix import *
3
4 class SliderMapping:
5 def __init__(self, default='disconnected', attached=0, extinputlevel=0,
6 sublevel=0):
7 self.subname = StringVar() # name of submaster we're connected to
8 self.subname.set(default)
9 self.sublevel = DoubleVar() # scalelevel variable of that submaster
10 self.sublevel.set(sublevel)
11 self.attached = BooleanVar() # currently attached
12 self.attached.set(attached)
13 self.extlevel = DoubleVar() # external slider's input
14 self.extlevel.set(extinputlevel)
15 self.extlabel = None
16 self.sublabel = None
17 def attach(self):
18 self.attached.set(1)
19 self.color_text()
20 def detach(self):
21 self.attached.set(0)
22 self.color_text()
23 def isattached(self):
24 return self.attached.get()
25 def isdisconnected(self):
26 return self.subname.get() == 'disconnected'
27 def check_attached(self):
28 'If external level is higher than the sublevel, it attaches'
29 if self.isdisconnected():
30 self.detach()
31 return
32
33 if self.extlevel.get() > self.sublevel.get():
34 self.attached.set(1)
35 self.color_text()
36 def changed_extinput(self, newlevel):
37 'When a new external level is received, this incorporates it'
38 self.extlevel.set(newlevel)
39 self.check_attached()
40 self.color_text()
41 def set_subname(self, newname):
42 self.subname.set(newname)
43 self.detach()
44 self.color_text()
45 def color_text(self):
46 if self.extlabel:
47 if self.isdisconnected():
48 self.extlabel.configure(fg='honeyDew4')
49 elif self.isattached():
50 self.extlabel.configure(fg='honeyDew2')
51 else:
52 self.extlabel.configure(fg='red')
53 def disconnect(self):
54 self.set_subname('disconnected') # a bit hack-like
55 self.sublabel.configure(text="N/A")
56 def set_sublevel_var(self, newvar):
57 'newvar is one of the variables in scalelevels'
58 self.sublevel = newvar
59 if self.sublabel:
60 self.sublabel.configure(textvariable=newvar)
61 self.check_attached()
62 def get_mapping(self):
63 'Get name of submaster currently mapped'
64 return self.subname.get()
65 def get_level_pair(self):
66 'Returns suitable output for ExtSliderMapper.get_levels()'
67 return (self.subname.get(), self.extlevel.get())
68 def draw_interface(self, master, subnames):
69 'Draw interface into master, given a list of submaster names'
70 frame = Frame(master)
71 c = ComboBox(frame, variable=self.subname)
72 c.slistbox.listbox.insert(END, "disconnected")
73 for s in subnames:
74 c.slistbox.listbox.insert(END, s)
75 c.entry.configure(width=12)
76 statframe = Frame(frame)
77 Checkbutton(statframe, variable=self.attached,
78 text="Attached").grid(columnspan=2, sticky=W)
79 Label(statframe, text="Input", fg='red').grid(row=1, sticky=W)
80 self.extlabel = Label(statframe, textvariable=self.extlevel, width=5)
81 self.extlabel.grid(row=1, column=1)
82 Label(statframe, text="Real").grid(row=2, sticky=W)
83 self.sublabel = Label(statframe, text="N/A", width=5)
84 self.sublabel.grid(row=2, column=1)
85 statframe.pack(side=BOTTOM, expand=1, fill=X)
86 c.pack()
87 frame.pack(side=LEFT, expand=1, fill=BOTH)
3 88
4 class ExtSliderMapper(Frame): 89 class ExtSliderMapper(Frame):
5 def __init__(self, parent, sliderlevels, sliderinput, filename='slidermapping', 90 def __init__(self, parent, sliderlevels, sliderinput, filename='slidermapping',
6 numsliders=4): 91 numsliders=4):
7 'Slider levels is scalelevels, sliderinput is an ExternalInput object' 92 'Slider levels is scalelevels, sliderinput is an ExternalInput object'
18 self.subnames = self.sliderlevels.keys() 103 self.subnames = self.sliderlevels.keys()
19 self.subnames.sort() 104 self.subnames.sort()
20 self.presets = {} 105 self.presets = {}
21 self.load_presets() 106 self.load_presets()
22 107
23 self.current_mapping_name = StringVar() 108 self.current_preset = StringVar() # name of current preset
24 self.current_mapping = [] 109 self.current_mappings = []
25 self.attached = []
26 self.levels_read = []
27 for i in range(self.numsliders): 110 for i in range(self.numsliders):
28 cm_var = StringVar() 111 self.current_mappings.append(SliderMapping())
29 cm_var.set('disconnected')
30 self.current_mapping.append(cm_var)
31 self.attached.append(BooleanVar())
32 self.levels_read.append(DoubleVar())
33 112
34 self.reallevellabels = []
35 self.draw_interface() 113 self.draw_interface()
36 def load_presets(self): 114 def load_presets(self):
37 self.file = open(self.filename, 'r') 115 self.file = open(self.filename, 'r')
38 lines = self.file.readlines() 116 lines = self.file.readlines()
39 for l in lines: 117 for l in lines:
49 for p in preset_names: 127 for p in preset_names:
50 s = '\t'.join([p] + self.presets[p]) + '\n' 128 s = '\t'.join([p] + self.presets[p]) + '\n'
51 self.file.write(s) 129 self.file.write(s)
52 self.file.close() 130 self.file.close()
53 def load_scalelevels(self): 131 def load_scalelevels(self):
54 for m, rll, levread, att in zip(self.current_mapping, self.reallevellabels, 132 for slidermap in self.current_mappings:
55 self.levels_read, self.attached):
56 try: 133 try:
57 v = self.sliderlevels[m.get()] # actual scalelevel variable 134 v = self.sliderlevels[slidermap.get_mapping()]
58 rll.configure(textvariable=v) 135 slidermap.set_sublevel_var(v)
59 if levread.get() >= v.get(): # attach if physical goes above virtual
60 att.set(1)
61 except KeyError: 136 except KeyError:
62 pass 137 pass
63 138
64 def get_levels(self): 139 def get_levels(self):
65 'To be called by changelevels, I think' 140 'Called by changelevels, returns a dict of new values for submasters'
66 if not self.current_mapping_name: return {}
67 if not self.sliderinput: return {} 141 if not self.sliderinput: return {}
68 142
69 self.load_scalelevels() 143 self.load_scalelevels() # freshen our input from the physical sliders
70 144
71 rawlevels = self.sliderinput.get_levels() 145 rawlevels = self.sliderinput.get_levels()
72 for rawlev, levlabvar in zip(rawlevels, self.levels_read): 146 for rawlev, slidermap in zip(rawlevels, self.current_mappings):
73 levlabvar.set(rawlev) 147 slidermap.changed_extinput(rawlev)
148
74 outputlevels = {} 149 outputlevels = {}
75 return dict([(name.get(), lev) 150 return dict([m.get_level_pair()
76 for name, lev, att in zip(self.current_mapping, 151 for m in self.current_mappings
77 rawlevels, 152 if m.isattached()])
78 self.attached)
79 if att.get()])
80
81 def draw_interface(self): 153 def draw_interface(self):
82 self.reallevellabels = [] 154 self.reallevellabels = []
83 subchoiceframe = Frame(self) 155 subchoiceframe = Frame(self)
84 for i, mapping, isattached, lev in zip(range(self.numsliders), 156 for m in self.current_mappings:
85 self.current_mapping, 157 m.draw_interface(subchoiceframe, self.subnames)
86 self.attached,
87 self.levels_read):
88 f = Frame(subchoiceframe)
89 # Label(f, text="Slider %d" % (i+1)).pack(side=LEFT)
90 c = ComboBox(f, variable=mapping)
91 c.slistbox.listbox.insert(END, "disconnected")
92 for s in self.subnames:
93 c.slistbox.listbox.insert(END, s)
94 c.entry.configure(width=12)
95 statframe = Frame(f)
96 Checkbutton(statframe, variable=isattached,
97 text="Attached").grid(columnspan=2, sticky=W)
98 Label(statframe, text="Input", fg='red').grid(row=1, sticky=W)
99 Label(statframe, textvariable=lev, fg='red', width=5).grid(row=1, column=1)
100 Label(statframe, text="Real").grid(row=2, sticky=W)
101 l = Label(statframe, text="N/A", width=5)
102 l.grid(row=2, column=1)
103 self.reallevellabels.append(l)
104 statframe.pack(side=BOTTOM, expand=1, fill=X)
105 c.pack()
106 f.pack(side=LEFT, expand=1, fill=BOTH)
107 subchoiceframe.pack() 158 subchoiceframe.pack()
108 159
109 presetframe = Frame(self) 160 presetframe = Frame(self)
110 Label(presetframe, text="Preset:").pack(side=LEFT) 161 Label(presetframe, text="Preset:").pack(side=LEFT)
111 self.presetcombo = ComboBox(presetframe, variable=self.current_mapping_name, 162 self.presetcombo = ComboBox(presetframe, variable=self.current_preset,
112 editable=1, command=self.apply_preset) 163 editable=1, command=self.apply_preset)
113 self.draw_presets() 164 self.draw_presets()
114 self.presetcombo.pack(side=LEFT) 165 self.presetcombo.pack(side=LEFT)
115 Button(presetframe, text="Add", padx=0, pady=0, 166 Button(presetframe, text="Add", padx=0, pady=0,
116 command=self.add_preset).pack(side=LEFT) 167 command=self.add_preset).pack(side=LEFT)
117 Button(presetframe, text="Delete", padx=0, pady=0, 168 Button(presetframe, text="Delete", padx=0, pady=0,
118 command=self.delete_preset).pack(side=LEFT) 169 command=self.delete_preset).pack(side=LEFT)
170 Button(presetframe, text="Disconnect", padx=0, pady=0,
171 command=self.disconnect_all).pack(side=LEFT)
119 presetframe.pack(side=BOTTOM) 172 presetframe.pack(side=BOTTOM)
120 def apply_preset(self, preset): 173 def apply_preset(self, preset):
121 if not preset: return 174 if not preset: return
122 mapping = self.presets.get(preset) 175 preset_mapping = self.presets.get(preset)
123 if not mapping: return 176 if not preset_mapping: return
124 for name, var, att in zip(mapping, self.current_mapping, self.attached): 177 for subname, slidermap in zip(preset_mapping, self.current_mappings):
125 var.set(name) 178 slidermap.set_subname(subname)
126 att.set(0) # detach all sliders
127 def delete_preset(self, *args): 179 def delete_preset(self, *args):
128 del self.presets[self.current_mapping_name.get()] 180 del self.presets[self.current_preset.get()]
129 self.presetcombo.slistbox.listbox.delete(0, END) 181 self.presetcombo.slistbox.listbox.delete(0, END)
130 self.draw_presets() 182 self.draw_presets()
131 self.save_presets() 183 self.save_presets()
132 def add_preset(self, *args): 184 def add_preset(self, *args):
133 self.presets[self.current_mapping_name.get()] = [m.get() 185 self.presets[self.current_preset.get()] = [m.get_mapping()
134 for m in self.current_mapping] 186 for m in self.current_mappings]
135 self.presetcombo.slistbox.listbox.delete(0, END) 187 self.presetcombo.slistbox.listbox.delete(0, END)
136 self.draw_presets() 188 self.draw_presets()
137 self.save_presets() 189 self.save_presets()
138 def draw_presets(self): 190 def draw_presets(self):
139 preset_names = self.presets.keys() 191 preset_names = self.presets.keys()
140 preset_names.sort() 192 preset_names.sort()
141 for p in preset_names: 193 for p in preset_names:
142 self.presetcombo.slistbox.listbox.insert(END, p) 194 self.presetcombo.slistbox.listbox.insert(END, p)
195 def disconnect_all(self):
196 for m in self.current_mappings:
197 m.disconnect()