P1-04 · core:Document / RasterLayer / UndoManager
- Phase / ID: P1 / P1-04
- Depends on: P1-02
- Files:
packages/core/src/document/**、test/ - Effort: M
- Status: 🔴
Context
绘画文档的框架无关模型。像素不在这里——像素在 backend(D5);这里持有图层的逻辑信息(id / 顺序 / opacity / 可见)与撤销栈。UndoManager 存 StrokePatch 并通过 backend.applyPatch 回放(D4:禁止全画布快照)。
Steps
RasterLayer:{ id, label, visible, opacity, blendMode }(纯数据;像素句柄在 backend)。Document:layers: RasterLayer[]+activeLayerId;addLayer / removeLayer / moveLayer / setActive。- 每次结构变化 emit
layers:change(供 UI / adapter 订阅)。
UndoManager(替代现有features/history.ts的能力,但语义升级):record(patch: StrokePatch):压栈、清空 redo、容量上限(沿用 ~25)。undo() / redo():调backend.applyPatch(patch, 'undo'|'redo'),并维护双栈。- emit
history:change。 - 注入
backend(构造或attach(backend)),保持 core 不直接依赖 Pixi。
- 单测用一个 fake backend(内存里的二维数组)验证 patch 往返。
Acceptance
- [ ]
test/undo.spec.ts:用 fake backend,record→undo→redo 后「画布」状态与各时刻一致。 - [ ]
Document增删 / 排序 / 改 opacity 触发layers:change。 - [ ] 容量上限生效;redo 在新 record 后被清空。
- [ ] 仍无 pixi.js。
Out of scope
- tile patch(P2,
applyPatch先按整 bbox 位图实现)。 - 蒙版 / 剪贴 / 锁透明(→ P6)。