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()
Пример #2
0
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())
Пример #3
0
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)