feat(timeline): linked clip offset badge (#87)#139
Conversation
- DrawOpts 新增 linkOffset 可选字段 - drawOffsetBadge() 绘制红色圆角 badge,白字 +N/-N 帧偏移 - paintTimeline 预计算 linkOffsetMap(同 linkGroupId 的 clip 间 startFrame 差值) - badge 位置: clip 右上角 trim handle 内侧 2px 边距 Port of ClipRenderer.swift:624-656 drawOffsetBadge. Closes appergb#87
appergb
left a comment
There was a problem hiding this comment.
@H-Chris233 感谢 PR,徽章渲染(drawOffsetBadge)结构很接近上游。但 offset 的计算口径与上游不一致,会导致徽章在错误的场景/错误的 clip 上出现,这版还不能算 1:1 移植。
我对照了上游权威实现 Editor/ViewModel/EditorViewModel+Linking.swift:95-113 linkGroupOffsets() 与 ClipRenderer.swift:624-656。
阻塞项(行为/正确性,必须改)
-
锚点漏了
− trimStartFrame。
上游(Linking.swift:101)用的是源对齐位置clip.startFrame − clip.trimStartFrame,本 PR(timelineCanvas.ts)用的是裸clip.startFrame。
后果:两条 link clip 若 trim 不同但源其实仍对齐,上游不显示徽章,本版会误显;反之也可能漏显。offset = clip.startFrame − partner.startFrame应改为(clip.startFrame − clip.trimStartFrame) − (partner.startFrame − partner.trimStartFrame)。 -
参照系:应为"整组最小值",而非两两 ±。
上游(Linking.swift:104-110):ref = 组内所有源对齐位置的 min,delta = start − ref ≥ 0,只有非最早的 clip 进 map 显示+N(单个徽章)。
本 PR 是两两对称+offset / −offset,会在一对 link clip 上同时显示两个徽章(一正一负);而上游同场景只在被错位的那条上显示一个+N,负号徽章在上游正常情况下不会出现。
另外break(只取第一个 partner)对 3+ clip 的 link 组也不正确——上游是整组求 min。请按上游做"按 linkGroupId 分组 → 组内 min 为参照 → 仅 delta≠0 的入 map"。
视觉保真(建议一并改)
- 颜色:上游
ClipRenderer.swift:626是rgb(255,71,71,1.0),本 PR 用了rgba(220,38,38,0.92),请对齐上游红。 - 本 PR 给徽章加了
rgba(255,255,255,0.3)白描边——上游drawOffsetBadge没有描边,请去掉。 - 缺上游窄 clip 保护:
ClipRenderer.swift:649guard badgeRect.minX > rect.minX + 6 else { return },窄 clip 不画徽章,请补上,否则窄 clip 上徽章会与 trim handle/内容重叠。 - 字重:上游
.semibold(600),本 PR500,小问题可顺手对齐。
把第 1、2 项按 linkGroupOffsets() 的口径改对后,这个 feature 就能 1:1 落地了。测试也请相应覆盖"trim 不同但源对齐→无徽章""同组 3 clip""仅最早 clip 无徽章"。改完我再复审。
…pOffsets Blockers: - Offset = (startFrame − trimStartFrame) − group_min, not raw startFrame - Group by linkGroupId, use min srcPos as ref (not pairwise ±) - Only non-earliest clips get badge (always +offset, never minus) - Remove break (correct for 3+ clip groups) Visual: - Color: rgb(255,71,71) (upstream #FF4747) - Remove white stroke (upstream has none) - Narrow clip guard: bx <= rect.x + 6 - Font weight: 600 (semibold) Tests: color + narrow clip guard
|
已按上游 EditorViewModel+Linking.swift:95-113 linkGroupOffsets() 修正: 阻塞项:
视觉保真:
测试: 更新颜色常量 + 新增窄 clip 跳过用例。 CI 双绿,请复审。 |
Port of upstream ClipRenderer.swift:624-656 drawOffsetBadge.
Change:
Before/After: 之前 linked clip 无任何视觉偏移提示,now 红色 badge 显示帧差.
Closes #87