"""
MIDI Event Suppression group - Program Changes and Control Changes checkboxes.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
from PySide6.QtCore import QMargins
from PySide6.QtWidgets import QCheckBox, QGroupBox
from jdxi_editor.core.jdxi import JDXi
from jdxi_editor.midi.playback.state import MidiPlaybackState
from jdxi_editor.ui.style import JDXiUIStyle
from jdxi_editor.ui.widgets.editor.helper import (
create_checkbox_from_spec,
create_group_with_layout,
)
from jdxi_editor.ui.widgets.jdxi.midi_group import JDXiMidiGroup
from picoui.helpers import create_layout_with_items
from picoui.specs.widgets import ButtonSpec, CheckBoxSpec
if TYPE_CHECKING:
from jdxi_editor.ui.editors.midi_player.editor import MidiFilePlayer
[docs]
class EventSuppressionGroup(JDXiMidiGroup):
"""MIDI Event Suppression group: Program Changes and Control Changes checkboxes."""
def __init__(
self,
parent: "MidiFilePlayer",
midi_state: MidiPlaybackState | None = None,
):
super().__init__(parent=parent, midi_state=midi_state)
[docs]
self.midi_suppress_program_changes_checkbox: QCheckBox | None = None
[docs]
self.midi_suppress_control_changes_checkbox: QCheckBox | None = None
self.setup_ui()
[docs]
def _build_group(self) -> QGroupBox:
"""Build the MIDI Event Suppression group with checkboxes."""
self.midi_suppress_program_changes_checkbox = create_checkbox_from_spec(
spec=self.specs["check_box"]["midi_suppress_pc_spec"]
)
self.midi_suppress_control_changes_checkbox = create_checkbox_from_spec(
spec=self.specs["check_box"]["midi_suppress_cc_spec"]
)
widgets = [
self.midi_suppress_program_changes_checkbox,
self.midi_suppress_control_changes_checkbox,
]
JDXi.UI.Theme.apply_button_mini_style(
self.midi_suppress_program_changes_checkbox
)
JDXi.UI.Theme.apply_button_mini_style(
self.midi_suppress_control_changes_checkbox
)
layout = create_layout_with_items(
items=widgets,
vertical=False,
start_stretch=True,
end_stretch=True,
margins=self.margins,
spacing=self.spacing,
)
group, _ = create_group_with_layout(
label="MIDI Event Suppression", layout=layout
)
return group
[docs]
def _build_check_box_specs(self) -> dict[str, CheckBoxSpec]:
"""Build Program Changes and Control Changes checkbox specs."""
if not self.midi_state:
raise ValueError("EventSuppressionGroup requires midi_state")
return {
"midi_suppress_pc_spec": CheckBoxSpec(
label="PC",
tooltip="Suppress MIDI Program Changes",
checked_state=self.midi_state.suppress_program_changes,
slot=self.parent.on_suppress_program_changes_toggled,
style=JDXiUIStyle.PARTIAL_SWITCH,
),
"midi_suppress_cc_spec": CheckBoxSpec(
label="CC",
tooltip="Suppress MIDI Control Changes",
checked_state=self.midi_state.suppress_control_changes,
slot=self.parent.on_suppress_control_changes_toggled,
style=JDXiUIStyle.PARTIAL_SWITCH,
),
}