summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/commands/timeline/track
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
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')
-rw-r--r--apps/web/src/lib/commands/timeline/track/add-track.ts115
-rw-r--r--apps/web/src/lib/commands/timeline/track/index.ts4
-rw-r--r--apps/web/src/lib/commands/timeline/track/remove-track.ts30
-rw-r--r--apps/web/src/lib/commands/timeline/track/toggle-track-mute.ts41
-rw-r--r--apps/web/src/lib/commands/timeline/track/toggle-track-visibility.ts45
5 files changed, 0 insertions, 235 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),
- ],
- };
-}
diff --git a/apps/web/src/lib/commands/timeline/track/index.ts b/apps/web/src/lib/commands/timeline/track/index.ts
deleted file mode 100644
index 9d4bd9c3..00000000
--- a/apps/web/src/lib/commands/timeline/track/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export { AddTrackCommand } from "./add-track";
-export { RemoveTrackCommand } from "./remove-track";
-export { ToggleTrackMuteCommand } from "./toggle-track-mute";
-export { ToggleTrackVisibilityCommand } from "./toggle-track-visibility";
diff --git a/apps/web/src/lib/commands/timeline/track/remove-track.ts b/apps/web/src/lib/commands/timeline/track/remove-track.ts
deleted file mode 100644
index 5fcaa898..00000000
--- a/apps/web/src/lib/commands/timeline/track/remove-track.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Command, type CommandResult } from "@/lib/commands/base-command";
-import { EditorCore } from "@/core";
-import type { SceneTracks } from "@/lib/timeline";
-
-export class RemoveTrackCommand extends Command {
- private savedState: SceneTracks | null = null;
-
- constructor(private trackId: string) {
- super();
- }
-
- execute(): CommandResult | undefined {
- const editor = EditorCore.getInstance();
- this.savedState = editor.scenes.getActiveScene().tracks;
- const updatedTracks: SceneTracks = {
- ...this.savedState,
- overlay: this.savedState.overlay.filter((track) => track.id !== this.trackId),
- audio: this.savedState.audio.filter((track) => track.id !== this.trackId),
- };
- editor.timeline.updateTracks(updatedTracks);
- return undefined;
- }
-
- undo(): void {
- if (this.savedState) {
- const editor = EditorCore.getInstance();
- editor.timeline.updateTracks(this.savedState);
- }
- }
-}
diff --git a/apps/web/src/lib/commands/timeline/track/toggle-track-mute.ts b/apps/web/src/lib/commands/timeline/track/toggle-track-mute.ts
deleted file mode 100644
index 7ffe2fd7..00000000
--- a/apps/web/src/lib/commands/timeline/track/toggle-track-mute.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { Command, type CommandResult } from "@/lib/commands/base-command";
-import type { SceneTracks } from "@/lib/timeline";
-import { EditorCore } from "@/core";
-import { canTrackHaveAudio, findTrackInSceneTracks, updateTrackInSceneTracks } from "@/lib/timeline";
-
-export class ToggleTrackMuteCommand extends Command {
- private savedState: SceneTracks | null = null;
-
- constructor(private trackId: string) {
- super();
- }
-
- execute(): CommandResult | undefined {
- const editor = EditorCore.getInstance();
- this.savedState = editor.scenes.getActiveScene().tracks;
-
- const targetTrack = findTrackInSceneTracks({
- tracks: this.savedState,
- trackId: this.trackId,
- });
- if (!targetTrack) {
- return;
- }
-
- const updatedTracks = updateTrackInSceneTracks({
- tracks: this.savedState,
- trackId: this.trackId,
- update: (track) =>
- canTrackHaveAudio(track) ? { ...track, muted: !track.muted } : track,
- });
-
- editor.timeline.updateTracks(updatedTracks);
- }
-
- undo(): void {
- if (this.savedState) {
- const editor = EditorCore.getInstance();
- editor.timeline.updateTracks(this.savedState);
- }
- }
-}
diff --git a/apps/web/src/lib/commands/timeline/track/toggle-track-visibility.ts b/apps/web/src/lib/commands/timeline/track/toggle-track-visibility.ts
deleted file mode 100644
index 2292c83a..00000000
--- a/apps/web/src/lib/commands/timeline/track/toggle-track-visibility.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Command, type CommandResult } from "@/lib/commands/base-command";
-import type { SceneTracks } from "@/lib/timeline";
-import { EditorCore } from "@/core";
-import { canTrackBeHidden, findTrackInSceneTracks, updateTrackInSceneTracks } from "@/lib/timeline";
-
-export class ToggleTrackVisibilityCommand extends Command {
- private savedState: SceneTracks | null = null;
-
- constructor(private trackId: string) {
- super();
- }
-
- execute(): CommandResult | undefined {
- const editor = EditorCore.getInstance();
- this.savedState = editor.scenes.getActiveScene().tracks;
-
- const targetTrack = findTrackInSceneTracks({
- tracks: this.savedState,
- trackId: this.trackId,
- });
- if (!targetTrack) {
- return;
- }
-
- const updatedTracks = updateTrackInSceneTracks({
- tracks: this.savedState,
- trackId: this.trackId,
- update: (track) => {
- if (canTrackBeHidden(track)) {
- return { ...track, hidden: !track.hidden };
- }
- return track;
- },
- });
-
- editor.timeline.updateTracks(updatedTracks);
- }
-
- undo(): void {
- if (this.savedState) {
- const editor = EditorCore.getInstance();
- editor.timeline.updateTracks(this.savedState);
- }
- }
-}