"""
Track Classification group - Detect Drums, Classify Tracks, Apply All Track Changes, Apply Presets.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
from decologr import Decologr as log
from PySide6.QtCore import QMargins
from PySide6.QtWidgets import QGroupBox, QPushButton, QWidget
from jdxi_editor.core.jdxi import JDXi
from jdxi_editor.midi.playback.state import MidiPlaybackState
from jdxi_editor.ui.editors.helpers.widgets import (
create_jdxi_button_from_spec,
create_jdxi_button_with_label_from_spec,
create_jdxi_row,
)
from jdxi_editor.ui.widgets.editor.helper import create_group_with_layout
from jdxi_editor.ui.widgets.jdxi.midi_group import JDXiMidiGroup
from picoui.helpers import create_layout_with_items, create_layout_with_inner_layouts
from picoui.specs.widgets import ButtonSpec
if TYPE_CHECKING:
from jdxi_editor.ui.editors.midi_player.editor import MidiFilePlayer
[docs]
class ClassificationGroup(JDXiMidiGroup):
"""Track Classification group: Detect Drums, Classify Tracks, Apply All buttons."""
def __init__(
self,
parent: "MidiFilePlayer",
midi_state: MidiPlaybackState | None = None,
):
super().__init__(parent=parent, midi_state=midi_state)
self.setup_ui()
[docs]
def _build_group(self) -> QGroupBox:
"""Build the Track Classification group."""
detect_drums_label_row, self.detect_drums_button = (
create_jdxi_button_with_label_from_spec(
self.specs["buttons"]["detect_drums"]
)
)
classify_tracks_label_row, self.classify_tracks_button = (
create_jdxi_button_with_label_from_spec(
self.specs["buttons"]["classify_tracks"]
)
)
classify_hlayout = create_layout_with_items(
items=[
self.detect_drums_button,
detect_drums_label_row,
self.classify_tracks_button,
classify_tracks_label_row,
],
vertical=False,
start_stretch=False,
end_stretch=False,
margins=self.margins,
spacing=self.spacing,
)
apply_all_spec = self.specs["buttons"]["apply_all_track_changes"]
self.apply_all_track_changes_button = create_jdxi_button_from_spec(
apply_all_spec, checkable=False
)
apply_all_icon_pixmap = JDXi.UI.Icon.get_icon_pixmap(
apply_all_spec.icon, color=JDXi.UI.Style.FOREGROUND, size=20
)
row_widget, _ = create_jdxi_row(
apply_all_spec.label, icon_pixmap=apply_all_icon_pixmap
)
apply_presets_spec = self.specs["buttons"]["apply_presets"]
self.apply_presets_button = create_jdxi_button_from_spec(
apply_presets_spec, checkable=False
)
apply_presets_icon_pixmap = JDXi.UI.Icon.get_icon_pixmap(
apply_presets_spec.icon, color=JDXi.UI.Style.FOREGROUND, size=20
)
presets_row_widget, _ = create_jdxi_row(
apply_presets_spec.label, icon_pixmap=apply_presets_icon_pixmap
)
apply_all_layout = create_layout_with_items(
items=[
self.apply_all_track_changes_button,
row_widget,
self.apply_presets_button,
presets_row_widget,
],
vertical=False,
start_stretch=False,
end_stretch=False,
spacing=self.spacing,
margins=self.margins,
)
apply_all_row = QWidget()
apply_all_row.setLayout(apply_all_layout)
inner_layouts = create_layout_with_inner_layouts(
inner_layouts=[classify_hlayout], vertical=True, stretch=False
)
inner_layouts.addWidget(apply_all_row)
group, _ = create_group_with_layout(
label="Track Classification", layout=inner_layouts
)
return group
[docs]
def _on_apply_presets_clicked(self) -> None:
"""Log and delegate to parent.apply_channel_presets."""
log.message(
scope=self.__class__.__name__,
message="Apply Presets button clicked",
)
log.parameter(
scope=self.__class__.__name__,
message="parent",
parameter=self.parent,
)
self.parent.apply_channel_presets()