-
Notifications
You must be signed in to change notification settings - Fork 1
Precomp Phase F: persistence (schema v29) + edit propagation #106
Open
Description
Phase F of the Precomps epic (#100, ADR-0029). Depends on Phase E (#105).
Scope
- Serializer refactor first (format-neutral): factor the per-layer save dispatch (
ProjectSerializer.cpp:404-740) and load dispatch (:1746-2262) intosaveLayerJson(...)/loadLayerJson(...)helpers parameterized on the targetTimeline; existing round-trip tests guard it. Land as its own commit. - v29 additions (
PROJECT_VERSION28→29, changelog entry inProjectSerializer.hppheader block):- Top-level
"precompDefinitions": [ { id, name, canvasWidth, canvasHeight, frameRate, duration, tracks: [ { name, layers: [<shared layer shape>] } ] } ], loaded before the timeline so instances resolve. - Instance layer:
"kind": "precomp"+definitionId(+definitionNamefor diagnostics),innerStartFrame,speed,playbackMode(string enum per bus rules), plus shared placement/MediaLayer/Transform/routing-by-name/EffectChain/AnimatedProperties fields. - Missing definition on load ⇒ instance disabled + logged, kept in file (never dropped).
- Shadows and
materializedVersionnever persisted — full rematerialize on load (definitions load at version 1, instances at 0).
- Top-level
- Edit propagation polish: complete the
PrecompLibrary::touchhooks — CommandDispatcher post-execute (PrecompMember mutations), TimelineWidget edit-commit for definition-bound timelines, definition-level edits (canvas/duration/track ops → canvas change must trigger RT resize-in-place via the snapshot dims). Undo of a master edit must also propagate (undo restores component state → touch → resync).
Tests
scripts/integration/precomp_persistence_save.json/precomp_persistence_load.json— CMake fixture pair (FIXTURES_SETUP/FIXTURES_REQUIRED, model:oa_layer_persistence_*): save definition + 2 instances (one Loop + speed 2.0, one with an effect chain); load half asserts definition fields, instance params, shadow counts, and a post-load render hash.precomp_edit_propagation.json: two instances; trim a master clip via command; assert both instances resync (shadow counts + changed render hash);Undo; assert propagation back.- Backward-compat: load a v28-era project fixture — must load clean with zero precomp keys.
Acceptance
- Round-trip + propagation + undo-propagation green; v28 files load unchanged; local ctest green.