annotate light8/ExtSliderMapper.py @ 2405:69ca2b2fc133

overcomplicated attempt at persisting the pane layout in the rdf graph this was hard because we have to somehow wait for the graph to load before config'ing the panes
author drewp@bigasterisk.com
date Fri, 17 May 2024 16:58:26 -0700
parents 616f8af19462
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
100
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
1 """ The External Slider Mapping widget determines which pots map to which
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
2 submasters. It tells you the status of each mapping and saves and loads
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
3 presets. The show is relying on this module! Do not lose it!
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
4
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
5 FUQ (frequently unasked question(s))
100
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
6
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
7 1. What's with all the *args?
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
8
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
9 It lets functions take any number of arguments and throw them away.
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
10 Callbacks do this, and we typically don't care about what they have to say. """
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
11
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 from Tix import *
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
13 from uihelpers import FancyDoubleVar, get_selection
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
14
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
15 stdfont = ('Arial', 8)
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
16 colors = ('lightBlue', 'lightPink', 'lightGreen', 'aquamarine1')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
17
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
18 class SliderMapping:
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
19 def __init__(self, color, default='disconnected', synced=0,
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
20 extinputlevel=0, sublevel=0):
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
21 self.color = color
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
22 self.subname = StringVar() # name of submaster we're connected to
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
23 self.subname.set(default)
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
24 self.sublevel = DoubleVar() # scalelevel variable of that submaster
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
25 # self.sublevel = FancyDoubleVar() # scalelevel variable of that submaster
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
26 self.sublevel.set(sublevel)
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
27 self.synced = BooleanVar() # currently synced
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
28 self.synced.set(synced)
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
29 self.extlevel = DoubleVar() # external slider's input
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
30 self.extlevel.set(extinputlevel)
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
31 self.widgets = [] # list of widgets drawn
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
32 self.sublabel = None # the label which represents a sub level.
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
33 # we hold on to it so we can change its
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
34 # textvariable
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
35 self.statuslabel = None # tells us sync status
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
36 self.lastbgcolor = None # last background color drawn to avoid
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
37 # unnecessary redraws
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
38 self.subnames = [] # we need to keep track of this for idiotic reasons
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
39 def sync(self, *args):
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
40 self.synced.set(1)
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
41 self.color_bg()
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
42 def unsync(self, *args):
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
43 self.synced.set(0)
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
44 self.color_bg()
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
45 def issynced(self):
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
46 return self.synced.get()
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
47 def disconnect(self, *args):
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
48 self.set_subname('disconnected') # a bit hack-like
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
49 # self.sublevel.delete_named('sync')
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
50 '''
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
51 try:
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
52 if self.sublevel.unsync_trace_cbname is not None:
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
53 # self.sublevel.trace_vdelete('w',
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
54 # self.sublevel.unsync_trace_cbname)
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
55 self.sublevel._tk.call('trace', 'vdelete', self.sublevel._name,
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
56 'w', self.sublevel.unsync_trace_cbname)
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
57 self.sublevel.unsync_trace_cbname = None
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
58 except AttributeError:
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
59 pass
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
60 '''
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
61
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
62 self.sublabel.configure(text="N/A")
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
63 self.color_bg()
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
64 def isdisconnected(self):
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
65 return self.subname.get() == 'disconnected' # a bit more hack-like
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
66 def check_synced(self, *args):
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
67 'If external level is near than the sublevel, it synces'
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
68 if self.isdisconnected():
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
69 self.unsync()
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
70 return
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
71
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
72 if abs(self.extlevel.get() - self.sublevel.get()) <= 0.02:
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
73 self.sync()
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
74 def changed_extinput(self, newlevel):
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
75 'When a new external level is received, this incorporates it'
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
76 self.extlevel.set(newlevel)
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
77 self.check_synced()
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
78 self.color_bg()
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
79 def set_subname(self, newname):
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
80 try:
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
81 self.listbox.listbox.select_clear(0, END)
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
82 except IndexError:
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
83 pass
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
84 try:
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
85 newindex = self.subnames.index(newname)
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
86 self.listbox.listbox.select_set(newindex)
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
87 self.listbox.listbox.see(newindex)
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
88 except ValueError:
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
89 pass
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
90
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
91 self.subname.set(newname)
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
92 self.unsync()
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
93 self.color_bg()
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
94 def color_bg(self):
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
95 if self.widgets:
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
96 if self.isdisconnected():
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
97 color = 'honeyDew4'
96
d1a1ded20ec7 a hack to fix bg color problems
dmcc
parents: 94
diff changeset
98 # stupid hack
99
7910445b81e3 possible fix
dmcc
parents: 98
diff changeset
99 # elif abs(self.extlevel.get() - self.sublevel.get()) <= 0.02:
100
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
100 elif self.issynced():
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
101 color = 'honeyDew2'
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
102 else: # unsynced
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
103 color = 'red'
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
104
100
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
105 if self.statuslabel: # more stupid hackery
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
106 if color == 'honeyDew2': # connected
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
107 self.statuslabel['text'] = 'Sync'
99
7910445b81e3 possible fix
dmcc
parents: 98
diff changeset
108 elif self.extlevel.get() < self.sublevel.get():
7910445b81e3 possible fix
dmcc
parents: 98
diff changeset
109 self.statuslabel['text'] = 'No sync (go up)'
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
110 else:
99
7910445b81e3 possible fix
dmcc
parents: 98
diff changeset
111 self.statuslabel['text'] = 'No sync (go down)'
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
112
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
113 # print "color", color, "lastbgcolor", self.lastbgcolor
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
114 if self.lastbgcolor == color: return
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
115 for widget in self.widgets:
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
116 widget.configure(bg=color)
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
117 self.lastbgcolor = color
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
118 def set_sublevel_var(self, newvar):
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
119 'newvar is one of the variables in scalelevels'
98
57319ec2bfad tracing etc seems to work
drewp
parents: 96
diff changeset
120
57319ec2bfad tracing etc seems to work
drewp
parents: 96
diff changeset
121 if newvar is not self.sublevel:
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
122 # self.sublevel.delete_named('sync')
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
123 self.sublevel = newvar
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
124 self.sublabel.configure(textvariable=newvar)
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
125 # self.sublevel.trace_named('sync', lambda *args: self.unsync(*args))
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
126 '''
98
57319ec2bfad tracing etc seems to work
drewp
parents: 96
diff changeset
127 try:
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
128 if self.sublevel.unsync_trace_cbname is not None:
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
129 # remove an old trace
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
130 self.sublevel.trace_vdelete('w',
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
131 self.sublevel.unsync_trace_cbname)
98
57319ec2bfad tracing etc seems to work
drewp
parents: 96
diff changeset
132 except AttributeError:
57319ec2bfad tracing etc seems to work
drewp
parents: 96
diff changeset
133 pass # it didn't have one
57319ec2bfad tracing etc seems to work
drewp
parents: 96
diff changeset
134
57319ec2bfad tracing etc seems to work
drewp
parents: 96
diff changeset
135 self.sublevel = newvar
100
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
136 self.sublevel.unsync_trace_cbname = self.sublevel.trace('w',
f13cf18224f2 minor cleanups. no code actually changed (i hope :)
dmcc
parents: 99
diff changeset
137 self.unsync)
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
138 '''
98
57319ec2bfad tracing etc seems to work
drewp
parents: 96
diff changeset
139
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
140 # if self.sublabel:
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
141 # self.sublabel.configure(textvariable=newvar)
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
142 self.check_synced()
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
143 def get_mapping(self):
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
144 'Get name of submaster currently mapped'
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
145 return self.subname.get()
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
146 def get_level_pair(self):
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
147 'Returns suitable output for ExtSliderMapper.get_levels()'
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
148 return (self.subname.get(), self.extlevel.get())
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
149 def listbox_cb(self, *args):
104
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
150 selection = get_selection(self.listbox.listbox)
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
151 self.disconnect()
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
152 self.subname.set(self.subnames[selection])
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
153 self.listbox.listbox.select_set(selection)
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
154 def draw_interface(self, master, subnames):
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
155 'Draw interface into master, given a list of submaster names'
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
156 self.subnames = subnames
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
157 frame = Frame(master, bg='black')
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
158 self.listbox = ScrolledListBox(frame, scrollbar='y', bg='black')
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
159 self.listbox.listbox.bind("<<ListboxSelect>>", self.listbox_cb, add=1)
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
160 self.listbox.listbox.configure(font=stdfont, exportselection=0,
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
161 selectmode=BROWSE, bg='black', fg='white',
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
162 selectbackground=self.color)
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
163 self.listbox.vsb.configure(troughcolor=self.color)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
164 # self.listbox.listbox.insert(END, "disconnected")
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
165 for s in subnames:
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
166 self.listbox.listbox.insert(END, s)
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
167 statframe = Frame(frame, bg='black')
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
168
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
169 self.statuslabel = Label(statframe, text="No sync", width=15,
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
170 font=stdfont)
94
29a8b23d8db5 ready for better scalelevel variable, checkbutton -> label
dmcc
parents: 92
diff changeset
171 self.statuslabel.grid(columnspan=2, sticky=W)
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
172 ilabel = Label(statframe, text="Input", fg='blue', font=stdfont)
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
173 ilabel.grid(row=1, sticky=W)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
174 extlabel = Label(statframe, textvariable=self.extlevel, width=5,
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
175 font=stdfont)
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
176 extlabel.grid(row=1, column=1)
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
177 rlabel = Label(statframe, text="Real", font=stdfont)
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
178 rlabel.grid(row=2, sticky=W)
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
179 self.sublabel = Label(statframe, text="N/A", width=5, font=stdfont)
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
180 self.sublabel.grid(row=2, column=1)
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
181 disc_button = Button(statframe, text="Disconnect",
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
182 command=self.disconnect, padx=0, pady=0, font=stdfont)
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
183 disc_button.grid(row=3, columnspan=2)
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
184 statframe.pack(side=BOTTOM, expand=1, fill=BOTH)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
185 self.listbox.pack(expand=1, fill=BOTH)
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
186 frame.pack(side=LEFT, expand=1, fill=BOTH)
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
187
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
188 self.widgets = [frame, self.listbox, statframe, self.statuslabel,
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
189 ilabel, extlabel, rlabel, self.sublabel, disc_button]
87
a5c0b7ac63cf better colors, color behavior
dmcc
parents: 86
diff changeset
190
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
191 class ExtSliderMapper(Frame):
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
192 def __init__(self, parent, sliderlevels, sliderinput,
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
193 lightboard, filename='slidermapping', numsliders=4):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
194 'Slider levels is scalelevels, sliderinput is an ExternalInput object'
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
195 Frame.__init__(self, parent, bg='black')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
196 self.parent = parent
45b12307c695 Initial revision
drewp
parents:
diff changeset
197 self.sliderlevels = sliderlevels
45b12307c695 Initial revision
drewp
parents:
diff changeset
198 self.sliderinput = sliderinput
45b12307c695 Initial revision
drewp
parents:
diff changeset
199 self.filename = filename
45b12307c695 Initial revision
drewp
parents:
diff changeset
200 self.numsliders = numsliders
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
201 self.lightboard = lightboard
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
202 self.file = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
203
45b12307c695 Initial revision
drewp
parents:
diff changeset
204 # don't call setup, let them do that when scalelevels is created
45b12307c695 Initial revision
drewp
parents:
diff changeset
205 def setup(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
206 self.subnames = self.sliderlevels.keys()
45b12307c695 Initial revision
drewp
parents:
diff changeset
207 self.subnames.sort()
45b12307c695 Initial revision
drewp
parents:
diff changeset
208 self.presets = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
209 self.load_presets()
45b12307c695 Initial revision
drewp
parents:
diff changeset
210
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
211 self.current_preset = StringVar() # name of current preset
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
212 self.current_mappings = []
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
213 for i, color in zip(range(self.numsliders), colors):
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
214 self.current_mappings.append(SliderMapping(color))
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
215
45b12307c695 Initial revision
drewp
parents:
diff changeset
216 self.draw_interface()
105
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
217 def load_presets(self, *args):
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
218 self.presets = {}
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
219 self.file = open(self.filename, 'r')
45b12307c695 Initial revision
drewp
parents:
diff changeset
220 lines = self.file.readlines()
45b12307c695 Initial revision
drewp
parents:
diff changeset
221 for l in lines:
45b12307c695 Initial revision
drewp
parents:
diff changeset
222 tokens = l[:-1].split('\t')
45b12307c695 Initial revision
drewp
parents:
diff changeset
223 name = tokens.pop(0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
224 self.presets[name] = tokens
45b12307c695 Initial revision
drewp
parents:
diff changeset
225 self.file.close()
105
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
226 if args: # called from callback
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
227 self.draw_interface()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
228 def save_presets(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
229 self.file = open(self.filename, 'w')
45b12307c695 Initial revision
drewp
parents:
diff changeset
230 self.file.seek(0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
231 preset_names = self.presets.keys()
45b12307c695 Initial revision
drewp
parents:
diff changeset
232 preset_names.sort()
45b12307c695 Initial revision
drewp
parents:
diff changeset
233 for p in preset_names:
45b12307c695 Initial revision
drewp
parents:
diff changeset
234 s = '\t'.join([p] + self.presets[p]) + '\n'
45b12307c695 Initial revision
drewp
parents:
diff changeset
235 self.file.write(s)
45b12307c695 Initial revision
drewp
parents:
diff changeset
236 self.file.close()
45b12307c695 Initial revision
drewp
parents:
diff changeset
237 def load_scalelevels(self):
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
238 for slidermap in self.current_mappings:
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
239 try:
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
240 v = self.sliderlevels[slidermap.get_mapping()]
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
241 slidermap.set_sublevel_var(v)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
242 # print "ESM: Yes submaster named", slidermap.get_mapping()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
243 except KeyError:
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
244 name = slidermap.get_mapping()
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
245 if name != 'disconnected':
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
246 print "ESM: No submaster named", name
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
247
45b12307c695 Initial revision
drewp
parents:
diff changeset
248 def get_levels(self):
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
249 'Called by changelevels, returns a dict of new values for submasters'
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
250 if not self.sliderinput: return {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
251
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
252 self.load_scalelevels() # freshen our input from the submasters
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
253
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
254 for m, color in zip(self.current_mappings, colors):
104
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
255 name = m.get_mapping()
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
256 lastsub = self.subs_highlighted.get(color)
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
257 if name is not lastsub:
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
258 if lastsub is not None:
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
259 try:
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
260 self.lightboard.highlight_sub(lastsub, 'restore')
104
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
261 except KeyError:
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
262 pass
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
263 try:
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
264 self.lightboard.highlight_sub(name, color)
104
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
265 except KeyError:
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
266 pass
15ead14b4dd1 result of 7.13 performance, some ExtSliderMapper fixes
dmcc
parents: 103
diff changeset
267 self.subs_highlighted[color] = name
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
268
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
269 rawlevels = self.sliderinput.get_levels()
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
270 for rawlev, slidermap in zip(rawlevels, self.current_mappings):
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
271 slidermap.changed_extinput(rawlev)
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
272
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
273 return dict([m.get_level_pair()
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
274 for m in self.current_mappings
92
827a675131dc better attach behavior, "attached" -> "synced"
dmcc
parents: 87
diff changeset
275 if m.issynced()])
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
276 def draw_interface(self):
103
ddd3c8f04640 more untested code, ready for production: colors for slider mapping
dmcc
parents: 102
diff changeset
277 self.subs_highlighted = {}
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
278 subchoiceframe = Frame(self, bg='black')
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
279 for m in self.current_mappings:
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
280 m.draw_interface(subchoiceframe, self.subnames)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
281 subchoiceframe.pack()
45b12307c695 Initial revision
drewp
parents:
diff changeset
282
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
283 presetframe = Frame(self, bg='black')
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
284 Label(presetframe, text="Preset:", font=('Arial', 10), bg='black',
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
285 fg='white').pack(side=LEFT)
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
286 self.presetcombo = ComboBox(presetframe, variable=self.current_preset,
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
287 editable=1, command=self.apply_preset,
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
288 dropdown=1)
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
289 self.presetcombo.slistbox.configure(bg='black')
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
290 self.presetcombo.slistbox.listbox.configure(bg='black', fg='white')
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
291 self.presetcombo.entry.configure(bg='black', fg='white')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
292 self.draw_presets()
45b12307c695 Initial revision
drewp
parents:
diff changeset
293 self.presetcombo.pack(side=LEFT)
105
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
294 Button(presetframe, text="Prev", padx=0, pady=0, bg='black',
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
295 fg='white', font=stdfont,
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
296 command=self.prev_preset).pack(side=LEFT)
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
297 Button(presetframe, text="Next", padx=0, pady=0, bg='black',
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
298 fg='white', font=stdfont,
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
299 command=self.next_preset).pack(side=LEFT)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
300 Button(presetframe, text="Add", padx=0, pady=0, bg='black',
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
301 fg='white', font=stdfont,
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
302 command=self.add_preset).pack(side=LEFT)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
303 Button(presetframe, text="Delete", padx=0, pady=0, bg='black',
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
304 fg='white', font=stdfont,
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
305 command=self.delete_preset).pack(side=LEFT)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
306 Button(presetframe, text="Disconnect", padx=0, pady=0, bg='black',
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
307 fg='white', font=stdfont,
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
308 command=self.disconnect_all).pack(side=LEFT)
102
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
309 Button(presetframe, text="Reload", padx=0, pady=0, bg='black',
e04f7b552bcd - scroll wheel works everywhere
dmcc
parents: 101
diff changeset
310 fg='white', font=stdfont,
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
311 command=self.load_presets).pack(side=LEFT)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
312 presetframe.pack(side=BOTTOM)
45b12307c695 Initial revision
drewp
parents:
diff changeset
313 def apply_preset(self, preset):
45b12307c695 Initial revision
drewp
parents:
diff changeset
314 if not preset: return
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
315 preset_mapping = self.presets.get(preset)
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
316 if not preset_mapping: return
101
a995fd1a8f03 result of 7.12 performance
dmcc
parents: 100
diff changeset
317 self.disconnect_all()
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
318 for subname, slidermap in zip(preset_mapping, self.current_mappings):
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
319 slidermap.set_subname(subname)
105
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
320 def change_preset_by_index(self, delta):
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
321 preset_names = self.presets.keys()
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
322 preset_names.sort()
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
323 try:
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
324 next = preset_names[preset_names.index(self.current_preset.get())
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
325 + delta]
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
326 self.current_preset.set(next)
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
327 self.apply_preset(next)
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
328 except (IndexError, ValueError):
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
329 print "Light 8.8: Can't go in that direction. Dig up!"
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
330 def next_preset(self, *args):
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
331 self.change_preset_by_index(1)
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
332 def prev_preset(self, *args):
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
333 self.change_preset_by_index(-1)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
334 def delete_preset(self, *args):
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
335 del self.presets[self.current_preset.get()]
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
336 self.presetcombo.slistbox.listbox.delete(0, END)
45b12307c695 Initial revision
drewp
parents:
diff changeset
337 self.draw_presets()
45b12307c695 Initial revision
drewp
parents:
diff changeset
338 self.save_presets()
45b12307c695 Initial revision
drewp
parents:
diff changeset
339 def add_preset(self, *args):
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
340 self.presets[self.current_preset.get()] = [m.get_mapping()
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
341 for m in self.current_mappings]
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
342 self.presetcombo.slistbox.listbox.delete(0, END)
45b12307c695 Initial revision
drewp
parents:
diff changeset
343 self.draw_presets()
45b12307c695 Initial revision
drewp
parents:
diff changeset
344 self.save_presets()
105
616f8af19462 results of 7.14 performance
dmcc
parents: 104
diff changeset
345 self.draw_interface()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
346 def draw_presets(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
347 preset_names = self.presets.keys()
45b12307c695 Initial revision
drewp
parents:
diff changeset
348 preset_names.sort()
45b12307c695 Initial revision
drewp
parents:
diff changeset
349 for p in preset_names:
45b12307c695 Initial revision
drewp
parents:
diff changeset
350 self.presetcombo.slistbox.listbox.insert(END, p)
86
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
351 def disconnect_all(self):
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
352 for m in self.current_mappings:
5a162150b68d new slidermappings, extslidermapping modularized and slightly smarter
dmcc
parents: 80
diff changeset
353 m.disconnect()