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?')}
+
+
+ {storeProjectInWorkingDir ? t('Store in working directory') : t('Store next to 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 ? t('Using external ffmpeg') : t('Using built-in ffmpeg')}
+
+ {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?')}
-
-
- {storeProjectInWorkingDir ? t('Store in working directory') : t('Store next to media file')}
-
-
-
-
-
-
-
- {t('Keyboard & mouse shortcuts')}
-
- } onClick={onKeyboardShortcutsDialogRequested}>{t('Keyboard & mouse shortcuts')}
-
-
-
-
- {t('Mouse wheel zoom modifier key')}
-
- setMouseWheelZoomModifierKey(e.target.value)}>
- {Object.entries(getModifierKeyNames()).map(([key, value]) => (
- {value}
- ))}
-
-
-
-
-
- {t('Timeline trackpad/wheel sensitivity')}
-
- onTunerRequested('wheelSensitivity')}>{t('Change value')}
-
-
-
-
- {t('Timeline keyboard seek speed')}
-
- onTunerRequested('keyboardNormalSeekSpeed')}>{t('Change value')}
-
-
-
-
- {t('Timeline keyboard seek acceleration')}
-
- onTunerRequested('keyboardSeekAccFactor')}>{t('Change value')}
-
-
-
-
- {t('Invert timeline trackpad/wheel direction?')}
-
-
-
-
-
-
-
-
- {t('Set file modification date/time of output files to:')}
-
- setTreatOutputFileModifiedTimeAsStart(e.target.value === 'disabled' ? null : (e.target.value === 'true'))}>
- {t('Current time')}
- {t('Source file\'s time plus segment start cut time')}
- {t('Source file\'s time minus segment end cut time')}
-
-
-
+ {showAdvanced && (
+
+ {t('Set file modification date/time of output files to:')}
+
+ setTreatOutputFileModifiedTimeAsStart(e.target.value === 'disabled' ? null : (e.target.value === 'true'))}>
+ {t('Current time')}
+ {t('Source file\'s time plus segment start cut time')}
+ {t('Source file\'s time minus segment end cut time')}
+
+
+
+ )}
-
- {t('Treat source file modification date/time as:')}
-
- setTreatInputFileModifiedTimeAsStart((e.target.value === 'true'))}>
- {t('Start of video')}
- {t('End of video')}
-
-
-
+ {showAdvanced && (
+
+ {t('Treat source file modification date/time as:')}
+
+ setTreatInputFileModifiedTimeAsStart((e.target.value === 'true'))}>
+ {t('Start of video')}
+ {t('End of video')}
+
+
+
+ )}
@@ -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')}
-
- {timecodeFormatOptions[timecodeFormat]}
-
+ } onClick={onKeyboardShortcutsDialogRequested}>{t('Keyboard & mouse shortcuts')}
-
-
- {t('Show informational notifications')}
+ {t('Mouse wheel zoom modifier key')}
- setHideNotifications(v ? undefined : 'all')} />
+ setMouseWheelZoomModifierKey(e.target.value)}>
+ {Object.entries(getModifierKeyNames()).map(([key, value]) => (
+ {value}
+ ))}
+
- {t('Ask about what to do when opening a new file when another file is already already open?')}
+ {t('Timeline trackpad/wheel sensitivity')}
-
+ onTunerRequested('wheelSensitivity')}>{t('Change value')}
- {t('Ask for confirmation when closing app or file?')}
+ {t('Timeline keyboard seek speed')}
-
+ onTunerRequested('keyboardNormalSeekSpeed')}>{t('Change value')}
- {t('Ask about importing chapters from opened file?')}
+ {t('Timeline keyboard seek acceleration')}
-
+ onTunerRequested('keyboardSeekAccFactor')}>{t('Change value')}
-
-
- {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 ? t('Using external ffmpeg') : t('Using built-in ffmpeg')}
-
- {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')}
-
+
+ {timecodeFormatOptions[timecodeFormat]}
+
- {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?')}
-
+