comparison flax/CueFaders.py @ 163:e0c227168519

- LabelledScales allow for optional formatters - LabelledScales allow for optional formatters - more recoloring - cuelist supports wheel scrolling now - remove old inefficient cue redrawer - basic geometry - share changes to the dummy cuelist
author dmcc
date Tue, 08 Jul 2003 08:09:12 +0000
parents 6c5753bad783
children 79bc84310e80
comparison
equal deleted inserted replaced
162:6c5753bad783 163:e0c227168519
13 13
14 class LabelledScale(Tk.Frame): 14 class LabelledScale(Tk.Frame):
15 """Scale with two labels: a name and current value""" 15 """Scale with two labels: a name and current value"""
16 def __init__(self, master, label, **opts): 16 def __init__(self, master, label, **opts):
17 Tk.Frame.__init__(self, master, bd=2, relief='raised', bg='black') 17 Tk.Frame.__init__(self, master, bd=2, relief='raised', bg='black')
18 self.labelformatter = opts.get('labelformatter')
19 try:
20 del opts['labelformatter']
21 except KeyError:
22 pass
23
18 opts.setdefault('variable', Tk.DoubleVar()) 24 opts.setdefault('variable', Tk.DoubleVar())
19 opts.setdefault('showvalue', 0) 25 opts.setdefault('showvalue', 0)
20 26
21 self.normaltrough = opts.get('troughcolor', 'black') 27 self.normaltrough = opts.get('troughcolor', 'black')
22 self.flashtrough = opts.get('flashtroughcolor', 'red') 28 self.flashtrough = opts.get('flashtroughcolor', 'red')
23 del opts['flashtroughcolor'] 29 try:
30 del opts['flashtroughcolor']
31 except KeyError:
32 pass
24 33
25 self.scale_var = opts['variable'] 34 self.scale_var = opts['variable']
26 self.scale = Tk.Scale(self, **opts) 35 self.scale = Tk.Scale(self, **opts)
27 self.scale.pack(side='top', expand=1, fill='both') 36 self.scale.pack(side='top', expand=1, fill='both')
28 self.name = Tk.Label(self, text=label, bg='black', fg='white') 37 self.name = Tk.Label(self, text=label, bg='black', fg='white')
29 self.name.pack(side='bottom') 38 self.name.pack(side='bottom')
30 self.scale_value = Tk.Label(self, width=6, bg='black', fg='white') 39 self.scale_value = Tk.Label(self, bg='black', fg='white')
31 self.scale_value.pack(side='bottom') 40 self.scale_value.pack(side='bottom')
32 self.scale_var.trace('w', self.update_value_label) 41 self.scale_var.trace('w', self.update_value_label)
33 self.update_value_label() 42 self.update_value_label()
34 self.disabled = (self.scale['state'] == 'disabled') 43 self.disabled = (self.scale['state'] == 'disabled')
35 def set_label(self, label): 44 def set_label(self, label):
36 self.name['text'] = label 45 self.name['text'] = label
37 def update_value_label(self, *args): 46 def update_value_label(self, *args):
38 val = self.scale_var.get() * 100 47 val = self.scale_var.get() * 100
39 self.scale_value['text'] = "%0.2f" % val 48 if self.labelformatter:
49 format = self.labelformatter(val)
50 else:
51 format = "%0.2f" % val
52 self.scale_value['text'] = format
40 if val != 0: 53 if val != 0:
41 self.scale['troughcolor'] = self.flashtrough 54 self.scale['troughcolor'] = self.flashtrough
42 else: 55 else:
43 self.scale['troughcolor'] = self.normaltrough 56 self.scale['troughcolor'] = self.normaltrough
44 def disable(self): 57 def disable(self):
99 if self.disabled: 112 if self.disabled:
100 self.button['state'] = 'normal' 113 self.button['state'] = 'normal'
101 self.disabled = 0 114 self.disabled = 0
102 def set_time(self, time): 115 def set_time(self, time):
103 self.timer_var.set(time) 116 self.timer_var.set(time)
117 def get_time(self):
118 return self.timer_var.get()
104 119
105 class CueFader(Tk.Frame): 120 class CueFader(Tk.Frame):
106 def __init__(self, master, cuelist): 121 def __init__(self, master, cuelist):
107 Tk.Frame.__init__(self, master, bg='black') 122 Tk.Frame.__init__(self, master, bg='black')
108 self.cuelist = cuelist 123 self.cuelist = cuelist
126 fg='white', bg='blue') 141 fg='white', bg='blue')
127 self.set_prev_button.pack(side='left') 142 self.set_prev_button.pack(side='left')
128 143
129 self.auto_shift_checkbutton = Tk.Checkbutton(topframe, 144 self.auto_shift_checkbutton = Tk.Checkbutton(topframe,
130 variable=self.auto_shift, text='Autoshift', 145 variable=self.auto_shift, text='Autoshift',
131 command=self.toggle_autoshift, bg='black', fg='white') 146 command=self.toggle_autoshift, bg='black', fg='white',
132 self.auto_shift_checkbutton.pack(side='left') 147 highlightbackground='black')
148 self.auto_shift_checkbutton.pack(fill='both', side='left')
133 149
134 self.set_next_button = Tk.Button(topframe, text='Set Next', 150 self.set_next_button = Tk.Button(topframe, text='Set Next',
135 command=lambda: cuelist.set_selection_as_next(), 151 command=lambda: cuelist.set_selection_as_next(),
136 fg='white', bg='red') 152 fg='white', bg='red')
137 self.set_next_button.pack(side='left') 153 self.set_next_button.pack(side='left')
142 self.direction_info = (('Prev', 1, 0, 'left', 'blue'), 158 self.direction_info = (('Prev', 1, 0, 'left', 'blue'),
143 ('Next', 0, 1, 'right', 'red')) 159 ('Next', 0, 1, 'right', 'red'))
144 for name, start, end, side, color in self.direction_info: 160 for name, start, end, side, color in self.direction_info:
145 frame = Tk.Frame(self, bg='black') 161 frame = Tk.Frame(self, bg='black')
146 scale = LabelledScale(frame, name, from_=start, to_=end, 162 scale = LabelledScale(frame, name, from_=start, to_=end,
147 res=0.0001, orient='horiz', flashtroughcolor=color) 163 res=0.0001, orient='horiz', flashtroughcolor=color,
164 labelformatter=lambda val, name=name: self.get_scale_desc(val,
165 name))
148 scale.pack(fill='x', expand=0) 166 scale.pack(fill='x', expand=0)
149 go = TimedGoButton(frame, 'Go %s' % name, scale, bg=color, 167 go = TimedGoButton(frame, 'Go %s' % name, scale, bg=color,
150 fg='white') 168 fg='white')
151 go.pack(fill='both', expand=1) 169 go.pack(fill='both', expand=1)
152 frame.pack(side=side, fill='both', expand=1) 170 frame.pack(side=side, fill='both', expand=1)
169 self.autoshift(name, scale) 187 self.autoshift(name, scale)
170 188
171 scale.scale.bind("<ButtonPress>", button_press) 189 scale.scale.bind("<ButtonPress>", button_press)
172 scale.scale.bind("<ButtonRelease>", button_release) 190 scale.scale.bind("<ButtonRelease>", button_release)
173 faderframe.pack(side='bottom', fill='both', expand=1) 191 faderframe.pack(side='bottom', fill='both', expand=1)
192 def get_scale_desc(self, val, name):
193 go_button = self.go_buttons.get(name)
194 if go_button:
195 time = go_button.get_time()
196 return "%0.2f%%, %0.1fs left" % (val, time - ((val / 100.0) * time))
197 else:
198 return "%0.2f%%" % val
174 def toggle_autoshift(self): 199 def toggle_autoshift(self):
175 for name, button in self.shift_buttons.items(): 200 for name, button in self.shift_buttons.items():
176 if not self.auto_shift.get(): 201 if not self.auto_shift.get():
177 button.pack(side='bottom', fill='both', expand=1) 202 button.pack(side='bottom', fill='both', expand=1)
178 else: 203 else:
318 self.scrolled_hlist = Tk.ScrolledHList(self, 343 self.scrolled_hlist = Tk.ScrolledHList(self,
319 options='hlist.columns %d hlist.header 1' % len(self.columns)) 344 options='hlist.columns %d hlist.header 1' % len(self.columns))
320 self.hlist = self.scrolled_hlist.hlist 345 self.hlist = self.scrolled_hlist.hlist
321 self.hlist.configure(fg='white', bg='black', 346 self.hlist.configure(fg='white', bg='black',
322 command=self.select_callback, browsecmd=edit_cue) 347 command=self.select_callback, browsecmd=edit_cue)
348 self.hlist.bind("<4>", self.wheelscroll)
349 self.hlist.bind("<5>", self.wheelscroll)
323 self.scrolled_hlist.pack(fill='both', expand=1) 350 self.scrolled_hlist.pack(fill='both', expand=1)
324 351
325 boldfont = self.tk.call('tix', 'option', 'get', 352 boldfont = self.tk.call('tix', 'option', 'get',
326 'bold_font') 353 'bold_font')
327 header_style = Tk.DisplayStyle('text', refwindow=self, 354 header_style = Tk.DisplayStyle('text', refwindow=self,
333 360
334 self.cue_label_windows = {} 361 self.cue_label_windows = {}
335 for count, cue in enumerate(self.cues): 362 for count, cue in enumerate(self.cues):
336 self.display_cue(count, cue) 363 self.display_cue(count, cue)
337 self.update_cue_indicators() 364 self.update_cue_indicators()
338 365 def wheelscroll(self, evt):
366 """Perform mouse wheel scrolling"""
367 amount = 2
368 if evt.num == 4:
369 amount = -2
370 self.hlist.yview('scroll', amount, 'units')
339 def redraw_cue(self, cue): 371 def redraw_cue(self, cue):
340 if 0: 372 path = self.cues.index(cue)
341 # TODO: this is really inefficient 373 for col, header in enumerate(self.columns):
342 self.hlist.delete_all() 374 try:
343 for count, cue in enumerate(self.cues): 375 text = getattr(cue, header)
344 self.display_cue(count, cue) 376 except AttributeError:
345 self.update_cue_indicators() 377 text = ''
346 else: 378
347 path = self.cues.index(cue) 379 if col == 0:
348 for col, header in enumerate(self.columns): 380 self.cue_label_windows[path]['text'] = text
349 try: 381 else:
350 text = getattr(cue, header) 382 self.hlist.item_configure(path, col, text=text)
351 except AttributeError:
352 text = ''
353
354 if col == 0:
355 self.cue_label_windows[path]['text'] = text
356 else:
357 self.hlist.item_configure(path, col, text=text)
358 def display_cue(self, path, cue): 383 def display_cue(self, path, cue):
359 for col, header in enumerate(self.columns): 384 for col, header in enumerate(self.columns):
360 try: 385 try:
361 text = getattr(cue, header) 386 text = getattr(cue, header)
362 except AttributeError: 387 except AttributeError:
474 self.enable_callbacks = 1 499 self.enable_callbacks = 1
475 500
476 if __name__ == "__main__": 501 if __name__ == "__main__":
477 root = Tk.Tk() 502 root = Tk.Tk()
478 root.title("ShowMaster 9000") 503 root.title("ShowMaster 9000")
504 root.geometry("500x555")
479 cl = TkCueList(root, 'cues/cuelist1') 505 cl = TkCueList(root, 'cues/cuelist1')
480 cl.pack(fill='both', expand=1) 506 cl.pack(fill='both', expand=1)
481 507
482 fader = CueFader(root, cl) 508 fader = CueFader(root, cl)
483 fader.pack(fill='both', expand=1) 509 fader.pack(fill='both', expand=1)