Commit Graph

377 Commits

Author SHA1 Message Date
daniel be0441fc4d Merge Design View hardening: reconcile orphaned snapshots on track delete 2026-07-23 13:34:39 -04:00
daniel f9af111c7a Reconcile orphaned Design View snapshots on track delete
Add ViewModeModel::reconcile(liveGuids) to prune snapshots of deleted
tracks; wire it into applyMode before planning. Keep membership so
undo-delete (same GUID) preserves the Design tag.
2026-07-23 13:27:42 -04:00
daniel 2c468bb40c docs(multi-bank): settle fork 5 — LICE tabs + both move affordances (Phase B closed)
5a: named-banks tab strip is LICE-drawn (matching M5 grid + Design View
segmented switch), with overflow/scroll in scope from B4 start.
5b: move ships as both a bindable "move to bank" menu and drag-between-regions;
copy stays the deliberate secondary act. Drag mis-drop mitigated by drop-target
highlighting and recoverable by design (index-only, reversible).

Phase B now fully settled (all five forks resolved), ready to scope into
implementation waves; only the active-bank indicator placement polish remains.
2026-07-23 13:13:04 -04:00
daniel df03b5e759 Rework capture into three FX-scope actions with inferred range
Replace the four capture modes with item/track/master scope actions. Each infers
its range (razor-else-time) and enforces FX scope via non-destructive
FX-bypass-around-render (RAII I_FXEN snapshot/restore over ancestors + master).
Corrects the defect of items captured through parent FX.
2026-07-23 13:12:36 -04:00
daniel dcbe5d7bdc docs(multi-bank): settle Phase B forks 1-4; draft fork-5 options analysis
Fold Daniel's decisions into CONTEXT.md, PLAN.md, and the product notes:
- Fork 1 (persistence): pool folds into the `banks` blob; legacy
  `bank_index` key retired after a one-way lossless migration.
- Fork 2 (delete): delete drops member index entries; add an `evacuate`
  verb (B1 pure op + B3 action) returning members to the pool. Design the
  orphaned-until-prune window and confirm-on-non-empty-delete guardrail.
- Fork 3 (move): move is the default gesture, copy the deliberate secondary.
- Fork 4 (active bank): active-bank and shown-tab stay distinct; the
  active-bank indicator must be visually unmistakable.

