annotate flax/CueFaders.py @ 160:c1c0f5854f8f

uses real light names (for our current patch, anyway) so the dmx send will work
author drewp
date Mon, 07 Jul 2003 08:45:39 +0000
parents 5c7ac46e33d3
children 0803fb42109d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 from __future__ import division, nested_scopes
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 import Tix as Tk
45b12307c695 Initial revision
drewp
parents:
diff changeset
3 import time
45b12307c695 Initial revision
drewp
parents:
diff changeset
4 from TreeDict import TreeDict, allow_class_to_be_pickled
45b12307c695 Initial revision
drewp
parents:
diff changeset
5
45b12307c695 Initial revision
drewp
parents:
diff changeset
6 class LabelledScale(Tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 """Scale with two labels: a name and current value"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 def __init__(self, master, label, **opts):
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
9 Tk.Frame.__init__(self, master, bd=2, relief='raised')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 opts.setdefault('variable', Tk.DoubleVar())
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 opts.setdefault('showvalue', 0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 self.scale_var = opts['variable']
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 self.scale = Tk.Scale(self, **opts)
45b12307c695 Initial revision
drewp
parents:
diff changeset
14 self.scale.pack(side='top', expand=1, fill='both')
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
15 self.name = Tk.Label(self, text=label)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 self.name.pack(side='bottom')
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
17 self.scale_value = Tk.Label(self, width=6)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 self.scale_value.pack(side='bottom')
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 self.scale_var.trace('w', self.update_value_label)
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 self.update_value_label()
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
21 self.disabled = (self.scale['state'] == 'disabled')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 def set_label(self, label):
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 self.name['text'] = label
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 def update_value_label(self, *args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 val = self.scale_var.get() * 100
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
26 self.scale_value['text'] = "%0.2f" % val
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
27 def disable(self):
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
28 if not self.disabled:
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
29 self.scale['state'] = 'disabled'
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
30 self.scale_var.set(0)
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
31 self.disabled = 1
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
32 def enable(self):
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
33 if self.disabled:
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
34 self.scale['state'] = 'normal'
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
35 self.disabled = 0
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
36
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 class TimedGoButton(Tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 """Go button, fade time entry, and time fader"""
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
39 def __init__(self, master, name, scale_to_fade):
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
40 Tk.Frame.__init__(self, master)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
41 self.name = name
45b12307c695 Initial revision
drewp
parents:
diff changeset
42 self.scale_to_fade = scale_to_fade
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
43 self.button = Tk.Button(self, text=name, command=self.start_fade)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 self.button.pack(fill='both', expand=1, side='left')
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
45 self.timer_var = Tk.StringVar()
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
46 self.timer_entry = Tk.Entry(self, textvariable=self.timer_var, width=5)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
47 self.timer_entry.pack(fill='y', side='left')
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
48 self.timer_var.set("2")
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
49 self.disabled = (self.button['state'] == 'disabled')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 def start_fade(self, end_level=1):
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
51 try:
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
52 fade_time = float(self.timer_var.get())
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
53 except ValueError:
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
54 # TODO figure out how to handle this
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
55 print "can't fade -- bad time"
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
56 return
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
57
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
58 self.start_time = time.time()
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 self.start_level = self.scale_to_fade.scale_var.get()
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 self.end_level = end_level
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
61 self.fade_length = fade_time
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
62 self.do_fade()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 def do_fade(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 diff = time.time() - self.start_time
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 if diff < self.fade_length:
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 percent = diff / self.fade_length
45b12307c695 Initial revision
drewp
parents:
diff changeset
67 newlevel = self.start_level + \
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 (percent * (self.end_level - self.start_level))
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 self.scale_to_fade.scale_var.set(newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
70
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 if newlevel != self.end_level:
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
72 self.after(10, self.do_fade)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 self.scale_to_fade.scale_var.set(self.end_level)
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
75 def disable(self):
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
76 if not self.disabled:
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
77 self.button['state'] = 'disabled'
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
78 self.disabled = 1
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
79 def enable(self):
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
80 if self.disabled:
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
81 self.button['state'] = 'normal'
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
82 self.disabled = 0
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
83
45b12307c695 Initial revision
drewp
parents:
diff changeset
84 class CueFader(Tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 def __init__(self, master, cuelist):
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
86 Tk.Frame.__init__(self, master)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 self.cuelist = cuelist
155
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
88 self.auto_shift = Tk.IntVar()
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
89 self.auto_shift.set(1)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
90
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 self.scales = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 self.shift_buttons = {}
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
93 self.go_buttons = {}
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
94
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
95 topframe = Tk.Frame(self)
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
96 self.current_cues = Tk.Label(topframe)
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
97 self.current_cues.pack()
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
98 self.update_cue_display()
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
99 topframe.pack()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
100
155
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
101 bottomframe = Tk.Frame(self)
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
102 self.auto_shift_checkbutton = Tk.Checkbutton(self,
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
103 variable=self.auto_shift, text='Autoshift',
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
104 command=self.toggle_autoshift)
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
105 self.auto_shift_checkbutton.pack()
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
106 bottomframe.pack(side='bottom')
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
107
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
108 middleframe = Tk.Frame(self)
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
109 for name, start, end, side in (('Prev', 1, 0, 'left'),
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
110 ('Next', 0, 1, 'right')):
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
111 frame = Tk.Frame(self)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
112 scale = LabelledScale(frame, name, from_=start, to_=end,
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
113 res=0.01, orient='horiz')
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
114 scale.pack(fill='both', expand=1)
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
115 go = TimedGoButton(frame, 'Go %s' % name, scale)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
116 go.pack(fill='both', expand=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 frame.pack(side=side, fill='both', expand=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
118
155
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
119 shift = Tk.Button(frame, text="Shift %s" % name, state='disabled',
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
120 command=lambda name=name: self.shift(name))
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
121
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 self.scales[name] = scale
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 self.shift_buttons[name] = shift
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
124 self.go_buttons[name] = go
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
125
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 scale.scale_var.trace('w', \
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 lambda x, y, z, name=name, scale=scale: self.xfade(name, scale))
155
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
128 middleframe.pack(side='bottom', fill='both', expand=1)
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
129 def toggle_autoshift(self):
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
130 for name, button in self.shift_buttons.items():
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
131 if not self.auto_shift.get():
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
132 button.pack(side='bottom', fill='both', expand=1)
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
133 else:
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
134 button.pack_forget()
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
135
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 def shift(self, name):
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
137 print "shift", name
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
138 for scale_name, scale in self.scales.items():
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
139 scale.scale_var.set(0)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 self.cuelist.shift((-1, 1)[name == 'Next'])
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
141 self.update_cue_display()
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
142 def update_cue_display(self):
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
143 current_cues = [cue.name for cue in self.cuelist.get_current_cues()]
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
144 self.current_cues['text'] = ', '.join(current_cues)
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
145 def xfade(self, name, scale):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
146 scale_val = scale.scale_var.get()
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
147 # print "xfade", name, scale_val
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
148
45b12307c695 Initial revision
drewp
parents:
diff changeset
149 if scale_val == 1:
155
4c3060ceddcc autoshifting is controllable now
dmcc
parents: 151
diff changeset
150 if self.auto_shift.get():
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
151 print "autoshifting", name
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
152 self.shift(name)
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
153 scale_val = scale.scale_var.get() # this needs to be refreshed
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
154 else:
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
155 self.shift_buttons[name]['state'] = 'normal'
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
156 else:
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
157 # disable any dangerous shifting
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
158 self.shift_buttons[name]['state'] = 'disabled'
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
159
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
160 d = self.opposite_direction(name)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
161 if scale_val != 0:
45b12307c695 Initial revision
drewp
parents:
diff changeset
162 # disable illegal three part crossfades
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
163 self.scales[d].disable()
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
164 self.go_buttons[d].disable()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
165 else:
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
166 # undo above work
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
167 self.scales[d].enable()
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
168 self.go_buttons[d].enable()
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
169 def opposite_direction(self, d):
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
170 if d == 'Next':
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
171 return 'Prev'
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
172 else:
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
173 return 'Next'
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
174
45b12307c695 Initial revision
drewp
parents:
diff changeset
175 class Cue:
45b12307c695 Initial revision
drewp
parents:
diff changeset
176 """A Cue has a name, a time, and any number of other attributes."""
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
177 def __init__(self, name, time=3, **attrs):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
178 self.name = name
45b12307c695 Initial revision
drewp
parents:
diff changeset
179 self.time = time
45b12307c695 Initial revision
drewp
parents:
diff changeset
180 self.__dict__.update(attrs)
45b12307c695 Initial revision
drewp
parents:
diff changeset
181 def __repr__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
182 return "<Cue %s, length %s>" % (self.name, self.time)
45b12307c695 Initial revision
drewp
parents:
diff changeset
183
45b12307c695 Initial revision
drewp
parents:
diff changeset
184 empty_cue = Cue('empty')
45b12307c695 Initial revision
drewp
parents:
diff changeset
185
45b12307c695 Initial revision
drewp
parents:
diff changeset
186 allow_class_to_be_pickled(Cue)
45b12307c695 Initial revision
drewp
parents:
diff changeset
187
45b12307c695 Initial revision
drewp
parents:
diff changeset
188 class CueList:
45b12307c695 Initial revision
drewp
parents:
diff changeset
189 """Persistent list of Cues"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
190 def __init__(self, filename):
45b12307c695 Initial revision
drewp
parents:
diff changeset
191 self.filename = filename
45b12307c695 Initial revision
drewp
parents:
diff changeset
192 self.treedict = TreeDict()
45b12307c695 Initial revision
drewp
parents:
diff changeset
193 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
194 self.treedict.load(filename)
45b12307c695 Initial revision
drewp
parents:
diff changeset
195 except IOError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
196 self.treedict.cues = []
45b12307c695 Initial revision
drewp
parents:
diff changeset
197 self.cues = self.treedict.cues
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
198 self.current_cue_index = 0
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
199 self.next_pointer = None
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
200 self.prev_pointer = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
201
45b12307c695 Initial revision
drewp
parents:
diff changeset
202 import atexit
45b12307c695 Initial revision
drewp
parents:
diff changeset
203 atexit.register(self.save)
45b12307c695 Initial revision
drewp
parents:
diff changeset
204 def add_cue(self, cue, index=None):
45b12307c695 Initial revision
drewp
parents:
diff changeset
205 """Adds a Cue object to the list. If no index is specified,
45b12307c695 Initial revision
drewp
parents:
diff changeset
206 the cue will be added to the end."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
207 index = index or len(self.cues)
45b12307c695 Initial revision
drewp
parents:
diff changeset
208 self.cues.insert(index, cue)
45b12307c695 Initial revision
drewp
parents:
diff changeset
209 def shift(self, diff):
45b12307c695 Initial revision
drewp
parents:
diff changeset
210 """Shift through cue history"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
211 old_index = self.current_cue_index
45b12307c695 Initial revision
drewp
parents:
diff changeset
212 self.current_cue_index = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
213 if diff < 0: # if going backwards
45b12307c695 Initial revision
drewp
parents:
diff changeset
214 if self.prev_pointer: # use a prev pointer if we have one
45b12307c695 Initial revision
drewp
parents:
diff changeset
215 self.current_cue_index = self.prev_pointer
45b12307c695 Initial revision
drewp
parents:
diff changeset
216 self.next_pointer = old_index
45b12307c695 Initial revision
drewp
parents:
diff changeset
217 self.prev_pointer = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
218 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
219 if self.next_pointer: # use a next pointer if we have one
45b12307c695 Initial revision
drewp
parents:
diff changeset
220 self.current_cue_index = self.next_pointer
45b12307c695 Initial revision
drewp
parents:
diff changeset
221 self.next_pointer = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
222 self.prev_pointer = old_index
45b12307c695 Initial revision
drewp
parents:
diff changeset
223 if not self.current_cue_index:
45b12307c695 Initial revision
drewp
parents:
diff changeset
224 self.current_cue_index = old_index + diff
45b12307c695 Initial revision
drewp
parents:
diff changeset
225 def set_next(self, index):
45b12307c695 Initial revision
drewp
parents:
diff changeset
226 self.next_pointer = index
45b12307c695 Initial revision
drewp
parents:
diff changeset
227 def set_prev(self, index):
45b12307c695 Initial revision
drewp
parents:
diff changeset
228 self.prev_pointer = index
45b12307c695 Initial revision
drewp
parents:
diff changeset
229 def bound_index(self, index):
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
230 if not self.cues:
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
231 return None
45b12307c695 Initial revision
drewp
parents:
diff changeset
232 else:
158
5c7ac46e33d3 more disabling of stuff that make no sense at certain times and some
dmcc
parents: 157
diff changeset
233 return max(0, min(index, len(self.cues) - 1))
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
234 def get_current_cue_indices(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
235 cur = self.current_cue_index
45b12307c695 Initial revision
drewp
parents:
diff changeset
236 return [self.bound_index(index) for index in
45b12307c695 Initial revision
drewp
parents:
diff changeset
237 (self.prev_pointer or cur - 1,
45b12307c695 Initial revision
drewp
parents:
diff changeset
238 cur,
45b12307c695 Initial revision
drewp
parents:
diff changeset
239 self.next_pointer or cur + 1)]
45b12307c695 Initial revision
drewp
parents:
diff changeset
240 def get_current_cues(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
241 return [self.get_cue_by_index(index)
45b12307c695 Initial revision
drewp
parents:
diff changeset
242 for index in self.get_current_cue_indices()]
45b12307c695 Initial revision
drewp
parents:
diff changeset
243 def get_cue_by_index(self, index):
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
244 if index:
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
245 return self.cues[self.bound_index(index)]
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
246 else:
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
247 return empty_cue
45b12307c695 Initial revision
drewp
parents:
diff changeset
248 def __del__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
249 self.save()
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
250 def save(self):
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
251 self.treedict.save(self.filename)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
252
45b12307c695 Initial revision
drewp
parents:
diff changeset
253 if __name__ == "__main__":
157
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
254 cl = CueList('cues/cuelist1')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
255
157
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
256 # to populate cue list
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
257 if 0:
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
258 for x in range(20):
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
259 cl.add_cue(Cue('cue %d' % x, time=x, some_attribute=3))
151
990a9474d0e7 early cue stuff. the CueList will supply the CueFader with the cues to
dmcc
parents: 0
diff changeset
260
157
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
261 root = Tk.Tk()
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
262 fader = CueFader(root, cl)
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
263 fader.pack(fill='both', expand=1)
7d3a0f9107a8 try to resolve version conflict problems
dmcc
parents: 155
diff changeset
264 Tk.mainloop()