"""
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.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)}"
)