diff --git a/src/App.jsx b/src/App.jsx index 35776d54..15027c0b 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -185,7 +185,7 @@ const App = memo(() => { const allUserSettings = useUserSettingsRoot(); 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, treatInputFileModifiedTimeAsStart, treatOutputFileModifiedTimeAsStart, outFormatLocked, setOutFormatLocked, safeOutputFileName, setSafeOutputFileName, enableAutoHtml5ify, segmentsToChaptersOnly, keyBindings, setKeyBindings, resetKeyBindings, enableSmartCut, customFfPath, storeProjectInWorkingDir, setStoreProjectInWorkingDir, enableOverwriteOutput, mouseWheelZoomModifierKey, captureFrameMethod, captureFrameQuality, captureFrameFileNameFormat, enableNativeHevc, cleanupChoices, setCleanupChoices, darkMode, setDarkMode, preferStrongColors, + 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, simpleMode, setSimpleMode, outSegTemplate, setOutSegTemplate, keyboardSeekAccFactor, keyboardNormalSeekSpeed, treatInputFileModifiedTimeAsStart, treatOutputFileModifiedTimeAsStart, 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; useEffect(() => { @@ -2462,6 +2462,7 @@ const App = memo(() => { onKeyboardShortcutsDialogRequested={toggleKeyboardShortcuts} askForCleanupChoices={askForCleanupChoices} toggleStoreProjectInWorkingDir={toggleStoreProjectInWorkingDir} + simpleMode={simpleMode} /> diff --git a/src/components/Settings.jsx b/src/components/Settings.jsx index 70d20b6b..90bbcf2e 100644 --- a/src/components/Settings.jsx +++ b/src/components/Settings.jsx @@ -1,4 +1,4 @@ -import React, { memo, useCallback, useMemo } from 'react'; +import React, { memo, useCallback, useMemo, useState } from 'react'; import { FaYinYang, FaKeyboard } from 'react-icons/fa'; import { GlobeIcon, CleanIcon, CogIcon, Button, NumericalIcon, FolderCloseIcon, DocumentIcon, TimeIcon } from 'evergreen-ui'; import { useTranslation } from 'react-i18next'; @@ -35,8 +35,10 @@ const Settings = memo(({ onKeyboardShortcutsDialogRequested, askForCleanupChoices, toggleStoreProjectInWorkingDir, + simpleMode, }) => { const { t } = useTranslation(); + const [showAdvanced, setShowAdvanced] = useState(!simpleMode); const { customOutDir, changeOutDir, keyframeCut, toggleKeyframeCut, timecodeFormat, setTimecodeFormat, invertCutSegments, setInvertCutSegments, askBeforeClose, setAskBeforeClose, enableAskForImportChapters, setEnableAskForImportChapters, enableAskForFileOpenAction, setEnableAskForFileOpenAction, autoSaveProjectFile, setAutoSaveProjectFile, invertTimelineScroll, setInvertTimelineScroll, language, setLanguage, ffmpegExperimental, setFfmpegExperimental, hideNotifications, setHideNotifications, autoLoadTimecode, setAutoLoadTimecode, enableAutoHtml5ify, setEnableAutoHtml5ify, customFfPath, setCustomFfPath, storeProjectInWorkingDir, enableOverwriteOutput, setEnableOverwriteOutput, mouseWheelZoomModifierKey, setMouseWheelZoomModifierKey, captureFrameMethod, setCaptureFrameMethod, captureFrameQuality, setCaptureFrameQuality, captureFrameFileNameFormat, setCaptureFrameFileNameFormat, enableNativeHevc, setEnableNativeHevc, enableUpdateCheck, setEnableUpdateCheck, allowMultipleInstances, setAllowMultipleInstances, preferStrongColors, setPreferStrongColors, treatInputFileModifiedTimeAsStart, setTreatInputFileModifiedTimeAsStart, treatOutputFileModifiedTimeAsStart, setTreatOutputFileModifiedTimeAsStart } = useUserSettings(); @@ -78,7 +80,15 @@ const Settings = memo(({ {t('Current setting')} + + + {t('Show advanced settings')} + + + + + App language @@ -89,6 +99,67 @@ const Settings = memo(({ + + {showAdvanced && ( + + + {t('Auto save project file?')}
+
+ + + +
+ )} + + {showAdvanced && ( + + {t('Store project file (.llc) in the working directory or next to loaded media file?')} + + + + + )} + + {showAdvanced && !isMasBuild && ( + + + {t('Custom FFmpeg directory (experimental)')}
+
+ {t('This allows you to specify custom FFmpeg and FFprobe binaries to use. Make sure the "ffmpeg" and "ffprobe" executables exist in the same directory, and then select the directory.')} +
+
+ + +
{customFfPath}
+ +
+ )} + + {showAdvanced && !isStoreBuild && ( + + {t('Check for updates on startup?')} + + + + + )} + + {showAdvanced && ( + + {t('Allow multiple instances of LosslessCut to run concurrently? (experimental)')} + + + + + )} + + +
+ {t('Choose cutting mode: Remove or keep selected segments from video when exporting?')}
@@ -119,94 +190,30 @@ const Settings = memo(({
- - - {t('Auto save project file?')}
-
- - - -
- - - {t('Store project file (.llc) in the working directory or next to loaded media file?')} - - - - - -
- - - {t('Keyboard & mouse shortcuts')} - - - - - - - {t('Mouse wheel zoom modifier key')} - - - - - - - {t('Timeline trackpad/wheel sensitivity')} - - - - - - - {t('Timeline keyboard seek speed')} - - - - - - - {t('Timeline keyboard seek acceleration')} - - - - - - - {t('Invert timeline trackpad/wheel direction?')} - - - - - -
- - - {t('Set file modification date/time of output files to:')} - - - - + {showAdvanced && ( + + {t('Set file modification date/time of output files to:')} + + + + + )} - - {t('Treat source file modification date/time as:')} - - - - + {showAdvanced && ( + + {t('Treat source file modification date/time as:')} + + + + + )} @@ -244,6 +251,30 @@ const Settings = memo(({ + {showAdvanced && ( + + {t('Enable experimental ffmpeg features flag?')} + + + + + )} + + {showAdvanced && ( + + + {t('Extract unprocessable tracks to separate files or discard them?')}
+
+ {t('(data tracks such as GoPro GPS, telemetry etc. are not copied over by default because ffmpeg cannot cut them, thus they will cause the media duration to stay the same after cutting video/audio)')} +
+
+ + + +
+ )} + +
@@ -284,126 +315,128 @@ const Settings = memo(({ + +
+ - {t('In timecode show')} + {t('Keyboard & mouse shortcuts')} - + -
- - {t('Show informational notifications')} + {t('Mouse wheel zoom modifier key')} - setHideNotifications(v ? undefined : 'all')} /> + - {t('Ask about what to do when opening a new file when another file is already already open?')} + {t('Timeline trackpad/wheel sensitivity')} - + - {t('Ask for confirmation when closing app or file?')} + {t('Timeline keyboard seek speed')} - + - {t('Ask about importing chapters from opened file?')} + {t('Timeline keyboard seek acceleration')} - + -
- - {t('Prefer strong colors')} + {t('Invert timeline trackpad/wheel direction?')} - + -
+
- {!isMasBuild && ( + {showAdvanced && ( - - {t('Custom FFmpeg directory (experimental)')}
-
- {t('This allows you to specify custom FFmpeg and FFprobe binaries to use. Make sure the "ffmpeg" and "ffprobe" executables exist in the same directory, and then select the directory.')} -
-
+ {t('Auto load timecode from file as an offset in the timeline?')} - -
{customFfPath}
+
)} - {!isStoreBuild && ( + {showAdvanced && ( - {t('Check for updates on startup?')} + {t('Enable HEVC / H265 hardware decoding (you may need to turn this off if you have problems with HEVC files)')} - + + + + )} + + + {showAdvanced && ( + + {t('Try to automatically convert to supported format when opening unsupported file?')} + + )} - {t('Allow multiple instances of LosslessCut to run concurrently? (experimental)')} + {t('In timecode show')} - + - {t('Enable HEVC / H265 hardware decoding (you may need to turn this off if you have problems with HEVC files)')} + {t('Prefer strong colors')} - + +
+ - {t('Enable experimental ffmpeg features flag?')} + {t('Show informational notifications')} - + setHideNotifications(v ? undefined : 'all')} /> - {t('Auto load timecode from file as an offset in the timeline?')} + {t('Ask about what to do when opening a new file when another file is already already open?')} - + - {t('Try to automatically convert to supported format when opening unsupported file?')} + {t('Ask for confirmation when closing app or file?')} - + - - {t('Extract unprocessable tracks to separate files or discard them?')}
-
- {t('(data tracks such as GoPro GPS, telemetry etc. are not copied over by default because ffmpeg cannot cut them, thus they will cause the media duration to stay the same after cutting video/audio)')} -
-
+ {t('Ask about importing chapters from opened file?')} - +