Fork 5 (tab rendering + move affordance) remains open with an options
analysis and pending recommendations. Additive; M0-M11 and Phase D untouched.
2026-07-23 13:06:21 -04:00
daniel d9081090fd docs(multi-bank): frame Phase B — pool + named banks spec
Add the multi-bank pillar as Phase B (lettered, parallel to M-line and
Phase D): CONTEXT.md §Multi-bank spec, PLAN.md Phase B block (B1 bank_book
pure / B2 persist / B3 actions / B4 panel split), and docs/product/multi-bank.md
framing. Additive only — BankIndex, the M0–M11 roadmap, and Phase D untouched.
2026-07-23 12:52:06 -04:00
daniel 43ca5e4069 Docs: reflect Phase D5 landing; close out Phase D
Archive D5 (mode switch) to COMPLETED.md and remove the completed Phase D
section from PLAN.md; add mode_switch to CLAUDE.md architecture + targets.
2026-07-23 12:47:13 -04:00
daniel 4700415fb6 Merge Phase D5: segmented Design View mode switch in bank panel 2026-07-23 12:43:27 -04:00
daniel 314c3331da Add D5 Design-View mode switch to bank panel
New pure mode_switch module (header-rect -> N equal segment rects + point hit-test, unit-tested) plus a segmented switch in the bank_panel header: one lit segment per registered mode, click activates via view::applyMode. Grid offset below the header.
2026-07-23 12:35:46 -04:00
daniel c78c7e3ddc Archive Milestone 7 in docs
Move completed M7 (wet capture action family) from PLAN.md to COMPLETED.md
with a wet-only decision note; add an M10 forward note that true dry needs
FX-bypass or the realtime pre-FX path, not a render bit.
2026-07-23 11:02:56 -04:00
daniel 9ff123e5e1 Merge M7: bindable capture action family (master/tracks/items/razor, wet) 2026-07-23 10:22:24 -04:00
daniel 7b530193b2 feat(capture): bindable capture family — master/tracks/items/razor (M7)
Four wet capture actions route to OfflineRenderBackend (snapshot/restore
RENDER_*, 32-bit float), produce a Sample, add to the bank, persist. Pure
render_settings maps source mode to RENDER_SETTINGS and parses P_RAZOREDITS
(tested). No arrange insertion. True dry deferred to M10.
2026-07-23 10:01:34 -04:00
daniel 56f2e3e308 docs(design-view): parent visibility = descendant-derived OR own membership
Untagged folder carrying its own FX/media shows in Arrange (its default) as
well as any mode derived from its children. Parents still never parked.
2026-07-23 06:33:24 -04:00
daniel fbb9cf5f36 Merge fix: parent visible by own membership or descendant (untagged folders show in both modes) 2026-07-23 06:27:24 -04:00
daniel 2c9b635edf fix(view): update parent-visibility comment to describe OR rule (own membership or descendant visible) 2026-07-23 06:22:16 -04:00
daniel 8d08279bdb Fix parent visibility: parent visible by own membership OR derived from children
visibleTracks pass 1 now evaluates every node (parent or leaf) by its own
membership, so an untagged folder carrying its own FX/media shows in Arrange
(its default) as well as any mode derived from its children. Adds case-matrix
tests; updates the nested-Arrange assertion to the corrected rule.
2026-07-23 06:17:34 -04:00
daniel bd5ca2f861 Archive Milestone 6 in docs
Move completed M6 (insert placement onto selected tracks at edit cursor)
from PLAN.md to COMPLETED.md with a decisions note.
2026-07-23 06:13:22 -04:00
daniel 4f1231ea81 Merge M6 change: insert onto selected track(s) at edit cursor 2026-07-23 05:59:11 -04:00
daniel 2536b4bedb fix: insert onto selected track(s) at edit cursor, not a new track
Wire both insert actions to CurrentTrack (InsertMedia base 0). Per selected
track: SetOnlyTrackSelected, reset cursor to snapshot, InsertMedia; then restore
original selection + cursor. No-op when no track selected. Corrected stale
extraflags / new-track / preservePitch comments.
2026-07-23 05:56:25 -04:00
daniel 1918610fb8 Merge fix: snapshot-once park guard (nested-folder toggle) + per-mode undo label 2026-07-23 05:56:23 -04:00
daniel dfd5d4477f fix(view): snapshot-once park guard + correct per-mode undo label
Only capture a track's pre-park snapshot when none exists, so a re-park while
already parked no longer overwrites it with hidden-state zeros (leaves vanished
after toggling twice). Undo label now names the actual target mode.
2026-07-23 05:50:19 -04:00
daniel 59e3c5907f Merge M6: insert selected bank sample at edit cursor via InsertMedia 2026-07-23 05:25:13 -04:00
daniel 172d5902c8 feat: add M6 insert — place selected bank sample at edit cursor
InsertMedia-driven placement reading the bank panel selection, undo-wrapped.
Native length by default; conform-to-tempo is an explicit second action, never
a silent stretch. Pure mode-bit logic (insert_plan) unit-tested.
2026-07-23 05:23:37 -04:00
daniel c7005807a6 docs(design-view): correct reversed untagged-track invariant to "every leaf is managed"
Untagged = Arrange member, fully parked in non-Arrange modes like a tagged
leaf; show-both opts out. Master/parents/mute-solo caveats preserved.
2026-07-23 05:13:54 -04:00
daniel 9df24f7a77 Merge fix: park untagged leaves in non-Arrange modes + immediate TCP/MCP refresh 2026-07-23 05:03:57 -04:00
daniel cf871e195f Archive Milestone 5; correct M4 identity note to GUID-primary
Move completed M5 (bank_panel: thumbnails, audition, multi-select, keyboard)
to COMPLETED.md and close the thumbnail-cache open question; reword the M4
Save-As identity note to the final GUID-primary/pointer-secondary design.
2026-07-23 05:03:40 -04:00
daniel 4bf394b89c fix(view): park untagged leaves in non-Arrange modes; refresh TCP/MCP on apply
planToggle now enumerates all leaves in the FolderTree instead of only tagged
membership entries, so untagged (Arrange-member) tracks park in Design and
restore in Arrange. applyMode calls TrackList_AdjustWindows + UpdateArrange so
changes render immediately. Correct the stale "tagged-only" invariant comments.
2026-07-23 04:59:50 -04:00
daniel 60add4afc7 Merge fix: GUID-primary project identity restores bank reload on reopen/new 2026-07-23 04:51:23 -04:00
daniel affde0ef53 fix: layer GUID-primary project identity so reopened/new projects reload the bank
classifyProjectTransition now checks the stored GUID first, then the pointer,
fixing the w10 regression where a recycled ReaProject* address stopped the bank
reloading. poll()'s fork re-GUID gate is bound to !sameProjectObject. Full
transition matrix pinned in tests.
2026-07-23 04:46:36 -04:00
daniel 39baf28c93 Docs: reflect Phase D4 landing
Archive D4 (actions + integration) to COMPLETED.md; add track_guid and
Design View action family to CLAUDE.md architecture.
2026-07-22 22:08:38 -04:00
daniel e03728bdf7 Merge Phase D4: Design View action family + reapply-on-open wiring 2026-07-22 22:06:06 -04:00
daniel 0dce66a771 Merge M5 Wave B: audition, multi-select, and keyboard nav 2026-07-22 22:03:18 -04:00
daniel fc54472d3e feat(bank_panel): audition, multi-select, and keyboard nav (M5 Wave B)
Pure bank_grid gains hit-test, selection-update, and arrow-nav math with
tests; the panel wires mouse multi-select, keyboard nav via an accelerator
hook, and stock PlayPreview/StopPreview audition with a leak-free preview
lifecycle. Read-only: no arrange insertion, no project/bank mutation.
2026-07-22 21:55:16 -04:00
daniel b5332e0415 Docs: mark M4 Save-As identity collision as fixed
Update the M4 known-limitation note to reflect the object-identity
classifier fix (forked projects no longer cross-contaminate).
2026-07-22 21:51:14 -04:00
daniel ae41cad4f5 feat(view): D4 Design View action family + reapply-on-open wiring
Register toggle/activate/tag/untag/show-both actions driving the D2
shell and D3 model; reapply saved active mode on project load via a
persist load-signal seam. Shared guidString helper; pure nextModeId
unit-tested.
2026-07-22 21:46:58 -04:00
daniel 322581227c Docs: reflect Phase D2/D3 landing
Archive D2 (view shell) and D3 (persist slice) to COMPLETED.md;
add view/view_tree to CLAUDE.md architecture + view_tree_tests target.
2026-07-22 21:36:11 -04:00
daniel 5ff029ba1d Merge fix: project-object identity stops forked-bank cross-contamination 2026-07-22 21:29:50 -04:00
daniel 36270e2064 fix(persist): use project-object identity to stop forked-bank cross-contamination
M4's GUID-only classifier read a tab-switch between two Save-As forks (shared
copied GUID, different paths) as a Save-As and clobbered a bank. Thread
sameProjectObject into classifyProjectTransition: a different object always
Loads, never relocates; a forked sibling gets re-GUID'd to diverge.
2026-07-22 21:28:54 -04:00
daniel c6fdc12557 Merge Phase D2: view shell — apply mode toggle to live project 2026-07-22 21:26:21 -04:00
daniel 36dd5fd0f6 Merge dev (M5 bank_panel) into view-shell branch
# Conflicts:
#	CMakeLists.txt
2026-07-22 21:26:11 -04:00
daniel aacf8b49e8 Merge Phase D3: persist ViewModeModel in project ext state 2026-07-22 21:19:38 -04:00
daniel 27d887671c fix(view): derive parent/folder visibility on mode toggle
applyMode now drives B_SHOWINTCP/B_SHOWINMIXER for every parent node
from visibleTracks(tree, targetMode); parents are never parked. Adds
restoreFxOffline by-index remap hazard note.
2026-07-22 21:08:31 -04:00
daniel 62c26ac781 Merge M5 Wave A: docked bank panel with LICE waveform thumbnails 2026-07-22 21:08:26 -04:00
daniel aa8b963fb3 Merge dev (Phase D1) into p1-w9-bank-panel
# Conflicts:
#	CMakeLists.txt
2026-07-22 21:07:59 -04:00
daniel 71a3b26a47 feat(bank_panel): docked bank grid with LICE waveform thumbnails (M5 Wave A)
Docked SWELL window toggled by a new action, drawing the current bank as
per-sample min/max thumbnails (PCM_source + peaks) with an in-memory cache.
Pure grid-layout/cache-key math in bank_grid (tested). Renames peaks::Sample
-> AudioSample to avoid colliding with bank_model::Sample.
2026-07-22 21:02:22 -04:00
daniel ae76653628 D3: persist ViewModeModel in project ext state alongside bank
Add forever-stable "view_state" key under the "reasampler" namespace.
saveToActiveProject additionally serializes the ViewModeModel;
loadFromProject restores it on every load path, defaulting on an
absent/malformed key. Model state only — no visibility apply (D4).
2026-07-22 20:56:04 -04:00
daniel c068279aac feat(view): D2 view shell — apply mode toggle plan to live project
Reads I_FOLDERDEPTH into a FolderTree (pure view_tree helper, unit-tested),
snapshots to-be-parked tracks before parking, runs the D1 planner, and applies
park/restore flag + per-FX-offline writes under an undo block. Master and
mute/solo untouched; acts only on tagged tracks.
2026-07-22 20:55:50 -04:00
daniel 2d040d6896 Docs: reflect Phase D1 landing
Rename view_model -> view_mode_model across Design View spec docs;
archive D1 to COMPLETED.md; add view_mode_model_tests to CLAUDE.md
targets table and pure-core list.
2026-07-22 20:45:06 -04:00
daniel c534c91181 Merge Phase D1: pure view_mode_model core 2026-07-22 20:41:07 -04:00
daniel 25cfb62d46 rename view_model -> view_mode_model; add shell-expands-FX test and parse-site comments 2026-07-22 20:37:17 -04:00