summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/commands/timeline/track/add-track.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/commands/timeline/track/add-track.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/commands/timeline/track/add-track.ts')
-rw-r--r--apps/web/src/lib/commands/timeline/track/add-track.ts115
1 files changed, 0 insertions, 115 deletions
diff --git a/apps/web/src/lib/commands/timeline/track/add-track.ts b/apps/web/src/lib/commands/timeline/track/add-track.ts
deleted file mode 100644
index a577c693..00000000
--- a/apps/web/src/lib/commands/timeline/track/add-track.ts
+++ /dev/null
@@ -1,115 +0,0 @@
-import { Command, type CommandResult } from "@/lib/commands/base-command";
-import type { SceneTracks, TrackType } from "@/lib/timeline";
-import { generateUUID } from "@/utils/id";
-import { EditorCore } from "@/core";
-import {
- buildEmptyTrack,
- getDefaultInsertIndexForTrack,
-} from "@/lib/timeline/placement";
-
-export class AddTrackCommand extends Command {
- private trackId: string;
- private savedState: SceneTracks | null = null;
-
- constructor(
- private type: TrackType,
- private index?: number,
- ) {
- super();
- this.trackId = generateUUID();
- }
-
- execute(): CommandResult | undefined {
- const editor = EditorCore.getInstance();
- this.savedState = editor.scenes.getActiveScene().tracks;
-
- const insertIndex =
- this.index ??
- getDefaultInsertIndexForTrack({
- tracks: this.savedState,
- trackType: this.type,
- });
-
- const updatedTracks =
- this.type === "audio"
- ? buildAudioTrackState({
- tracks: this.savedState,
- insertIndex,
- trackId: this.trackId,
- })
- : buildOverlayTrackState({
- tracks: this.savedState,
- insertIndex,
- trackId: this.trackId,
- trackType: this.type,
- });
-
- editor.timeline.updateTracks(updatedTracks);
- return undefined;
- }
-
- undo(): void {
- if (this.savedState) {
- const editor = EditorCore.getInstance();
- editor.timeline.updateTracks(this.savedState);
- }
- }
-
- getTrackId(): string {
- return this.trackId;
- }
-}
-
-function buildAudioTrackState({
- tracks,
- insertIndex,
- trackId,
-}: {
- tracks: SceneTracks;
- insertIndex: number;
- trackId: string;
-}): SceneTracks {
- const audioInsertIndex = Math.max(0, insertIndex - tracks.overlay.length - 1);
- const newTrack = buildEmptyTrack({
- id: trackId,
- type: "audio",
- });
- return {
- ...tracks,
- audio: [
- ...tracks.audio.slice(0, audioInsertIndex),
- newTrack,
- ...tracks.audio.slice(audioInsertIndex),
- ],
- };
-}
-
-function buildOverlayTrackState({
- tracks,
- insertIndex,
- trackId,
- trackType,
-}: {
- tracks: SceneTracks;
- insertIndex: number;
- trackId: string;
- trackType: Exclude<TrackType, "audio">;
-}): SceneTracks {
- const overlayInsertIndex = Math.min(insertIndex, tracks.overlay.length);
- const newTrack =
- trackType === "video"
- ? buildEmptyTrack({ id: trackId, type: "video" })
- : trackType === "text"
- ? buildEmptyTrack({ id: trackId, type: "text" })
- : trackType === "graphic"
- ? buildEmptyTrack({ id: trackId, type: "graphic" })
- : buildEmptyTrack({ id: trackId, type: "effect" });
- return {
- ...tracks,
- overlay: [
- ...tracks.overlay.slice(0, overlayInsertIndex),
- newTrack,
- ...tracks.overlay.slice(overlayInsertIndex),
- ],
- };
-}