diff options
| author | Maze Winther <mazewinther@gmail.com> | 2025-07-06 20:45:29 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2025-07-06 20:45:29 +0200 |
| commit | 40c7fbb4f86130c83fbd9029e83c5e7550e3219d (patch) | |
| tree | 054d918d282358c084f4fc08462913833de644a5 /apps/web/src/hooks/use-playback-controls.ts | |
| parent | 0e32c732ddc335d35e6a7f8547f4af68bfd9c369 (diff) | |
| download | opencut-40c7fbb4f86130c83fbd9029e83c5e7550e3219d.tar.gz | |
refactor: move to a typed-tracks system and add support for text
Diffstat (limited to 'apps/web/src/hooks/use-playback-controls.ts')
| -rw-r--r-- | apps/web/src/hooks/use-playback-controls.ts | 91 |
1 files changed, 45 insertions, 46 deletions
diff --git a/apps/web/src/hooks/use-playback-controls.ts b/apps/web/src/hooks/use-playback-controls.ts index 2c689470..1191d4b4 100644 --- a/apps/web/src/hooks/use-playback-controls.ts +++ b/apps/web/src/hooks/use-playback-controls.ts @@ -7,106 +7,105 @@ export const usePlaybackControls = () => { const { isPlaying, currentTime, play, pause, seek } = usePlaybackStore(); const { - selectedClips, + selectedElements, tracks, - splitClip, + splitElement, splitAndKeepLeft, splitAndKeepRight, separateAudio, } = useTimelineStore(); - const handleSplitSelectedClip = useCallback(() => { - if (selectedClips.length !== 1) { - toast.error("Select exactly one clip to split"); + const handleSplitSelectedElement = useCallback(() => { + if (selectedElements.length !== 1) { + toast.error("Select exactly one element to split"); return; } - const { trackId, clipId } = selectedClips[0]; + const { trackId, elementId } = selectedElements[0]; const track = tracks.find((t) => t.id === trackId); - const clip = track?.clips.find((c) => c.id === clipId); + const element = track?.elements.find((e) => e.id === elementId); - if (!clip) return; + if (!element) return; - const effectiveStart = clip.startTime; + const effectiveStart = element.startTime; const effectiveEnd = - clip.startTime + (clip.duration - clip.trimStart - clip.trimEnd); + element.startTime + + (element.duration - element.trimStart - element.trimEnd); if (currentTime <= effectiveStart || currentTime >= effectiveEnd) { - toast.error("Playhead must be within selected clip"); + toast.error("Playhead must be within selected element"); return; } - splitClip(trackId, clipId, currentTime); - toast.success("Clip split at playhead"); - }, [selectedClips, tracks, currentTime, splitClip]); + splitElement(trackId, elementId, currentTime); + }, [selectedElements, tracks, currentTime, splitElement]); const handleSplitAndKeepLeftCallback = useCallback(() => { - if (selectedClips.length !== 1) { - toast.error("Select exactly one clip"); + if (selectedElements.length !== 1) { + toast.error("Select exactly one element"); return; } - const { trackId, clipId } = selectedClips[0]; + const { trackId, elementId } = selectedElements[0]; const track = tracks.find((t) => t.id === trackId); - const clip = track?.clips.find((c) => c.id === clipId); + const element = track?.elements.find((e) => e.id === elementId); - if (!clip) return; + if (!element) return; - const effectiveStart = clip.startTime; + const effectiveStart = element.startTime; const effectiveEnd = - clip.startTime + (clip.duration - clip.trimStart - clip.trimEnd); + element.startTime + + (element.duration - element.trimStart - element.trimEnd); if (currentTime <= effectiveStart || currentTime >= effectiveEnd) { - toast.error("Playhead must be within selected clip"); + toast.error("Playhead must be within selected element"); return; } - splitAndKeepLeft(trackId, clipId, currentTime); - toast.success("Split and kept left portion"); - }, [selectedClips, tracks, currentTime, splitAndKeepLeft]); + splitAndKeepLeft(trackId, elementId, currentTime); + }, [selectedElements, tracks, currentTime, splitAndKeepLeft]); const handleSplitAndKeepRightCallback = useCallback(() => { - if (selectedClips.length !== 1) { - toast.error("Select exactly one clip"); + if (selectedElements.length !== 1) { + toast.error("Select exactly one element"); return; } - const { trackId, clipId } = selectedClips[0]; + const { trackId, elementId } = selectedElements[0]; const track = tracks.find((t) => t.id === trackId); - const clip = track?.clips.find((c) => c.id === clipId); + const element = track?.elements.find((e) => e.id === elementId); - if (!clip) return; + if (!element) return; - const effectiveStart = clip.startTime; + const effectiveStart = element.startTime; const effectiveEnd = - clip.startTime + (clip.duration - clip.trimStart - clip.trimEnd); + element.startTime + + (element.duration - element.trimStart - element.trimEnd); if (currentTime <= effectiveStart || currentTime >= effectiveEnd) { - toast.error("Playhead must be within selected clip"); + toast.error("Playhead must be within selected element"); return; } - splitAndKeepRight(trackId, clipId, currentTime); - toast.success("Split and kept right portion"); - }, [selectedClips, tracks, currentTime, splitAndKeepRight]); + splitAndKeepRight(trackId, elementId, currentTime); + }, [selectedElements, tracks, currentTime, splitAndKeepRight]); const handleSeparateAudioCallback = useCallback(() => { - if (selectedClips.length !== 1) { - toast.error("Select exactly one video clip to separate audio"); + if (selectedElements.length !== 1) { + toast.error("Select exactly one media element to separate audio"); return; } - const { trackId, clipId } = selectedClips[0]; + const { trackId, elementId } = selectedElements[0]; const track = tracks.find((t) => t.id === trackId); - if (!track || track.type !== "video") { - toast.error("Select a video clip to separate audio"); + if (!track || track.type !== "media") { + toast.error("Select a media element to separate audio"); return; } - separateAudio(trackId, clipId); - toast.success("Audio separated to audio track"); - }, [selectedClips, tracks, separateAudio]); + separateAudio(trackId, elementId); + }, [selectedElements, tracks, separateAudio]); const handleKeyPress = useCallback( (e: KeyboardEvent) => { @@ -130,7 +129,7 @@ export const usePlaybackControls = () => { case "s": if (e.ctrlKey || e.metaKey) { e.preventDefault(); - handleSplitSelectedClip(); + handleSplitSelectedElement(); } break; @@ -160,7 +159,7 @@ export const usePlaybackControls = () => { isPlaying, play, pause, - handleSplitSelectedClip, + handleSplitSelectedElement, handleSplitAndKeepLeftCallback, handleSplitAndKeepRightCallback, handleSeparateAudioCallback, |
