Package _Framework :: Module SceneComponent
[hide private]
[frames] | no frames]

Source Code for Module _Framework.SceneComponent

  1  #Embedded file name: /Users/versonator/Hudson/live/Projects/AppLive/Resources/MIDI Remote Scripts/_Framework/SceneComponent.py 
  2  from CompoundComponent import CompoundComponent 
  3  from ClipSlotComponent import ClipSlotComponent 
  4  from Util import in_range, nop 
  5   
6 -class SceneComponent(CompoundComponent):
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
30 - def disconnect(self):
31 super(SceneComponent, self).disconnect() 32 if self._scene != None: 33 self._scene.remove_is_triggered_listener(self._on_is_triggered_changed) 34 if self._launch_button != None: 35 self._launch_button.remove_value_listener(self._launch_value) 36 self._launch_button = None
37
38 - def on_track_list_changed(self):
39 self.update()
40
41 - def set_scene(self, scene):
42 if scene != self._scene: 43 if self._scene != None: 44 self._scene.remove_is_triggered_listener(self._on_is_triggered_changed) 45 self._scene = scene 46 if self._scene != None: 47 self._scene.add_is_triggered_listener(self._on_is_triggered_changed) 48 self.update()
49
50 - def set_launch_button(self, button):
51 if button != self._launch_button: 52 if self._launch_button != None: 53 self._launch_button.remove_value_listener(self._launch_value) 54 self._launch_button = button 55 if self._launch_button != None: 56 self._launch_button.add_value_listener(self._launch_value) 57 self.update()
58
59 - def set_select_button(self, button):
60 self._select_button = button
61
62 - def set_delete_button(self, button):
63 self._delete_button = button
64
65 - def set_track_offset(self, offset):
66 if not offset >= 0: 67 raise AssertionError 68 self._track_offset = offset != self._track_offset and offset 69 self.update()
70
71 - def set_triggered_value(self, value):
72 value = int(value) 73 raise in_range(value, 0, 128) or AssertionError 74 self._triggered_value = value
75
76 - def clip_slot(self, index):
77 return self._clip_slots[index]
78
79 - def update(self):
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
114 - def _launch_value(self, value):
115 if self.is_enabled(): 116 if self._select_button and self._select_button.is_pressed() and value: 117 self._do_select_scene(self._scene) 118 if self._delete_button and self._delete_button.is_pressed() and value: 119 self._do_delete_scene(self._scene) 120 elif self._scene != None: 121 launched = False 122 if self._launch_button.is_momentary(): 123 self._scene.set_fire_button_state(value != 0) 124 launched = value != 0 125 elif value != 0: 126 self._scene.fire() 127 launched = True 128 if launched and self.song().select_on_launch: 129 self.song().view.selected_scene = self._scene
130
131 - def _do_select_scene(self, scene):
132 if self._scene != None: 133 view = self.song().view 134 if view.selected_scene != self._scene: 135 view.selected_scene = self._scene
136
137 - def _do_delete_scene(self, scene):
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
145 - def _on_is_triggered_changed(self):
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
153 - def _create_clip_slot(self):
154 return self.clip_slot_component_type()
155