class ScrollComponent(ScrollComponentBase): scroll_encoder = EncoderControl() def set_scroll_encoder(self, encoder): self.scroll_encoder.set_control_element(encoder) self.update() @scroll_encoder.value def scroll_encoder(self, value, encoder): scroll_step = None if value > 0 and self.can_scroll_down(): scroll_step = self._do_scroll_down elif value < 0 and self.can_scroll_up(): scroll_step = self._do_scroll_up if scroll_step is not None: scroll_step()
class SessionComponent(SessionComponentBase): scene_select_encoder = EncoderControl() _session_component_ends_initialisation = False def __init__(self, *a, **k): (super(SessionComponent, self).__init__)(*a, **k) self.set_offsets(0, 0) self.on_selected_scene_changed() self.on_selected_track_changed() def set_scene_select_control(self, control): self.scene_select_encoder.set_control_element(control) @scene_select_encoder.value def scene_select_encoder(self, value, encoder): selected_scene = self.song().view.selected_scene all_scenes = self.song().scenes current_index = list(all_scenes).index(selected_scene) if value > 0 and selected_scene != all_scenes[(-1)]: self.song().view.selected_scene = all_scenes[(current_index + 1)] elif value < 0: if selected_scene != all_scenes[0]: self.song().view.selected_scene = all_scenes[(current_index - 1)] def on_selected_scene_changed(self): super(SessionComponent, self).on_selected_scene_changed() all_scenes = list(self.song().scenes) selected_scene = self.song().view.selected_scene new_scene_offset = all_scenes.index(selected_scene) self.set_offsets(self.track_offset(), new_scene_offset) def on_selected_track_changed(self): super(SessionComponent, self).on_selected_track_changed() tracks = list(self.song().tracks) selected_track = self.song().view.selected_track if selected_track in tracks: track_index = tracks.index(selected_track) new_track_offset = track_index - track_index % self.width() self.set_offsets(new_track_offset, self.scene_offset())
class ValueComponentBase(CompoundComponent): """ Component to control one continuous property with a infinite touch-sensitive encoder. You can optionally give it a display and a button such that the value will be displayed while its pressed. """ def create_display_component(self, *a, **k): raise NotImplementedError encoder = EncoderControl() def __init__(self, display_label=' ', display_seg_start=0, *a, **k): super(ValueComponentBase, self).__init__(*a, **k) self._display = self.register_component( self.create_display_component(display_label=display_label, display_seg_start=display_seg_start)) self._display.set_enabled(False) display_layer = forward_property('_display')('layer') @encoder.touched def encoder(self, encoder): self._update_display_state() @encoder.released def encoder(self, encoder): self._update_display_state() @encoder.value def encoder(self, value, encoder): self._on_value(value) def _on_value(self, value): pass def _update_display_state(self): self._display.set_enabled(self.encoder.is_touched)