- ToggleWidget: add Momentary/Toggle mode selector (mirrors TransportWidget
minus OSC); HW routing respects trigger_mode; fix invisible button on init
by removing explicit empty stylesheet; saves/loads trigger_mode per preset
- Big Title: full-width 28px bold QLineEdit above fader row, saves per-preset
as big_title; green underline on focus; single bottom border, no separator
- Layout panel: floating 220px window to the left of main window, toggled by
new Layout button next to Messages; shows Sections checkboxes (Preset
Browser, Big Title, Fader Row, Toggle Row, Transport Row); tracks window
move/resize; checkboxes not yet wired to functionality
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- transport widget restructured to two-group lasso layout (grp_learn + grp_cc) matching fader/toggle pattern
- fixed MIDI learn for transport (bind_hw_cc channel param) and preset browser (wired to check_and_start_midi_learn)
- transport HW routing now respects output_mode and trigger_mode; OSC mode fires on any value, MIDI momentary fires on any value
- preset browser on_hw_trigger fires on any value (0 or 127 both send 127 out)
- unbound CCs are dropped, no passthrough; notes (0x80/0x90) pass through freely to midi_out
- four MIDI/OSC log windows: OSC In, OSC Out, MIDI In, MIDI Out with formatted note/CC display
- midi_out_signal now carries message list for logging
- lock preset checkbox: always defaults to True on launch, not persisted
- transport cc_output_lbl always visible, content adapts to MIDI/OSC mode
- preset browser show/hide saves and restores correctly per preset
- CLAUDE.md added with full project architecture, conventions, and planned features
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Extract all QWidget/QLayout instances and property configuration to module level
- Group by element: constructor → properties for each widget
- Keep __init__ assembly-only: addWidget, addLayout, addStretch, signals
- Explicit naming for clarity: separator_vertical_fader_zone_left, etc
- Applies to: IO columns (MIDI IN/OUT, Transport, OSC), Preset Browser, Transport/Fader/Toggle rows, OSC feedback containers
- Pattern: Module = what it is; __init__ = where it goes