summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/timeline/update-pipeline.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-07 04:41:27 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-07 04:41:27 +0200
commitcbd1b8212370c67b34a70dccd21bd82de72fead2 (patch)
treed97cbee2aae22c22b59c59a50e9f8a6af0ae8ccf /apps/web/src/lib/timeline/update-pipeline.ts
parent4f7d401a974047d37673ee8e3840dceaaddc295c (diff)
downloadopencut-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.ts46
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,
+ },
+ };
+ },
},
];