Skip to content

Navigation Menu

Sign in
Sign up

Precomp Phase F: persistence (schema v29) + edit propagation #106

Open
Labels
enhancementNew feature or request tier:coreLives in core (GPLv3, in-repo); always free, fully featured

Description

Phase F of the Precomps epic (#100, ADR-0029). Depends on Phase E (#105).

Scope

  1. Serializer refactor first (format-neutral): factor the per-layer save dispatch (ProjectSerializer.cpp:404-740) and load dispatch (:1746-2262) into saveLayerJson(...) / loadLayerJson(...) helpers parameterized on the target Timeline; existing round-trip tests guard it. Land as its own commit.
  2. v29 additions (PROJECT_VERSION 28→29, changelog entry in ProjectSerializer.hpp header 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 (+definitionName for 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 materializedVersion never persisted — full rematerialize on load (definitions load at version 1, instances at 0).
  3. Edit propagation polish: complete the PrecompLibrary::touch hooks — 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request tier:coreLives in core (GPLv3, in-repo); always free, fully featured

    Projects

    No projects

    Milestone

    No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      AltStyle によって変換されたページ (->オリジナル) /