From 011f51051c9750706978d6c89ce84dd15560c335 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Sat, 18 Apr 2026 01:40:18 +0200 Subject: feat: clip volume line and timeline waveform improvements --- apps/web/src/core/managers/media-manager.ts | 4 ++++ apps/web/src/core/managers/timeline-manager.ts | 23 ++++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) (limited to 'apps/web/src/core/managers') diff --git a/apps/web/src/core/managers/media-manager.ts b/apps/web/src/core/managers/media-manager.ts index 4add3c04..e43340a7 100644 --- a/apps/web/src/core/managers/media-manager.ts +++ b/apps/web/src/core/managers/media-manager.ts @@ -4,6 +4,7 @@ import type { MediaAsset } from "@/lib/media/types"; import { storageService } from "@/services/storage/service"; import { generateUUID } from "@/utils/id"; import { videoCache } from "@/services/video-cache/service"; +import { waveformCache } from "@/services/waveform-cache/service"; import { BatchCommand, RemoveMediaAssetCommand } from "@/lib/commands"; export class MediaManager { @@ -94,6 +95,8 @@ export class MediaManager { } async clearProjectMedia({ projectId }: { projectId: string }): Promise { + waveformCache.clearAll(); + this.assets.forEach((asset) => { if (asset.url) { URL.revokeObjectURL(asset.url); @@ -120,6 +123,7 @@ export class MediaManager { clearAllAssets(): void { videoCache.clearAll(); + waveformCache.clearAll(); this.assets.forEach((asset) => { if (asset.url) { diff --git a/apps/web/src/core/managers/timeline-manager.ts b/apps/web/src/core/managers/timeline-manager.ts index 898a7e89..c58128fb 100644 --- a/apps/web/src/core/managers/timeline-manager.ts +++ b/apps/web/src/core/managers/timeline-manager.ts @@ -712,18 +712,31 @@ export class TimelineManager { updates: Partial; }>; }): void { + let changedOverlayCount = 0; for (const { elementId, updates: elementUpdates } of updates) { const existingOverlay = this.previewOverlay.get(elementId); - const mergedOverlay = { - ...existingOverlay, - ...elementUpdates, - } as Partial; - this.previewOverlay.set(elementId, mergedOverlay); + const changed = Object.entries(elementUpdates).some(([key, value]) => { + return !Object.is( + existingOverlay?.[key as keyof TimelineElement], + value, + ); + }); + if (changed) { + changedOverlayCount += 1; + const mergedOverlay = { + ...existingOverlay, + ...elementUpdates, + } as Partial; + this.previewOverlay.set(elementId, mergedOverlay); + } } const committedTracks = this.editor.scenes.getActiveSceneOrNull()?.tracks; if (!committedTracks) { return; } + if (changedOverlayCount === 0) { + return; + } this.previewTracks = this.applyPreviewOverlay(committedTracks); this.notify(); } -- cgit v1.3.1