1
2 from CompoundComponent import CompoundComponent
3 from ClipSlotComponent import ClipSlotComponent
4 from Util import in_range, nop
5
7 """
8 Class representing a scene in Live
9 """
10 clip_slot_component_type = ClipSlotComponent
11
12 - def __init__(self, num_slots = 0, tracks_to_use_callback = nop, *a, **k):
13 raise num_slots >= 0 or AssertionError
14 raise callable(tracks_to_use_callback) or AssertionError
15 super(SceneComponent, self).__init__(*a, **k)
16 self._scene = None
17 self._clip_slots = []
18 self._tracks_to_use_callback = tracks_to_use_callback
19 for _ in range(num_slots):
20 new_slot = self._create_clip_slot()
21 self._clip_slots.append(new_slot)
22 self.register_components(new_slot)
23
24 self._launch_button = None
25 self._triggered_value = 127
26 self._track_offset = 0
27 self._select_button = None
28 self._delete_button = None
29
37
40
49
58
61
64
66 if not offset >= 0:
67 raise AssertionError
68 self._track_offset = offset != self._track_offset and offset
69 self.update()
70
75
77 return self._clip_slots[index]
78
80 if self._allow_updates:
81 if self._scene != None and self.is_enabled():
82 clip_index = self._track_offset
83 tracks = self.song().tracks
84 clip_slots = self._scene.clip_slots
85 if self._track_offset > 0:
86 real_offset = 0
87 visible_tracks = 0
88 while visible_tracks < self._track_offset and len(tracks) > real_offset:
89 if tracks[real_offset].is_visible:
90 visible_tracks += 1
91 real_offset += 1
92
93 clip_index = real_offset
94 for slot in self._clip_slots:
95 while len(tracks) > clip_index and not tracks[clip_index].is_visible:
96 clip_index += 1
97
98 if len(clip_slots) > clip_index:
99 slot.set_clip_slot(clip_slots[clip_index])
100 else:
101 slot.set_clip_slot(None)
102 clip_index += 1
103
104 self._on_is_triggered_changed()
105 else:
106 for slot in self._clip_slots:
107 slot.set_clip_slot(None)
108
109 if self.is_enabled() and self._launch_button != None:
110 self._launch_button.turn_off()
111 else:
112 self._update_requests += 1
113
130
136
138 try:
139 if self._scene:
140 song = self.song()
141 song.delete_scene(list(song.scenes).index(self._scene))
142 except RuntimeError:
143 pass
144
146 if not self._scene != None:
147 raise AssertionError
148 if self.is_enabled() and self._launch_button != None:
149 self._scene.is_triggered and self._launch_button.send_value(self._triggered_value)
150 else:
151 self._launch_button.turn_off()
152
155