feat: dock editor panels and add resizable pinned track headers

This commit is contained in:
Johannes Findeisen 2026-11-06 00:06:56 +01:00
commit ae8556d83f
13 changed files with 346 additions and 87 deletions

View file

@ -23,9 +23,9 @@ Changes use the existing stopped-engine preparation and undo workflow.
These are basic mono processors; stereo plans use independent instances. Reverb
is deliberately simple and has no room model or stereo diffusion. Delay time
changes can click; there is no crossfade or tempo sync. Transport seeks retain
existing effect history, like LADSPA. Effect tails require continued rendering;
playback/export does not automatically extend the song for tails.
changes can click; these original devices have no crossfade or tempo sync.
Internal effect history resets on transport discontinuities. Phase 44 below
documents configurable export tails and optional playback stopping after tails.
Project format 13 stores internal devices as format 4 with reserved module path
`/xtc/internal`, stable numeric identity and index (0 keys, 1 bass, 2 delay,

View file

@ -76,3 +76,9 @@ Phase 45 adds `[interface] transport_detached`, `mixer_detached`, and each
panel's `_x`, `_y`, `_width`, `_height` rectangle. Use Preferences / Apply after
moving panels to save the captured layout. Restoration clamps rectangles to the
current display; the floating transport wraps at narrow widths.
Phase 46 extends `[interface]` with `sequencer_detached`, `graph_detached`,
`piano_detached`, editor window geometry and `track_header_width` (180..360).
Piano retains `piano_width`/`piano_height` and adds `piano_x`/`piano_y`.
Reset workspace layout changes the session; Preferences / Apply persists it.
Only original-tab docking and floating windows are supported.

View file

@ -1065,9 +1065,9 @@ track in other views. Command search lists active menu actions; it is not a
plugin scanner or a key-binding editor. See WORKSPACE.md.
### Future usability work
Dockable editor panels, arrangement multiselection, independent track inserts,
resizable pinned track headers and customizable shortcuts remain future work.
They require separate model/layout designs and acceptance tests.
Arrangement multiselection, independent track inserts and customizable shortcuts
remain future work. Dockable editor panels and resizable pinned track headers
are implemented in Phase 46.
---
@ -1099,10 +1099,9 @@ keys/delay project round trip. Shared GUI tests cover instrument selection,
history and plugin editing, but do not constitute a dedicated end-to-end matrix
for all four internal devices. Additional qualification is tracked in Phase 40.
Missing extensions: editable instrument parameters/presets, pitch bend, sample
instruments, click-free/tempo-synced delay, stereo reverb/diffusion, explicit seek
history policy and automatic tail rendering. These are planned in Phases 41–44;
they are not part of the checked initial subset. See
The initial subset lacked editable presets, pitch bend, sample instruments,
smooth/tempo-synced delay, stereo reverb, seek history policy and automatic tails.
These audit gaps are addressed by Phases 41–44 below. See
[BUILTIN_DEVICES.md](BUILTIN_DEVICES.md) for controls and explicit limitations.
---
@ -1128,10 +1127,9 @@ detach/dock, close-to-dock, shared BPM/loop state, floating playback shortcuts,
main/floating resizing and failed/successful shutdown. Floating screenshots are
listed in [screenshots/README.md](../screenshots/README.md).
Layout and window positions are session-only. The floating transport requires
1220 pixels of width; mixer minimum size is 600 × 420. Other editors cannot be
detached, and general dock layouts are absent. Persistence, compact transport
and additional panels are tracked in Phases 45–46. See
The original subset used session-only positions, a 1220-pixel transport and
only two detachable panels. Phases 45–46 add persisted geometry, a compact
transport and editor panels. Mixer minimum remains 600 × 420. See
[WORKSPACE.md](WORKSPACE.md) for usage and limits.
### Audit validation (Phases 38–39)
@ -1282,17 +1280,35 @@ The full-window minimum is unchanged. See WORKSPACE.md and PREFERENCES.md.
Extend Phase 39's two-panel arrangement to a general editor workspace.
### Tasks and acceptance criteria
- [ ] Define supported dock locations and layout ownership for sequencer, piano roll and modular graph panels.
- [ ] Detach/dock each supported editor without duplicating project, selection or history state.
- [ ] Support resizable pinned track headers and preserve editing coordinates, scrolling and focus after reparenting.
- [ ] Integrate with Phase 45 layout persistence and provide a safe reset-layout action.
- [ ] Verify minimum/large layouts, cross-panel editing, repeated reparenting and shutdown/error paths.
- [x] Define supported dock locations and layout ownership for sequencer, piano roll and modular graph panels.
- [x] Detach/dock each supported editor without duplicating project, selection or history state.
- [x] Support resizable pinned track headers and preserve editing coordinates, scrolling and focus after reparenting.
- [x] Integrate with Phase 45 layout persistence and provide a safe reset-layout action.
- [x] Verify minimum/large layouts, cross-panel editing, repeated reparenting and shutdown/error paths.
### Implementation status
Planned. Phase 39 only detaches transport and mixer; broader docking and
resizable pinned headers from Phase 37 remain outstanding. These follow-up
phases cover gaps found in Phases 38–39 and their documented limitations;
unrelated outstanding features in earlier phases retain their existing status.
Implemented: complete Sequencer/Graph panels and Piano Roll reparent between
floating windows and their main tabs, with shared model/history/selection and
preserved scroll positions. Validated preferences persist layouts; reset docks
panels and restores default rectangles. Arrangement headers/selectors stay pinned
and resize from 180 to 360 pixels. Supported docking is explicitly limited to
original tabs; arbitrary split layouts and drag docking are future extensions.
Core/settings, GUI lifecycle/editing/restart and integrated checks are recorded
below. See WORKSPACE.md and PREFERENCES.md.
---
### Integrated validation for Phases 40–46
Each phase was built and tested before its separate implementation commit.
Core/reliability tests cover devices, migration, persistence, DSP partitions,
transport history and export. GUI tests cover editing, shared state and panel
lifecycle; CLAP/VST2/VST3/LADSPA fixture and live software JACK suites retain the
existing workflows. Sanitizers cover built-in DSP/export and GUI lifetimes;
static analysis and staged installation check the final integrated changes.
Human listening, arbitrary third-party plugins and physical hardware remain
unqualified. Listening WAV generation and manual procedures are documented in
BUILTIN_DEVICES.md. Application project format is now 15, reading versions 1–14.
---

View file

@ -169,9 +169,10 @@ Space and menu playback shortcuts work from either floating panel, with normal
numeric/text editing protection. Closing the main window closes all panels only
after the existing unsaved/recording/backend shutdown checks succeed.
Window detachment and positions are session-only; startup uses the docked layout.
The floating transport is a wide toolbar (minimum 1220 pixels); the floating
mixer resizes down to 600 × 420 and retains horizontal track scrolling.
The initial Phase 39 layout used session-only positions and a transport minimum
width of 1220 pixels. Phase 45 below adds saved layouts and transport wrapping
down to 400 pixels. The floating mixer resizes down to 600 × 420 and retains
horizontal track scrolling.
Verified with `make BUILD_DIR=build/phase39 gui test-gui test-gui-instruments
test-gui-jack` (one line), plus the GUI suite under AddressSanitizer/UBSan.
@ -193,3 +194,39 @@ the wide toolbar and arrangement geometry. Mixer minimum remains 600 × 420.
Existing close-to-dock, Dock all and shortcuts retain their shared widget state.
Tests cover narrow control bounds, save/restart, off-screen restoration, invalid
geometry, repeated docking/resizing and shared transport state.
## Phase 46 editor panels and pinned track headers
**View → Detach sequencer** and **Detach modular graph** float each complete
editor, including its toolbar and scroll area. Its main tab offers Show and Dock
buttons. Closing the floating window docks it; View shortcuts also raise floating
editors. Supported dock locations are their original main-window tabs; arbitrary
split regions, tab reordering and drag-to-dock are not implemented. Sequencer
minimum floating size is 1100 × 420; Graph is 1000 × 420.
The Piano roll now also has a main-window tab. Select a MIDI clip and open it as
before. **View → Float piano roll** switches its existing widgets between the tab
and a floating window; closing the floating window docks it. The tab's Open
selected MIDI clip button opens the current selection. Default floating behavior
is retained for older preferences. A missing/invalid MIDI selection is reported.
All panels share project/history, preserve editor selections and scroll offsets,
and retain playback shortcuts and text-input protection.
**View → Dock all panels** includes all editors. **Reset workspace layout** docks
all panels, restores default floating rectangles and resets header width. Use
Preferences / Apply to persist either result. Editor dock state, floating window
rectangles and header width use the same validated settings/restore path as the
transport/mixer. Piano content opens lazily for the selected MIDI clip; startup
does not invent a clip or save a project-specific selection in application settings.
Arrangement track headers and instrument selectors now stay pinned during
horizontal scrolling. Drag the divider within the header's final five pixels to
resize from 180 to 360 pixels; Escape cancels the drag. Clip timing coordinates,
snap and horizontal scrolling use the resized origin. Header layout is a UI
preference, not an undoable project edit. Vertical scrolling remains shared with
the track rows. Clips covered by the pinned header cannot be selected through it.
GUI regressions cover repeated detach/dock and close-to-dock, toolbar ownership,
minimum/large resize, shared model/note/clip selection, scrolling, header dragging,
short-clip hit tests, Apply/restart, reset layout and failed/successful shutdown.
ASan/UBSan checks retain only the existing system Fontconfig leak suppression.