80
|
1 """some more of the panels"""
|
0
|
2 from Tix import *
|
|
3
|
|
4 class ExtSliderMapper(Frame):
|
80
|
5 def __init__(self, parent, sliderlevels, sliderinput, filename='slidermapping',
|
|
6 numsliders=4):
|
0
|
7 'Slider levels is scalelevels, sliderinput is an ExternalInput object'
|
80
|
8 Frame.__init__(self, parent)
|
0
|
9 self.parent = parent
|
|
10 self.sliderlevels = sliderlevels
|
|
11 self.sliderinput = sliderinput
|
|
12 self.filename = filename
|
|
13 self.numsliders = numsliders
|
|
14 self.file = None
|
|
15
|
|
16 # don't call setup, let them do that when scalelevels is created
|
|
17 def setup(self):
|
|
18 self.subnames = self.sliderlevels.keys()
|
|
19 self.subnames.sort()
|
|
20 self.presets = {}
|
|
21 self.load_presets()
|
|
22
|
80
|
23 self.current_mapping_name = StringVar()
|
|
24 self.current_mapping = []
|
|
25 self.attached = []
|
|
26 self.levels_read = []
|
|
27 for i in range(self.numsliders):
|
|
28 cm_var = StringVar()
|
|
29 cm_var.set('disconnected')
|
|
30 self.current_mapping.append(cm_var)
|
|
31 self.attached.append(BooleanVar())
|
|
32 self.levels_read.append(DoubleVar())
|
0
|
33
|
80
|
34 self.reallevellabels = []
|
0
|
35 self.draw_interface()
|
80
|
36 def load_presets(self):
|
0
|
37 self.file = open(self.filename, 'r')
|
|
38 lines = self.file.readlines()
|
|
39 for l in lines:
|
|
40 tokens = l[:-1].split('\t')
|
|
41 name = tokens.pop(0)
|
|
42 self.presets[name] = tokens
|
|
43 self.file.close()
|
|
44 def save_presets(self):
|
|
45 self.file = open(self.filename, 'w')
|
|
46 self.file.seek(0)
|
|
47 preset_names = self.presets.keys()
|
|
48 preset_names.sort()
|
|
49 for p in preset_names:
|
|
50 s = '\t'.join([p] + self.presets[p]) + '\n'
|
|
51 self.file.write(s)
|
|
52 self.file.close()
|
|
53 def load_scalelevels(self):
|
80
|
54 for m, rll, levread, att in zip(self.current_mapping, self.reallevellabels,
|
|
55 self.levels_read, self.attached):
|
0
|
56 try:
|
80
|
57 v = self.sliderlevels[m.get()] # actual scalelevel variable
|
|
58 rll.configure(textvariable=v)
|
|
59 if levread.get() >= v.get(): # attach if physical goes above virtual
|
|
60 att.set(1)
|
0
|
61 except KeyError:
|
80
|
62 pass
|
0
|
63
|
|
64 def get_levels(self):
|
80
|
65 'To be called by changelevels, I think'
|
|
66 if not self.current_mapping_name: return {}
|
0
|
67 if not self.sliderinput: return {}
|
|
68
|
80
|
69 self.load_scalelevels()
|
0
|
70
|
|
71 rawlevels = self.sliderinput.get_levels()
|
80
|
72 for rawlev, levlabvar in zip(rawlevels, self.levels_read):
|
|
73 levlabvar.set(rawlev)
|
|
74 outputlevels = {}
|
|
75 return dict([(name.get(), lev)
|
|
76 for name, lev, att in zip(self.current_mapping,
|
|
77 rawlevels,
|
|
78 self.attached)
|
|
79 if att.get()])
|
0
|
80
|
|
81 def draw_interface(self):
|
80
|
82 self.reallevellabels = []
|
|
83 subchoiceframe = Frame(self)
|
|
84 for i, mapping, isattached, lev in zip(range(self.numsliders),
|
|
85 self.current_mapping,
|
|
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)
|
0
|
107 subchoiceframe.pack()
|
|
108
|
80
|
109 presetframe = Frame(self)
|
|
110 Label(presetframe, text="Preset:").pack(side=LEFT)
|
|
111 self.presetcombo = ComboBox(presetframe, variable=self.current_mapping_name,
|
|
112 editable=1, command=self.apply_preset)
|
0
|
113 self.draw_presets()
|
|
114 self.presetcombo.pack(side=LEFT)
|
80
|
115 Button(presetframe, text="Add", padx=0, pady=0,
|
0
|
116 command=self.add_preset).pack(side=LEFT)
|
80
|
117 Button(presetframe, text="Delete", padx=0, pady=0,
|
0
|
118 command=self.delete_preset).pack(side=LEFT)
|
|
119 presetframe.pack(side=BOTTOM)
|
|
120 def apply_preset(self, preset):
|
|
121 if not preset: return
|
80
|
122 mapping = self.presets.get(preset)
|
|
123 if not mapping: return
|
|
124 for name, var, att in zip(mapping, self.current_mapping, self.attached):
|
|
125 var.set(name)
|
|
126 att.set(0) # detach all sliders
|
0
|
127 def delete_preset(self, *args):
|
80
|
128 del self.presets[self.current_mapping_name.get()]
|
0
|
129 self.presetcombo.slistbox.listbox.delete(0, END)
|
|
130 self.draw_presets()
|
|
131 self.save_presets()
|
|
132 def add_preset(self, *args):
|
80
|
133 self.presets[self.current_mapping_name.get()] = [m.get()
|
|
134 for m in self.current_mapping]
|
0
|
135 self.presetcombo.slistbox.listbox.delete(0, END)
|
|
136 self.draw_presets()
|
|
137 self.save_presets()
|
|
138 def draw_presets(self):
|
|
139 preset_names = self.presets.keys()
|
|
140 preset_names.sort()
|
|
141 for p in preset_names:
|
|
142 self.presetcombo.slistbox.listbox.insert(END, p)
|