Skip to content

feat(timeline): linked clip offset badge (#87)#139

Open
H-Chris233 wants to merge 3 commits into
appergb:mainfrom
H-Chris233:feat/link-offset-badge-87
Open

feat(timeline): linked clip offset badge (#87)#139
H-Chris233 wants to merge 3 commits into
appergb:mainfrom
H-Chris233:feat/link-offset-badge-87

Conversation

@H-Chris233

Copy link
Copy Markdown
Collaborator

Port of upstream ClipRenderer.swift:624-656 drawOffsetBadge.

Change:

  • DrawOpts 新增 linkOffset 可选字段
  • drawOffsetBadge(): 红色圆角 pill badge, 白字 ±N 帧偏移
  • paintTimeline: 预计算 linkOffsetMap(同 linkGroupId 的 clip 间 startFrame 差)
  • Badge 位置: clip 右上角 trim handle 内侧 2px

Before/After: 之前 linked clip 无任何视觉偏移提示,now 红色 badge 显示帧差.

Closes #87

- 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
@H-Chris233 H-Chris233 requested a review from appergb as a code owner June 24, 2026 04:58

@appergb appergb left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@H-Chris233 感谢 PR,徽章渲染(drawOffsetBadge)结构很接近上游。但 offset 的计算口径与上游不一致,会导致徽章在错误的场景/错误的 clip 上出现,这版还不能算 1:1 移植。

我对照了上游权威实现 Editor/ViewModel/EditorViewModel+Linking.swift:95-113 linkGroupOffsets()ClipRenderer.swift:624-656

阻塞项(行为/正确性,必须改)

  1. 锚点漏了 − 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)

  2. 参照系:应为"整组最小值",而非两两 ±。
    上游(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"。

视觉保真(建议一并改)

  1. 颜色:上游 ClipRenderer.swift:626rgb(255,71,71,1.0),本 PR 用了 rgba(220,38,38,0.92),请对齐上游红。
  2. 本 PR 给徽章加了 rgba(255,255,255,0.3) 白描边——上游 drawOffsetBadge 没有描边,请去掉。
  3. 缺上游窄 clip 保护:ClipRenderer.swift:649 guard badgeRect.minX > rect.minX + 6 else { return },窄 clip 不画徽章,请补上,否则窄 clip 上徽章会与 trim handle/内容重叠。
  4. 字重:上游 .semibold(600),本 PR 500,小问题可顺手对齐。

把第 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
@H-Chris233

Copy link
Copy Markdown
Collaborator Author

已按上游 EditorViewModel+Linking.swift:95-113 linkGroupOffsets() 修正:

阻塞项:

  • offset 计算: (startFrame − trimStartFrame) − group_min (锚点加 trim)
  • 参照系: 按 linkGroupId 分组 → 整组 min → 仅 delta≠0 入 map
  • 移除 break (正确覆盖 3+ clip 组)

视觉保真:

  • 颜色: rgb(255,71,71) (上游 #FF4747)
  • 去除白描边
  • 窄 clip 保护: bx ≤ rect.x + 6 跳过
  • 字重: 600 semibold

测试: 更新颜色常量 + 新增窄 clip 跳过用例。

CI 双绿,请复审。

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P2] Linked clip 缺少 Offset Badge 渲染

2 participants