jdxi_editor.ui.widgets.pattern.widget

Pattern Widget Module

Manages a collection of PatternMeasureWidgets and their underlying PatternMeasure data models. Acts as the main container for the pattern sequencer grid.

Classes

PatternConfig

Configuration for PatternWidget

PatternWidget

Main pattern widget containing multiple measures.

Module Contents

class jdxi_editor.ui.widgets.pattern.widget.PatternConfig[source]

Configuration for PatternWidget

rows: int = 4[source]
steps_per_measure: int = 16[source]
initial_measures: int = 1[source]
class jdxi_editor.ui.widgets.pattern.widget.PatternWidget(config: PatternConfig = None, parent: PySide6.QtWidgets.QWidget | None = None)[source]

Bases: PySide6.QtWidgets.QWidget

Main pattern widget containing multiple measures.

Manages: - Collection of PatternMeasureWidget (UI) and PatternMeasure (data model) - Synchronization between UI and data model - Measure selection and navigation - Pattern-wide operations (copy, paste, clear, etc.)

config[source]
measure_widgets: List[jdxi_editor.ui.widgets.pattern.measure_widget.PatternMeasureWidget] = [][source]
measures_list: PySide6.QtWidgets.QListWidget | None = None[source]
measures: List[picomidi.pattern.measure.PatternMeasure] = [][source]
current_measure_index: int = 0[source]
_clipboard: dict | None = None[source]
on_measure_selected: Callable[[int], None] | None = None[source]
on_measure_added: Callable[[int], None] | None = None[source]
on_measure_removed: Callable[[int], None] | None = None[source]
_button_click_handler: Callable[[jdxi_editor.ui.widgets.pattern.sequencer_button.SequencerButton, bool], None] | None = None[source]
_setup_ui() None[source]

Setup the UI layout.

set_header_widget(widget: PySide6.QtWidgets.QWidget) None[source]

Insert a header widget above the sequencer (e.g. row headers, presets).

_initialize_measures(count: int) None[source]

Initialize pattern with specified number of measures.

add_measure(copy_previous: bool = False) int[source]

Add a new measure to the pattern.

Parameters:

copy_previous – If True, copy the previous measure’s data

Returns:

Index of the newly added measure

_add_measure(copy_previous: bool = False) int[source]

Internal method to add a measure.

remove_measure(index: int) bool[source]

Remove a measure at the specified index.

Parameters:

index – Measure index

Returns:

True if successful, False otherwise

select_measure(index: int) bool[source]

Select a measure by index.

Parameters:

index – Measure index (0-based)

Returns:

True if successful

get_current_measure() picomidi.pattern.measure.PatternMeasure | None[source]

Get the current selected measure data model.

get_current_measure_widget() jdxi_editor.ui.widgets.pattern.measure_widget.PatternMeasureWidget | None[source]

Get the current selected measure widget.

for_each_button(callback: Callable[[int, int, jdxi_editor.ui.widgets.pattern.sequencer_button.SequencerButton], None]) None[source]

Apply callback(row, step, button) to each button in the current measure.

highlight_step(row: int, step: int, is_checked: bool, is_current: bool) None[source]

Apply sequencer style to the button at (row, step).

clear_buttons(reset_fn: Callable[[jdxi_editor.ui.widgets.pattern.sequencer_button.SequencerButton], None], style_fn: Callable[[jdxi_editor.ui.widgets.pattern.sequencer_button.SequencerButton], None]) None[source]

Reset and restyle each button in the current measure.

sync_ui_to_measure(measure_index: int) None[source]

Synchronize UI buttons with measure data.

Parameters:

measure_index – Index of measure to sync to

sync_measure_to_ui(measure_index: int) None[source]

Synchronize measure data with UI button state.

Parameters:

measure_index – Index of measure to sync from

copy_measure(from_index: int, to_index: int) bool[source]

Copy measure data from one index to another.

Parameters:
  • from_index – Source measure index

  • to_index – Destination measure index

Returns:

True if successful

copy_measure_section(measure_index: int, start_step: int, end_step: int) dict | None[source]

Copy a section of steps from a measure. Reads from buttons (source of truth).

Returns clipboard dict compatible with ClipboardData format: start_step, end_step, source_bar, notes_data. Also includes “rows” for backward compatibility.

paste_measure_section(measure_index: int, start_step: int, clipboard: dict | None = None) bool[source]

Paste a section of steps into a measure. Accepts ClipboardData format (notes_data) or PatternWidget format (rows). Handles checked/active, duration/duration_ms for cross-component compatibility.

clear_measure(measure_index: int) bool[source]

Clear all steps in a measure.

Parameters:

measure_index – Measure index

Returns:

True if successful

clear_all_measures() None[source]

Clear all measures in the pattern.

get_measure_count() int[source]

Get total number of measures.

get_measure_widgets() List[jdxi_editor.ui.widgets.pattern.measure_widget.PatternMeasureWidget][source]

Return all measure widgets (for playback, save, etc.).

ensure_measure_count(count: int) None[source]

Add or remove measures to match count.

clear_and_reset(initial_count: int = 1) None[source]

Clear all measures and list; optionally add initial_count empty measures.

_show_current_measure() None[source]

Remove previous content and show current measure widget in sequencer_display.

_apply_sequencer_style(widget: jdxi_editor.ui.widgets.pattern.measure_widget.PatternMeasureWidget) None[source]

Apply sequencer button styling to all buttons in the measure widget.

_wire_button_clicks(widget: jdxi_editor.ui.widgets.pattern.measure_widget.PatternMeasureWidget) None[source]

Wire button clicks to handler if set.

set_button_click_handler(handler: Callable[[jdxi_editor.ui.widgets.pattern.sequencer_button.SequencerButton, bool], None] | None) None[source]

Set handler for button clicks; wires all current and future measure widgets.

get_total_steps() int[source]

Get total number of steps across all measures.

_copy_measure_data(source_measure: picomidi.pattern.measure.PatternMeasure, dest_measure: picomidi.pattern.measure.PatternMeasure, source_widget: jdxi_editor.ui.widgets.pattern.measure_widget.PatternMeasureWidget, dest_widget: jdxi_editor.ui.widgets.pattern.measure_widget.PatternMeasureWidget) None[source]

Internal helper to copy measure data and UI state.

_add_to_measures_list(measure_index: int) PySide6.QtWidgets.QListWidgetItem[source]

Add measure to the list widget.

_on_measure_selected() None[source]

Handle measure selection from list widget.

scroll_to_measure(measure_index: int) None[source]

Scroll measures list to show the specified measure.