fix(timeline): place a clip from empty space on top of what it covers

Dropping a new clip whose in-point landed in empty track space (the
stored-range model allows holes between blocks; the C++ layout is
contiguous) left the overlapped clip untouched AND inserted the new clip
before it in track order, so it slid UNDER the clip it covered. Starting
on a clip already overwrote correctly, so the behavior depended on where
the in-point happened to fall.

TrackRippleRemoveAreaCommand::prepare now handles the hole case (no
block spans the range start): nothing is trimmed on the left, the
insertion anchor is the last block ending at/before the range, and the
shared trailing scan removes/head-trims the blocks the range covers.
Regression tests: domain_test (command level) and graphops (the app's
place_footage_clip path).
This commit is contained in:
2026-09-24 14:45:06 +08:00
parent eed019c002
commit 21dbde8435
4 changed files with 181 additions and 36 deletions
+5
View File
@@ -798,6 +798,11 @@ python3 tooling/coverage_report.py --json target/coverage.json
(gpui 子模块提交见 `oak-gpui`。)
- **OCIO 参数面板**:Vec4 评分参数(对比度/偏移/曝光)建 4 个 SpinBox,
`base` 步长锚定范围(pivot 不再一拖就飞出 ±10000)。
- **拖放覆盖修复**:`TrackRippleRemoveAreaCommand::prepare` 补"范围起点落在
块间空洞"分支(C++ 布局连续、无此情形)——此前该情形下既不裁剪后面的
重叠块、又把新块插到它前面,导致"起点在空白、终点压在别的 clip 上"时
新 clip 被压在下层而不是覆盖。现在统一与起点在 clip 上时一致:重叠部分
被移除、新块在前。`domain_test` 与 `graphops` 各补一条回归断言。
## 8. 风险与对策