From cb4155799fff0ae87327b933b447dfc676653c9b Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Tue, 17 Dec 2024 23:48:43 +0800 Subject: [PATCH] show loading indicator for mini waveform https://github.com/mifi/lossless-cut/issues/260#issuecomment-2546373534 and fix dark mode for mini waveform --- src/renderer/src/App.tsx | 1 + src/renderer/src/Timeline.module.css | 12 ++++++++ src/renderer/src/Timeline.tsx | 32 ++++++++++++--------- src/renderer/src/components/BigWaveform.tsx | 12 ++++---- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 3216248d..5f513f4f 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -2542,6 +2542,7 @@ function App() { onWheel={onTimelineWheel} goToTimecode={goToTimecode} isSegmentSelected={isSegmentSelected} + darkMode={darkMode} /> string | undefined; const currentTimeWidth = 1; // eslint-disable-next-line react/display-name -const Waveform = memo(({ waveform, calculateTimelinePercent, durationSafe }: { - waveform: RenderableWaveform, calculateTimelinePercent: CalculateTimelinePercent, durationSafe: number, +const Waveform = memo(({ waveform, calculateTimelinePercent, durationSafe, darkMode }: { + waveform: RenderableWaveform, + calculateTimelinePercent: CalculateTimelinePercent, + durationSafe: number, + darkMode: boolean, }) => { - const [style, setStyle] = useState({ display: 'none' }); - const leftPos = calculateTimelinePercent(waveform.from); const toTruncated = Math.min(waveform.to, durationSafe); - // Prevents flash - function onLoad() { - setStyle({ - position: 'absolute', height: '100%', left: leftPos, width: `${((toTruncated - waveform.from) / durationSafe) * 100}%`, - }); - } + const style = useMemo(() => ({ + position: 'absolute', height: '100%', left: leftPos, width: `${((toTruncated - waveform.from) / durationSafe) * 100}%`, filter: darkMode ? undefined : 'invert(1)', + }), [darkMode, durationSafe, leftPos, toTruncated, waveform.from]); - if (waveform.url == null) return null; + if (waveform.url == null) { + return
; + } return ( - + ); }); // eslint-disable-next-line react/display-name -const Waveforms = memo(({ calculateTimelinePercent, durationSafe, waveforms, zoom, height }: { +const Waveforms = memo(({ calculateTimelinePercent, durationSafe, waveforms, zoom, height, darkMode }: { calculateTimelinePercent: CalculateTimelinePercent, durationSafe: number, waveforms: RenderableWaveform[], zoom: number, height: number, + darkMode: boolean, }) => (
{waveforms.map((waveform) => ( - + ))}
)); @@ -108,6 +109,7 @@ function Timeline({ commandedTimeRef, goToTimecode, isSegmentSelected, + darkMode, } : { durationSafe: number, startTimeOffset: number, @@ -138,6 +140,7 @@ function Timeline({ commandedTimeRef: MutableRefObject, goToTimecode: () => void, isSegmentSelected: (a: { segId: string }) => boolean, + darkMode: boolean, }) { const { t } = useTranslation(); @@ -354,6 +357,7 @@ function Timeline({ waveforms={waveforms} zoom={zoom} height={40} + darkMode={darkMode} /> )} diff --git a/src/renderer/src/components/BigWaveform.tsx b/src/renderer/src/components/BigWaveform.tsx index 769fe0bf..f77e6e41 100644 --- a/src/renderer/src/components/BigWaveform.tsx +++ b/src/renderer/src/components/BigWaveform.tsx @@ -1,4 +1,4 @@ -import { memo, useEffect, useState, useCallback, useRef, CSSProperties } from 'react'; +import { memo, useEffect, useState, useCallback, useRef, CSSProperties, MouseEventHandler, WheelEventHandler } from 'react'; import { Spinner } from 'evergreen-ui'; import { ffmpegExtractWindow } from '../util/constants'; @@ -38,9 +38,9 @@ function BigWaveform({ waveforms, relevantTime, playing, durationSafe, zoom, see e.preventDefault(); }, [relevantTime]); - const scaleToTime = useCallback((v) => (((v) / getRect().width) * windowSize) / zoom, [getRect, windowSize, zoom]); + const scaleToTime = useCallback((v: number) => (((v) / getRect().width) * windowSize) / zoom, [getRect, windowSize, zoom]); - const handleMouseMove = useCallback((e) => { + const handleMouseMove = useCallback>((e) => { if (mouseDownRef.current == null) return; seekRel(-scaleToTime(e.movementX)); @@ -48,11 +48,11 @@ function BigWaveform({ waveforms, relevantTime, playing, durationSafe, zoom, see e.preventDefault(); }, [scaleToTime, seekRel]); - const handleWheel = useCallback((e) => { + const handleWheel = useCallback>((e) => { seekRel(scaleToTime(e.deltaX)); }, [scaleToTime, seekRel]); - const handleMouseUp = useCallback((e) => { + const handleMouseUp = useCallback>((e) => { if (!mouseDownRef.current) return; mouseDownRef.current = undefined; e.preventDefault(); @@ -63,7 +63,7 @@ function BigWaveform({ waveforms, relevantTime, playing, durationSafe, zoom, see const startTime = Date.now(); if (playing) { - let raf; + let raf: number; // eslint-disable-next-line no-inner-declarations function render() { raf = window.requestAnimationFrame(() => {