Source code for jdxi_editor.ui.windows.jdxi.containers.sequencer

"""
sequencer.py

Create a midi-enabled sequencer buttons row

Create a sequencer container

"""

from typing import Callable

from PySide6.QtCore import QRect, Qt
from PySide6.QtWidgets import QGridLayout, QHBoxLayout, QLabel, QPushButton

from jdxi_editor.midi.io.helper import MidiIOHelper
from jdxi_editor.ui.common import JDXi, QVBoxLayout, QWidget
from jdxi_editor.ui.style.factory import (
    generate_sequencer_button_style,
    toggle_button_style,
)
from jdxi_editor.ui.widgets.button.sequencer import SequencerSquare


[docs] def create_sequencer_buttons_row( midi_helper: MidiIOHelper, on_context_menu: Callable, on_save_favorite: Callable ): """Create sequencer button row layout with interactive buttons""" row_layout = QHBoxLayout() sequencer_buttons = [] grid = QGridLayout() grid.setAlignment(Qt.AlignmentFlag.AlignLeft) grid.setGeometry( QRect( 1, 1, JDXi.UI.Dimensions.SEQUENCER.GRID.WIDTH, JDXi.UI.Dimensions.SEQUENCER.GRID.HEIGHT, ) ) grid.setHorizontalSpacing(3) for i in range(16): button = SequencerSquare(i, midi_helper) button.setFixedSize( JDXi.UI.Dimensions.SEQUENCER.SQUARE_SIZE, JDXi.UI.Dimensions.SEQUENCER.SQUARE_SIZE, ) button.setCheckable(True) button.setChecked(False) button.setStyleSheet(generate_sequencer_button_style(button.isChecked())) button.customContextMenuRequested.connect( lambda pos, b=button: on_context_menu(pos, b) ) button.setToolTip(f"Save Favorite {i}") # initial tooltip button.toggled.connect( lambda checked, btn=button: toggle_button_style(btn, checked) ) button.clicked.connect( lambda _, index=i, but=button: on_save_favorite(but, index) ) grid.addWidget(button, 0, i) sequencer_buttons.append(button) row_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) row_layout.addLayout(grid) return row_layout, sequencer_buttons
[docs] def add_sequencer_container( central_widget, # --- create_favorite_button_row, midi_helper, on_context_menu, on_save_favorite, ): # --- Beginning of sequencer section sequencer_container = QWidget(central_widget) sequencer_container.setGeometry( JDXi.UI.Dimensions.SEQUENCER.CONTAINER.X, JDXi.UI.Dimensions.SEQUENCER.CONTAINER.Y, JDXi.UI.Dimensions.SEQUENCER.CONTAINER.WIDTH, JDXi.UI.Dimensions.SEQUENCER.CONTAINER.HEIGHT, ) sequencer_container_layout = QHBoxLayout(sequencer_container) sequencer_label = QLabel("Sequencer") sequencer_label.setAlignment(Qt.AlignmentFlag.AlignCenter) sequencer_label.setStyleSheet(JDXi.UI.Style.TRANSPARENT) sequencer_layout = QHBoxLayout() # --- favorites_button_row, favorite_button = create_favorite_button_row() sequencer, sequencer_buttons = create_sequencer_buttons_row( midi_helper=midi_helper, on_context_menu=on_context_menu, on_save_favorite=on_save_favorite, ) sequencer_layout.addLayout(sequencer) sequencer_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) sequencer_container_layout.addLayout(sequencer_layout) return sequencer_buttons # favorite_button
[docs] def add_favorite_button_container(central_widget): """Create a circular button to set and unset favorites""" favourites_button_container = QWidget(central_widget) favourites_button_container.setGeometry( JDXi.UI.Dimensions.SEQUENCER.CONTAINER.X - 50, JDXi.UI.Dimensions.SEQUENCER.CONTAINER.Y, 100, 200, ) text = "Fav." row = QHBoxLayout() row.setSpacing(1) favourite_button_column = QVBoxLayout() favourite_button_column.setSpacing(1) """ button.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) button.customContextMenuRequested.connect( lambda pos, b=button: self._show_favorite_context_menu(pos, b) ) """ # --- Add label with color based on text favourite_button_label = QLabel(text) # --- Add spacer to push button to right row.addStretch() # --- Add button favorite_button = QPushButton() favorite_button.setFixedSize(30, 30) favorite_button.setCheckable(True) # --- Style the button with brighter hover/border_pressed/selected states favorite_button.setStyleSheet(JDXi.UI.Style.BUTTON_ROUND) favorite_button.setToolTip("Favorite: Mark current settings as a favorite") row.addLayout(favourite_button_column) favourite_button_column.addWidget(favourite_button_label) favourite_button_column.addWidget(favorite_button) favourites_button_container.setLayout(row) return favorite_button