summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/commands/timeline/element/update-element-trim.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-06 00:02:23 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-06 00:02:23 +0200
commit44d8c4c8764d49a8e8d0ae713432c07f07cb7597 (patch)
tree4657187279adb475ea710231feb3d0bd4add36ed /apps/web/src/lib/commands/timeline/element/update-element-trim.ts
parent20235d0724a70e6787b6cbdbfa054b1c5d8f62e9 (diff)
downloadopencut-44d8c4c8764d49a8e8d0ae713432c07f07cb7597.tar.gz
refactor: unify element updates into pipeline and centralize ripple
Diffstat (limited to 'apps/web/src/lib/commands/timeline/element/update-element-trim.ts')
-rw-r--r--apps/web/src/lib/commands/timeline/element/update-element-trim.ts116
1 files changed, 0 insertions, 116 deletions
diff --git a/apps/web/src/lib/commands/timeline/element/update-element-trim.ts b/apps/web/src/lib/commands/timeline/element/update-element-trim.ts
deleted file mode 100644
index e3cb596b..00000000
--- a/apps/web/src/lib/commands/timeline/element/update-element-trim.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-import { Command, type CommandResult } from "@/lib/commands/base-command";
-import type { TimelineTrack } from "@/lib/timeline";
-import { EditorCore } from "@/core";
-import { clampAnimationsToDuration } from "@/lib/animation";
-import { isRetimableElement, rippleShiftElements } from "@/lib/timeline";
-import { enforceMainTrackStart } from "@/lib/timeline/placement";
-
-export class UpdateElementTrimCommand extends Command {
- private savedState: TimelineTrack[] | null = null;
- private readonly elementId: string;
- private readonly trimStart: number;
- private readonly trimEnd: number;
- private readonly startTime: number | undefined;
- private readonly duration: number | undefined;
- private readonly rippleEnabled: boolean;
-
- constructor({
- elementId,
- trimStart,
- trimEnd,
- startTime,
- duration,
- rippleEnabled = false,
- }: {
- elementId: string;
- trimStart: number;
- trimEnd: number;
- startTime?: number;
- duration?: number;
- rippleEnabled?: boolean;
- }) {
- super();
- this.elementId = elementId;
- this.trimStart = trimStart;
- this.trimEnd = trimEnd;
- this.startTime = startTime;
- this.duration = duration;
- this.rippleEnabled = rippleEnabled;
- }
-
- execute(): CommandResult | undefined {
- const editor = EditorCore.getInstance();
- this.savedState = editor.timeline.getTracks();
-
- const updatedTracks = this.savedState.map((track) => {
- const targetElement = track.elements.find(
- (element) => element.id === this.elementId,
- );
- if (!targetElement) return track;
-
- const nextDuration = this.duration ?? targetElement.duration;
- const requestedStartTime = this.startTime ?? targetElement.startTime;
- const nextStartTime = enforceMainTrackStart({
- tracks: this.savedState ?? [],
- targetTrackId: track.id,
- requestedStartTime,
- excludeElementId: this.elementId,
- });
-
- const oldEndTime = targetElement.startTime + targetElement.duration;
- const newEndTime = nextStartTime + nextDuration;
- const shiftAmount = oldEndTime - newEndTime;
-
- const updatedElement = {
- ...targetElement,
- trimStart: this.trimStart,
- trimEnd: this.trimEnd,
- startTime: nextStartTime,
- duration: nextDuration,
- ...(isRetimableElement(targetElement)
- ? { retime: targetElement.retime }
- : {}),
- animations: clampAnimationsToDuration({
- animations: targetElement.animations,
- duration: nextDuration,
- }),
- };
-
- if (this.rippleEnabled && Math.abs(shiftAmount) > 0) {
- const shiftedOthers = rippleShiftElements({
- elements: track.elements.filter(
- (element) => element.id !== this.elementId,
- ),
- afterTime: oldEndTime,
- shiftAmount,
- });
- return {
- ...track,
- elements: track.elements.map((element) =>
- element.id === this.elementId
- ? updatedElement
- : (shiftedOthers.find((shifted) => shifted.id === element.id) ??
- element),
- ),
- } as typeof track;
- }
-
- return {
- ...track,
- elements: track.elements.map((element) =>
- element.id === this.elementId ? updatedElement : element,
- ),
- } as typeof track;
- });
-
- editor.timeline.updateTracks(updatedTracks);
- return undefined;
- }
-
- undo(): void {
- if (this.savedState) {
- const editor = EditorCore.getInstance();
- editor.timeline.updateTracks(this.savedState);
- }
- }
-}