comparison light8/ExtSliderMapper.py @ 92:827a675131dc

better attach behavior, "attached" -> "synced"
author dmcc
date Sat, 13 Jul 2002 03:01:42 +0000
parents a5c0b7ac63cf
children 29a8b23d8db5
comparison
equal deleted inserted replaced
91:7f273883de60 92:827a675131dc
1 """some more of the panels""" 1 """some more of the panels"""
2 from Tix import * 2 from Tix import *
3 3
4 class SliderMapping: 4 class SliderMapping:
5 def __init__(self, default='disconnected', attached=0, extinputlevel=0, 5 def __init__(self, default='disconnected', synced=0, extinputlevel=0,
6 sublevel=0): 6 sublevel=0):
7 self.subname = StringVar() # name of submaster we're connected to 7 self.subname = StringVar() # name of submaster we're connected to
8 self.subname.set(default) 8 self.subname.set(default)
9 self.sublevel = DoubleVar() # scalelevel variable of that submaster 9 self.sublevel = DoubleVar() # scalelevel variable of that submaster
10 self.sublevel.set(sublevel) 10 self.sublevel.set(sublevel)
11 self.attached = BooleanVar() # currently attached 11 self.synced = BooleanVar() # currently synced
12 self.attached.set(attached) 12 self.synced.set(synced)
13 self.extlevel = DoubleVar() # external slider's input 13 self.extlevel = DoubleVar() # external slider's input
14 self.extlevel.set(extinputlevel) 14 self.extlevel.set(extinputlevel)
15 self.widgets = [] # list of widgets drawn 15 self.widgets = [] # list of widgets drawn
16 self.sublabel = None # the label which represents a sub level. we hold on to 16 self.sublabel = None # the label which represents a sub level. we hold on to
17 # it so we can change its textvariable 17 # it so we can change its textvariable
18 self.lastbgcolor = None # last background color drawn to avoid unnecessary 18 self.lastbgcolor = None # last background color drawn to avoid unnecessary
19 # updates 19 # updates
20 def attach(self): 20 self.ignoreunsync = 0 # whether to ignore the next request to unsync
21 self.attached.set(1) 21 # this is because we trace the slider variable, but
22 self.color_text() 22 # we are also semi-responsible for setting it in
23 def detach(self): 23 # Lightboard.changelevels.
24 self.attached.set(0) 24 def ignorenextunync(self):
25 self.color_text() 25 print "skipping next unsync"
26 def isattached(self): 26 self.ignoreunsync += 1
27 return self.attached.get() 27 self.sync()
28 # self.color_bg()
29 def sync(self, *args):
30 # print "syncing"
31 self.synced.set(1)
32 # self.color_bg()
33 def unsync(self, *args):
34 if self.ignoreunsync > 0:
35 print "skipped unsync", self.ignoreunsync
36 self.synced.set(1)
37 self.color_bg()
38 self.ignoreunsync -= 1
39 return
40 '''
41 print "unsyncing"
42 '''
43 self.synced.set(0)
44 # self.color_bg()
45 def issynced(self):
46 return self.synced.get()
47 def disconnect(self, *args):
48 self.set_subname('disconnected') # a bit hack-like
49 self.sublabel.configure(text="N/A")
50 self.color_bg()
28 def isdisconnected(self): 51 def isdisconnected(self):
29 return self.subname.get() == 'disconnected' 52 return self.subname.get() == 'disconnected'
30 def check_attached(self): 53 def check_synced(self, *args):
31 'If external level is higher than the sublevel, it attaches' 54 'If external level is near than the sublevel, it synces'
32 if self.isdisconnected(): 55 if self.isdisconnected():
33 self.detach() 56 self.unsync()
34 return 57 return
35 58
36 if self.extlevel.get() > self.sublevel.get(): 59 if abs(self.extlevel.get() - self.sublevel.get()) <= 0.02:
37 self.attached.set(1) 60 self.sync()
38 self.color_text()
39 def changed_extinput(self, newlevel): 61 def changed_extinput(self, newlevel):
40 'When a new external level is received, this incorporates it' 62 'When a new external level is received, this incorporates it'
41 self.extlevel.set(newlevel) 63 self.extlevel.set(newlevel)
42 self.check_attached() 64 self.check_synced()
43 self.color_text() 65 self.color_bg()
44 def set_subname(self, newname): 66 def set_subname(self, newname):
45 self.subname.set(newname) 67 self.subname.set(newname)
46 self.detach() 68 self.unsync()
47 self.color_text() 69 self.color_bg()
48 def color_text(self): 70 def color_bg(self):
49 if self.widgets: 71 if self.widgets:
72 self.check_synced()
50 if self.isdisconnected(): 73 if self.isdisconnected():
51 color = 'honeyDew4' 74 color = 'honeyDew4'
52 elif self.isattached(): 75 elif self.issynced():
76 # elif abs(self.extlevel.get() - self.sublevel.get()) <= 0.02:
53 color = 'honeyDew2' 77 color = 'honeyDew2'
54 else: # detached 78 else: # unsynced
55 color = 'red' 79 color = 'red'
56 80
81 # print "color", color, "lastbgcolor", self.lastbgcolor
57 if self.lastbgcolor == color: return 82 if self.lastbgcolor == color: return
58 for widget in self.widgets: 83 for widget in self.widgets:
59 widget.configure(bg=color) 84 widget.configure(bg=color)
60 self.lastbgcolor = color 85 self.lastbgcolor = color
61 def disconnect(self):
62 self.set_subname('disconnected') # a bit hack-like
63 self.sublabel.configure(text="N/A")
64 def set_sublevel_var(self, newvar): 86 def set_sublevel_var(self, newvar):
65 'newvar is one of the variables in scalelevels' 87 'newvar is one of the variables in scalelevels'
66 self.sublevel = newvar 88 self.sublevel = newvar
89 self.sublevel.trace('w', self.unsync)
67 if self.sublabel: 90 if self.sublabel:
68 self.sublabel.configure(textvariable=newvar) 91 self.sublabel.configure(textvariable=newvar)
69 self.check_attached() 92 self.check_synced()
70 def get_mapping(self): 93 def get_mapping(self):
71 'Get name of submaster currently mapped' 94 'Get name of submaster currently mapped'
72 return self.subname.get() 95 return self.subname.get()
73 def get_level_pair(self): 96 def get_level_pair(self):
74 'Returns suitable output for ExtSliderMapper.get_levels()' 97 'Returns suitable output for ExtSliderMapper.get_levels()'
80 c.slistbox.listbox.insert(END, "disconnected") 103 c.slistbox.listbox.insert(END, "disconnected")
81 for s in subnames: 104 for s in subnames:
82 c.slistbox.listbox.insert(END, s) 105 c.slistbox.listbox.insert(END, s)
83 c.entry.configure(width=12) 106 c.entry.configure(width=12)
84 statframe = Frame(frame) 107 statframe = Frame(frame)
85 cb = Checkbutton(statframe, variable=self.attached, 108 cb = Checkbutton(statframe, variable=self.synced,
86 text="Attached") 109 text="Synced")
87 cb.grid(columnspan=2, sticky=W) 110 cb.grid(columnspan=2, sticky=W)
88 ilabel = Label(statframe, text="Input", fg='blue') 111 ilabel = Label(statframe, text="Input", fg='blue')
89 ilabel.grid(row=1, sticky=W) 112 ilabel.grid(row=1, sticky=W)
90 extlabel = Label(statframe, textvariable=self.extlevel, width=5) 113 extlabel = Label(statframe, textvariable=self.extlevel, width=5)
91 extlabel.grid(row=1, column=1) 114 extlabel.grid(row=1, column=1)
159 rawlevels = self.sliderinput.get_levels() 182 rawlevels = self.sliderinput.get_levels()
160 for rawlev, slidermap in zip(rawlevels, self.current_mappings): 183 for rawlev, slidermap in zip(rawlevels, self.current_mappings):
161 slidermap.changed_extinput(rawlev) 184 slidermap.changed_extinput(rawlev)
162 185
163 outputlevels = {} 186 outputlevels = {}
187 for m in self.current_mappings:
188 if m.issynced():
189 k, v = m.get_level_pair()
190 outputlevels[k] = v
191 m.ignorenextunync()
192 return outputlevels
193 '''
164 return dict([m.get_level_pair() 194 return dict([m.get_level_pair()
165 for m in self.current_mappings 195 for m in self.current_mappings
166 if m.isattached()]) 196 if m.issynced()])
197 '''
167 def draw_interface(self): 198 def draw_interface(self):
168 self.reallevellabels = [] 199 self.reallevellabels = []
169 subchoiceframe = Frame(self) 200 subchoiceframe = Frame(self)
170 for m in self.current_mappings: 201 for m in self.current_mappings:
171 m.draw_interface(subchoiceframe, self.subnames) 202 m.draw_interface(subchoiceframe, self.subnames)