comparison flax/CueFaders.py @ 158:5c7ac46e33d3

more disabling of stuff that make no sense at certain times and some more disabling of stuff that make no sense at certain times and some bug fixes. still haven't fixed the scale problem
author dmcc
date Mon, 07 Jul 2003 07:39:40 +0000
parents 7d3a0f9107a8
children 0803fb42109d
comparison
equal deleted inserted replaced
157:7d3a0f9107a8 158:5c7ac46e33d3
16 self.name.pack(side='bottom') 16 self.name.pack(side='bottom')
17 self.scale_value = Tk.Label(self, width=6) 17 self.scale_value = Tk.Label(self, width=6)
18 self.scale_value.pack(side='bottom') 18 self.scale_value.pack(side='bottom')
19 self.scale_var.trace('w', self.update_value_label) 19 self.scale_var.trace('w', self.update_value_label)
20 self.update_value_label() 20 self.update_value_label()
21 self.disabled = (self.scale['state'] == 'disabled')
21 def set_label(self, label): 22 def set_label(self, label):
22 self.name['text'] = label 23 self.name['text'] = label
23 def update_value_label(self, *args): 24 def update_value_label(self, *args):
24 val = self.scale_var.get() * 100 25 val = self.scale_var.get() * 100
25 self.scale_value['text'] = "%0.2f" % val 26 self.scale_value['text'] = "%0.2f" % val
27 def disable(self):
28 if not self.disabled:
29 self.scale['state'] = 'disabled'
30 self.scale_var.set(0)
31 self.disabled = 1
32 def enable(self):
33 if self.disabled:
34 self.scale['state'] = 'normal'
35 self.disabled = 0
26 36
27 class TimedGoButton(Tk.Frame): 37 class TimedGoButton(Tk.Frame):
28 """Go button, fade time entry, and time fader""" 38 """Go button, fade time entry, and time fader"""
29 def __init__(self, master, name, scale_to_fade): 39 def __init__(self, master, name, scale_to_fade):
30 Tk.Frame.__init__(self, master) 40 Tk.Frame.__init__(self, master)
34 self.button.pack(fill='both', expand=1, side='left') 44 self.button.pack(fill='both', expand=1, side='left')
35 self.timer_var = Tk.StringVar() 45 self.timer_var = Tk.StringVar()
36 self.timer_entry = Tk.Entry(self, textvariable=self.timer_var, width=5) 46 self.timer_entry = Tk.Entry(self, textvariable=self.timer_var, width=5)
37 self.timer_entry.pack(fill='y', side='left') 47 self.timer_entry.pack(fill='y', side='left')
38 self.timer_var.set("2") 48 self.timer_var.set("2")
49 self.disabled = (self.button['state'] == 'disabled')
39 def start_fade(self, end_level=1): 50 def start_fade(self, end_level=1):
40 try: 51 try:
41 fade_time = float(self.timer_var.get()) 52 fade_time = float(self.timer_var.get())
42 except ValueError: 53 except ValueError:
43 # TODO figure out how to handle this 54 # TODO figure out how to handle this
59 70
60 if newlevel != self.end_level: 71 if newlevel != self.end_level:
61 self.after(10, self.do_fade) 72 self.after(10, self.do_fade)
62 else: 73 else:
63 self.scale_to_fade.scale_var.set(self.end_level) 74 self.scale_to_fade.scale_var.set(self.end_level)
75 def disable(self):
76 if not self.disabled:
77 self.button['state'] = 'disabled'
78 self.disabled = 1
79 def enable(self):
80 if self.disabled:
81 self.button['state'] = 'normal'
82 self.disabled = 0
64 83
65 class CueFader(Tk.Frame): 84 class CueFader(Tk.Frame):
66 def __init__(self, master, cuelist): 85 def __init__(self, master, cuelist):
67 Tk.Frame.__init__(self, master) 86 Tk.Frame.__init__(self, master)
68 self.cuelist = cuelist 87 self.cuelist = cuelist
69 self.auto_shift = Tk.IntVar() 88 self.auto_shift = Tk.IntVar()
70 self.auto_shift.set(1) 89 self.auto_shift.set(1)
71 90
72 self.scales = {} 91 self.scales = {}
73 self.shift_buttons = {} 92 self.shift_buttons = {}
93 self.go_buttons = {}
74 94
75 topframe = Tk.Frame(self) 95 topframe = Tk.Frame(self)
76 self.current_cues = Tk.Label(topframe) 96 self.current_cues = Tk.Label(topframe)
77 self.current_cues.pack() 97 self.current_cues.pack()
78 self.update_cue_display() 98 self.update_cue_display()
99 shift = Tk.Button(frame, text="Shift %s" % name, state='disabled', 119 shift = Tk.Button(frame, text="Shift %s" % name, state='disabled',
100 command=lambda name=name: self.shift(name)) 120 command=lambda name=name: self.shift(name))
101 121
102 self.scales[name] = scale 122 self.scales[name] = scale
103 self.shift_buttons[name] = shift 123 self.shift_buttons[name] = shift
124 self.go_buttons[name] = go
104 125
105 scale.scale_var.trace('w', \ 126 scale.scale_var.trace('w', \
106 lambda x, y, z, name=name, scale=scale: self.xfade(name, scale)) 127 lambda x, y, z, name=name, scale=scale: self.xfade(name, scale))
107 middleframe.pack(side='bottom', fill='both', expand=1) 128 middleframe.pack(side='bottom', fill='both', expand=1)
108 def toggle_autoshift(self): 129 def toggle_autoshift(self):
111 button.pack(side='bottom', fill='both', expand=1) 132 button.pack(side='bottom', fill='both', expand=1)
112 else: 133 else:
113 button.pack_forget() 134 button.pack_forget()
114 135
115 def shift(self, name): 136 def shift(self, name):
116 for scale in self.scales.values(): 137 print "shift", name
138 for scale_name, scale in self.scales.items():
117 scale.scale_var.set(0) 139 scale.scale_var.set(0)
118 scale.scale.update()
119 print "shift", name
120 self.cuelist.shift((-1, 1)[name == 'Next']) 140 self.cuelist.shift((-1, 1)[name == 'Next'])
121 self.update_cue_display() 141 self.update_cue_display()
122 def update_cue_display(self): 142 def update_cue_display(self):
123 current_cues = [cue.name for cue in self.cuelist.get_current_cues()] 143 current_cues = [cue.name for cue in self.cuelist.get_current_cues()]
124 self.current_cues['text'] = ', '.join(current_cues) 144 self.current_cues['text'] = ', '.join(current_cues)
125 def xfade(self, name, scale): 145 def xfade(self, name, scale):
126 scale_val = scale.scale_var.get() 146 scale_val = scale.scale_var.get()
147 # print "xfade", name, scale_val
127 148
128 if scale_val == 1: 149 if scale_val == 1:
129 if self.auto_shift.get(): 150 if self.auto_shift.get():
151 print "autoshifting", name
130 self.shift(name) 152 self.shift(name)
153 scale_val = scale.scale_var.get() # this needs to be refreshed
131 else: 154 else:
132 self.shift_buttons[name]['state'] = 'normal' 155 self.shift_buttons[name]['state'] = 'normal'
133 else: 156 else:
134 # disable any dangerous shifting 157 # disable any dangerous shifting
135 self.shift_buttons[name]['state'] = 'disabled' 158 self.shift_buttons[name]['state'] = 'disabled'
136 159
160 d = self.opposite_direction(name)
137 if scale_val != 0: 161 if scale_val != 0:
138 # disable illegal three part crossfades 162 # disable illegal three part crossfades
139 # TODO: 163 self.scales[d].disable()
140 # if name == 'Next': 164 self.go_buttons[d].disable()
141 # disable go_prev button and slider, lock slider at 0 165 else:
142 pass 166 # undo above work
143 else: 167 self.scales[d].enable()
144 # undo above changes 168 self.go_buttons[d].enable()
145 169 def opposite_direction(self, d):
146 # Actually, TimedGoButton and LabelledScale can have enable/disable 170 if d == 'Next':
147 # methods which will only do the Tk calls if necessary 171 return 'Prev'
148 pass 172 else:
173 return 'Next'
149 174
150 class Cue: 175 class Cue:
151 """A Cue has a name, a time, and any number of other attributes.""" 176 """A Cue has a name, a time, and any number of other attributes."""
152 def __init__(self, name, time=3, **attrs): 177 def __init__(self, name, time=3, **attrs):
153 self.name = name 178 self.name = name
203 self.prev_pointer = index 228 self.prev_pointer = index
204 def bound_index(self, index): 229 def bound_index(self, index):
205 if not self.cues: 230 if not self.cues:
206 return None 231 return None
207 else: 232 else:
208 return max(0, min(index, len(self.cues))) 233 return max(0, min(index, len(self.cues) - 1))
209 def get_current_cue_indices(self): 234 def get_current_cue_indices(self):
210 cur = self.current_cue_index 235 cur = self.current_cue_index
211 return [self.bound_index(index) for index in 236 return [self.bound_index(index) for index in
212 (self.prev_pointer or cur - 1, 237 (self.prev_pointer or cur - 1,
213 cur, 238 cur,