diff options
| author | Maze Winther <mazewinther@gmail.com> | 2026-04-07 04:41:27 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2026-04-07 04:41:27 +0200 |
| commit | cbd1b8212370c67b34a70dccd21bd82de72fead2 (patch) | |
| tree | d97cbee2aae22c22b59c59a50e9f8a6af0ae8ccf /apps/web/src/lib/timeline/update-pipeline.ts | |
| parent | 4f7d401a974047d37673ee8e3840dceaaddc295c (diff) | |
| download | opencut-cbd1b8212370c67b34a70dccd21bd82de72fead2.tar.gz | |
refactor: structured track layout per scene
Diffstat (limited to 'apps/web/src/lib/timeline/update-pipeline.ts')
| -rw-r--r-- | apps/web/src/lib/timeline/update-pipeline.ts | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/apps/web/src/lib/timeline/update-pipeline.ts b/apps/web/src/lib/timeline/update-pipeline.ts index 61d09a9d..2be73441 100644 --- a/apps/web/src/lib/timeline/update-pipeline.ts +++ b/apps/web/src/lib/timeline/update-pipeline.ts @@ -4,14 +4,13 @@ import { getSourceSpanAtClipTime, getTimelineDurationForSourceSpan, } from "@/lib/retime"; -import { enforceMainTrackStart } from "@/lib/timeline/placement"; -import type { RetimeConfig, TimelineElement, TimelineTrack } from "@/lib/timeline"; +import type { RetimeConfig, SceneTracks, TimelineElement } from "@/lib/timeline"; import { isRetimableElement } from "@/lib/timeline"; type ElementUpdateField = keyof TimelineElement | string; export interface ElementUpdateContext { - tracks: TimelineTrack[]; + tracks: SceneTracks; trackId: string; } @@ -94,17 +93,36 @@ const enforceRules: ElementUpdateRule[] = [ }, { triggers: ["startTime"], - apply: ({ element, context }) => ({ - element: { - ...element, - startTime: enforceMainTrackStart({ - tracks: context.tracks, - targetTrackId: context.trackId, - requestedStartTime: Math.max(0, element.startTime), - excludeElementId: element.id, - }), - }, - }), + apply: ({ element, context }) => { + const requestedStartTime = Math.max(0, element.startTime); + if (context.trackId !== context.tracks.main.id) { + return { + element: { + ...element, + startTime: requestedStartTime, + }, + }; + } + + const earliestElement = context.tracks.main.elements + .filter((candidate) => candidate.id !== element.id) + .reduce<TimelineElement | null>((earliest, candidate) => { + if (!earliest || candidate.startTime < earliest.startTime) { + return candidate; + } + return earliest; + }, null); + + return { + element: { + ...element, + startTime: + !earliestElement || requestedStartTime <= earliestElement.startTime + ? 0 + : requestedStartTime, + }, + }; + }, }, ]; |
