Source code for jdxi_editor.ui.widgets.midi.file.viewer

"""
UI components for MIDI file player.
"""
from typing import Optional

from PySide6.QtCore import QMargins, Qt
from PySide6.QtWidgets import QLabel, QSlider, QVBoxLayout, QWidget

from jdxi_editor.midi.playback.state import MidiPlaybackState
from jdxi_editor.ui.editors.midi_player.utils import format_time
from jdxi_editor.ui.widgets.midi.track_viewer import MidiTrackViewer
from picoui.helpers.layout import create_layout_with_items, create_widget_with_layout


[docs] class MidiFileViewer(QWidget): """UI class for MIDI file player interface.""" def __init__(self, midi_state: MidiPlaybackState, parent: "MidiFilePlayer"): """constructor""" super().__init__()
[docs] self.midi_track_viewer: MidiTrackViewer | None = None
[docs] self.parent = parent
[docs] self.midi_state = midi_state
[docs] self.position_slider = QSlider()
[docs] self.position_label = QLabel()
self.setup_ui()
[docs] def setup_ui(self): """setup ui""" layout = QVBoxLayout(self) layout.addWidget(self._build_ui())
[docs] def _build_ui(self) -> QWidget: """ init_ruler :return: QWidget """ self.init_midi_file_position_label() self.init_midi_file_position_slider() widgets = [self.position_label, self.position_slider] ruler_layout = create_layout_with_items( items=widgets, margins=QMargins(0, 0, 0, 0), spacing=0, start_stretch=False, end_stretch=False, ) ruler_container = create_widget_with_layout(layout=ruler_layout) return ruler_container
[docs] def init_midi_file_position_slider(self): """Midi File position slider""" self.position_slider = QSlider(Qt.Horizontal) self.position_slider.setEnabled(False) self.position_slider.sliderReleased.connect(self.parent.midi_scrub_position)
[docs] def init_midi_file_position_label(self): """Midi File position label""" self.position_label = QLabel("Playback Position: 0:00 / 0:00") self.midi_track_viewer = MidiTrackViewer() self.position_label.setFixedWidth( self.midi_track_viewer.get_track_controls_width() )
[docs] def position_label_update_time( self, time_seconds: Optional[float] = None ) -> None: """ midi_file_position_label_update_time :param time_seconds: float, optional :return: None """ if time_seconds is None: self.position_label.setText( f"Playback Position: 0:00 / {format_time(self.midi_state.file_duration_seconds)}" )