|
|
|
@ -26,7 +26,7 @@ import useFrameCapture from './hooks/useFrameCapture';
|
|
|
|
import useSegments from './hooks/useSegments';
|
|
|
|
import useSegments from './hooks/useSegments';
|
|
|
|
import useDirectoryAccess, { DirectoryAccessDeclinedError } from './hooks/useDirectoryAccess';
|
|
|
|
import useDirectoryAccess, { DirectoryAccessDeclinedError } from './hooks/useDirectoryAccess';
|
|
|
|
|
|
|
|
|
|
|
|
import UserSettingsContext from './contexts/UserSettingsContext';
|
|
|
|
import { UserSettingsContext, SegColorsContext } from './contexts';
|
|
|
|
|
|
|
|
|
|
|
|
import NoFileLoaded from './NoFileLoaded';
|
|
|
|
import NoFileLoaded from './NoFileLoaded';
|
|
|
|
import Canvas from './Canvas';
|
|
|
|
import Canvas from './Canvas';
|
|
|
|
@ -50,6 +50,7 @@ import OutputFormatSelect from './components/OutputFormatSelect';
|
|
|
|
|
|
|
|
|
|
|
|
import { loadMifiLink, runStartupCheck } from './mifi';
|
|
|
|
import { loadMifiLink, runStartupCheck } from './mifi';
|
|
|
|
import { controlsBackground, darkModeTransition } from './colors';
|
|
|
|
import { controlsBackground, darkModeTransition } from './colors';
|
|
|
|
|
|
|
|
import { getSegColor } from './util/colors';
|
|
|
|
import {
|
|
|
|
import {
|
|
|
|
getStreamFps, isCuttingStart, isCuttingEnd,
|
|
|
|
getStreamFps, isCuttingStart, isCuttingEnd,
|
|
|
|
readFileMeta, getSmarterOutFormat, renderThumbnails as ffmpegRenderThumbnails,
|
|
|
|
readFileMeta, getSmarterOutFormat, renderThumbnails as ffmpegRenderThumbnails,
|
|
|
|
@ -175,7 +176,7 @@ const App = memo(() => {
|
|
|
|
const allUserSettings = useUserSettingsRoot();
|
|
|
|
const allUserSettings = useUserSettingsRoot();
|
|
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
const {
|
|
|
|
captureFormat, setCaptureFormat, customOutDir, setCustomOutDir, keyframeCut, setKeyframeCut, preserveMovData, setPreserveMovData, movFastStart, setMovFastStart, avoidNegativeTs, autoMerge, timecodeFormat, invertCutSegments, setInvertCutSegments, autoExportExtraStreams, askBeforeClose, enableAskForImportChapters, enableAskForFileOpenAction, playbackVolume, setPlaybackVolume, autoSaveProjectFile, wheelSensitivity, invertTimelineScroll, language, ffmpegExperimental, hideNotifications, autoLoadTimecode, autoDeleteMergedSegments, exportConfirmEnabled, setExportConfirmEnabled, segmentsToChapters, setSegmentsToChapters, preserveMetadataOnMerge, setPreserveMetadataOnMerge, setSimpleMode, outSegTemplate, setOutSegTemplate, keyboardSeekAccFactor, keyboardNormalSeekSpeed, enableTransferTimestamps, outFormatLocked, setOutFormatLocked, safeOutputFileName, setSafeOutputFileName, enableAutoHtml5ify, segmentsToChaptersOnly, keyBindings, setKeyBindings, resetKeyBindings, enableSmartCut, customFfPath, storeProjectInWorkingDir, setStoreProjectInWorkingDir, enableOverwriteOutput, mouseWheelZoomModifierKey, captureFrameMethod, captureFrameQuality, captureFrameFileNameFormat, enableNativeHevc, cleanupChoices, setCleanupChoices, darkMode, setDarkMode,
|
|
|
|
captureFormat, setCaptureFormat, customOutDir, setCustomOutDir, keyframeCut, setKeyframeCut, preserveMovData, setPreserveMovData, movFastStart, setMovFastStart, avoidNegativeTs, autoMerge, timecodeFormat, invertCutSegments, setInvertCutSegments, autoExportExtraStreams, askBeforeClose, enableAskForImportChapters, enableAskForFileOpenAction, playbackVolume, setPlaybackVolume, autoSaveProjectFile, wheelSensitivity, invertTimelineScroll, language, ffmpegExperimental, hideNotifications, autoLoadTimecode, autoDeleteMergedSegments, exportConfirmEnabled, setExportConfirmEnabled, segmentsToChapters, setSegmentsToChapters, preserveMetadataOnMerge, setPreserveMetadataOnMerge, setSimpleMode, outSegTemplate, setOutSegTemplate, keyboardSeekAccFactor, keyboardNormalSeekSpeed, enableTransferTimestamps, outFormatLocked, setOutFormatLocked, safeOutputFileName, setSafeOutputFileName, enableAutoHtml5ify, segmentsToChaptersOnly, keyBindings, setKeyBindings, resetKeyBindings, enableSmartCut, customFfPath, storeProjectInWorkingDir, setStoreProjectInWorkingDir, enableOverwriteOutput, mouseWheelZoomModifierKey, captureFrameMethod, captureFrameQuality, captureFrameFileNameFormat, enableNativeHevc, cleanupChoices, setCleanupChoices, darkMode, setDarkMode, preferStrongColors,
|
|
|
|
} = allUserSettings;
|
|
|
|
} = allUserSettings;
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
useEffect(() => {
|
|
|
|
@ -510,6 +511,13 @@ const App = memo(() => {
|
|
|
|
...allUserSettings, toggleCaptureFormat, changeOutDir, toggleKeyframeCut, togglePreserveMovData, toggleMovFastStart, toggleExportConfirmEnabled, toggleSegmentsToChapters, togglePreserveMetadataOnMerge, toggleSimpleMode, toggleSafeOutputFileName, effectiveExportMode,
|
|
|
|
...allUserSettings, toggleCaptureFormat, changeOutDir, toggleKeyframeCut, togglePreserveMovData, toggleMovFastStart, toggleExportConfirmEnabled, toggleSegmentsToChapters, togglePreserveMetadataOnMerge, toggleSimpleMode, toggleSafeOutputFileName, effectiveExportMode,
|
|
|
|
}), [allUserSettings, changeOutDir, effectiveExportMode, toggleCaptureFormat, toggleExportConfirmEnabled, toggleKeyframeCut, toggleMovFastStart, togglePreserveMetadataOnMerge, togglePreserveMovData, toggleSafeOutputFileName, toggleSegmentsToChapters, toggleSimpleMode]);
|
|
|
|
}), [allUserSettings, changeOutDir, effectiveExportMode, toggleCaptureFormat, toggleExportConfirmEnabled, toggleKeyframeCut, toggleMovFastStart, togglePreserveMetadataOnMerge, togglePreserveMovData, toggleSafeOutputFileName, toggleSegmentsToChapters, toggleSimpleMode]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const segColorsContext = useMemo(() => ({
|
|
|
|
|
|
|
|
getSegColor: (seg) => {
|
|
|
|
|
|
|
|
const color = getSegColor(seg);
|
|
|
|
|
|
|
|
return preferStrongColors ? color.desaturate(0.2) : color.desaturate(0.6);
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}), [preferStrongColors]);
|
|
|
|
|
|
|
|
|
|
|
|
const isCopyingStreamId = useCallback((path, streamId) => (
|
|
|
|
const isCopyingStreamId = useCallback((path, streamId) => (
|
|
|
|
!!(copyStreamIdsByFile[path] || {})[streamId]
|
|
|
|
!!(copyStreamIdsByFile[path] || {})[streamId]
|
|
|
|
), [copyStreamIdsByFile]);
|
|
|
|
), [copyStreamIdsByFile]);
|
|
|
|
@ -2153,6 +2161,7 @@ const App = memo(() => {
|
|
|
|
// throw new Error('Test error boundary');
|
|
|
|
// throw new Error('Test error boundary');
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
return (
|
|
|
|
|
|
|
|
<SegColorsContext.Provider value={segColorsContext}>
|
|
|
|
<UserSettingsContext.Provider value={userSettingsContext}>
|
|
|
|
<UserSettingsContext.Provider value={userSettingsContext}>
|
|
|
|
<ThemeProvider value={theme}>
|
|
|
|
<ThemeProvider value={theme}>
|
|
|
|
<div className={darkMode ? 'dark-theme' : undefined} style={{ display: 'flex', flexDirection: 'column', height: '100vh', color: 'var(--gray12)', background: 'var(--gray1)', transition: darkModeTransition }}>
|
|
|
|
<div className={darkMode ? 'dark-theme' : undefined} style={{ display: 'flex', flexDirection: 'column', height: '100vh', color: 'var(--gray12)', background: 'var(--gray1)', transition: darkModeTransition }}>
|
|
|
|
@ -2416,6 +2425,7 @@ const App = memo(() => {
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</ThemeProvider>
|
|
|
|
</ThemeProvider>
|
|
|
|
</UserSettingsContext.Provider>
|
|
|
|
</UserSettingsContext.Provider>
|
|
|
|
|
|
|
|
</SegColorsContext.Provider>
|
|
|
|
);
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|