summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/timeline/placement/apply.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-20 11:31:17 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-20 11:31:17 +0200
commit3e89d2998588f8e35c524e523ba2ee853f0f6475 (patch)
tree57221f96c1259b3b07e3ddf8c1adefc502b9d8eb /apps/web/src/lib/timeline/placement/apply.ts
parent729d10592f4e802f91c555c309ff3ba4b119f843 (diff)
downloadopencut-3e89d2998588f8e35c524e523ba2ee853f0f6475.tar.gz
refactor: restructure files to their domains, new preview overlay system, and dep graph
Diffstat (limited to 'apps/web/src/lib/timeline/placement/apply.ts')
-rw-r--r--apps/web/src/lib/timeline/placement/apply.ts158
1 files changed, 0 insertions, 158 deletions
diff --git a/apps/web/src/lib/timeline/placement/apply.ts b/apps/web/src/lib/timeline/placement/apply.ts
deleted file mode 100644
index 639b1b42..00000000
--- a/apps/web/src/lib/timeline/placement/apply.ts
+++ /dev/null
@@ -1,158 +0,0 @@
-import type {
- AudioTrack,
- EffectTrack,
- GraphicTrack,
- OverlayTrack,
- SceneTracks,
- TextTrack,
- TimelineElement,
- TimelineTrack,
- VideoTrack,
-} from "@/lib/timeline";
-import { generateUUID } from "@/utils/id";
-import { buildEmptyTrack } from "./track-factory";
-import type { PlacementResult } from "./types";
-import { updateTrackInSceneTracks } from "@/lib/timeline/track-element-update";
-
-export function applyPlacement({
- tracks,
- placementResult,
- elements,
- newTrackInsertIndexOverride,
-}: {
- tracks: SceneTracks;
- placementResult: PlacementResult;
- elements: TimelineElement[];
- newTrackInsertIndexOverride?: number;
-}): { updatedTracks: SceneTracks; targetTrackId: string } | null {
- const orderedTracks = [...tracks.overlay, tracks.main, ...tracks.audio];
- if (placementResult.kind === "existingTrack") {
- const targetTrack = orderedTracks[placementResult.trackIndex];
- if (!targetTrack) {
- return null;
- }
-
- const updatedTracks = updateTrackInSceneTracks({
- tracks,
- trackId: targetTrack.id,
- update: (track) => ({
- ...track,
- elements: [...track.elements, ...elements],
- }),
- });
-
- return { updatedTracks, targetTrackId: targetTrack.id };
- }
-
- const newTrackId = generateUUID();
- const insertIndex =
- newTrackInsertIndexOverride ?? placementResult.insertIndex;
- const updatedTracks =
- placementResult.trackType === "audio"
- ? {
- ...tracks,
- audio: insertIntoAudioTracks({
- tracks,
- insertIndex,
- track: buildPlacedAudioTrack({
- id: newTrackId,
- elements,
- }),
- }),
- }
- : {
- ...tracks,
- overlay: insertIntoOverlayTracks({
- tracks,
- insertIndex,
- track: buildPlacedOverlayTrack({
- id: newTrackId,
- type: placementResult.trackType,
- elements,
- }),
- }),
- };
- return { updatedTracks, targetTrackId: newTrackId };
-}
-
-function insertIntoOverlayTracks({
- tracks,
- insertIndex,
- track,
-}: {
- tracks: SceneTracks;
- insertIndex: number;
- track: OverlayTrack;
-}): OverlayTrack[] {
- const normalizedInsertIndex = Math.max(
- 0,
- Math.min(insertIndex, tracks.overlay.length),
- );
- const nextTracks = [...tracks.overlay];
- nextTracks.splice(normalizedInsertIndex, 0, track);
- return nextTracks;
-}
-
-function insertIntoAudioTracks({
- tracks,
- insertIndex,
- track,
-}: {
- tracks: SceneTracks;
- insertIndex: number;
- track: AudioTrack;
-}): AudioTrack[] {
- const audioInsertIndex = Math.max(
- 0,
- Math.min(insertIndex - tracks.overlay.length - 1, tracks.audio.length),
- );
- const nextTracks = [...tracks.audio];
- nextTracks.splice(audioInsertIndex, 0, track);
- return nextTracks;
-}
-
-function buildPlacedAudioTrack({
- id,
- elements,
-}: {
- id: string;
- elements: TimelineElement[];
-}): AudioTrack {
- return {
- ...buildEmptyTrack({ id, type: "audio" }),
- elements: elements as AudioTrack["elements"],
- };
-}
-
-function buildPlacedOverlayTrack({
- id,
- type,
- elements,
-}: {
- id: string;
- type: Exclude<OverlayTrack["type"], "audio">;
- elements: TimelineElement[];
-}): OverlayTrack {
- switch (type) {
- case "video":
- return {
- ...buildEmptyTrack({ id, type: "video" }),
- elements: elements as VideoTrack["elements"],
- };
- case "text":
- return {
- ...buildEmptyTrack({ id, type: "text" }),
- elements: elements as TextTrack["elements"],
- };
- case "graphic":
- return {
- ...buildEmptyTrack({ id, type: "graphic" }),
- elements: elements as GraphicTrack["elements"],
- };
- case "effect":
- return {
- ...buildEmptyTrack({ id, type: "effect" }),
- elements: elements as EffectTrack["elements"],
- };
- }
-}