make backspace remove endpoint first

with default binding
pull/2233/head
Mikael Finstad 1 year ago
parent 2d1860f8d5
commit 99e4d497bd
No known key found for this signature in database
GPG Key ID: 25AB36E3E81CBC26

@ -25,7 +25,7 @@ const defaultKeyBindings: KeyBinding[] = [
{ keys: 'c', action: 'captureSnapshot' }, { keys: 'c', action: 'captureSnapshot' },
{ keys: 'i', action: 'setCutStart' }, { keys: 'i', action: 'setCutStart' },
{ keys: 'o', action: 'setCutEnd' }, { keys: 'o', action: 'setCutEnd' },
{ keys: 'backspace', action: 'removeCurrentSegment' }, { keys: 'backspace', action: 'removeCurrentCutpoint' },
{ keys: 'd', action: 'cleanupFilesDialog' }, { keys: 'd', action: 'cleanupFilesDialog' },
{ keys: 'b', action: 'splitCurrentSegment' }, { keys: 'b', action: 'splitCurrentSegment' },
{ keys: 'r', action: 'increaseRotation' }, { keys: 'r', action: 'increaseRotation' },

@ -337,7 +337,7 @@ function App() {
}, [isFileOpened]); }, [isFileOpened]);
const { const {
cutSegments, cutSegmentsHistory, createSegmentsFromKeyframes, shuffleSegments, detectBlackScenes, detectSilentScenes, detectSceneChanges, removeCutSegment, invertAllSegments, fillSegmentsGaps, combineOverlappingSegments, combineSelectedSegments, shiftAllSegmentTimes, alignSegmentTimesToKeyframes, updateSegOrder, updateSegOrders, reorderSegsByStartTime, addSegment, setCutStart, setCutEnd, labelSegment, splitCurrentSegment, focusSegmentAtCursor, createNumSegments, createFixedDurationSegments, createFixedByteSizedSegments, createRandomSegments, haveInvalidSegs, currentSegIndexSafe, currentCutSeg, inverseCutSegments, clearSegments, clearSegColorCounter, loadCutSegments, isSegmentSelected, setCutTime, setCurrentSegIndex, labelSelectedSegments, deselectAllSegments, selectAllSegments, selectOnlyCurrentSegment, toggleCurrentSegmentSelected, invertSelectedSegments, removeSelectedSegments, setDeselectedSegmentIds, selectSegmentsByLabel, selectSegmentsByExpr, selectAllMarkers, mutateSegmentsByExpr, toggleSegmentSelected, selectOnlySegment, selectedSegments, selectedSegmentsOrInverse, nonFilteredSegmentsOrInverse, segmentsToExport, duplicateCurrentSegment, duplicateSegment, updateSegAtIndex, findSegmentsAtCursor, maybeCreateFullLengthSegment, cutSegments, cutSegmentsHistory, createSegmentsFromKeyframes, shuffleSegments, detectBlackScenes, detectSilentScenes, detectSceneChanges, removeSegment, invertAllSegments, fillSegmentsGaps, combineOverlappingSegments, combineSelectedSegments, shiftAllSegmentTimes, alignSegmentTimesToKeyframes, updateSegOrder, updateSegOrders, reorderSegsByStartTime, addSegment, setCutStart, setCutEnd, labelSegment, splitCurrentSegment, focusSegmentAtCursor, createNumSegments, createFixedDurationSegments, createFixedByteSizedSegments, createRandomSegments, haveInvalidSegs, currentSegIndexSafe, currentCutSeg, inverseCutSegments, clearSegments, clearSegColorCounter, loadCutSegments, isSegmentSelected, setCutTime, setCurrentSegIndex, labelSelectedSegments, deselectAllSegments, selectAllSegments, selectOnlyCurrentSegment, toggleCurrentSegmentSelected, invertSelectedSegments, removeSelectedSegments, setDeselectedSegmentIds, selectSegmentsByLabel, selectSegmentsByExpr, selectAllMarkers, mutateSegmentsByExpr, toggleSegmentSelected, selectOnlySegment, selectedSegments, selectedSegmentsOrInverse, nonFilteredSegmentsOrInverse, segmentsToExport, duplicateCurrentSegment, duplicateSegment, updateSegAtIndex, findSegmentsAtCursor, maybeCreateFullLengthSegment,
} = useSegments({ filePath, workingRef, setWorking, setProgress, videoStream: activeVideoStream, fileDuration, getRelevantTime, maxLabelLength, checkFileOpened, invertCutSegments, segmentsToChaptersOnly, timecodePlaceholder, parseTimecode, appendFfmpegCommandLog, fileDurationNonZero, mainFileMeta }); } = useSegments({ filePath, workingRef, setWorking, setProgress, videoStream: activeVideoStream, fileDuration, getRelevantTime, maxLabelLength, checkFileOpened, invertCutSegments, segmentsToChaptersOnly, timecodePlaceholder, parseTimecode, appendFfmpegCommandLog, fileDurationNonZero, mainFileMeta });
const { getEdlFilePath, projectFileSavePath, getProjectFileSavePath } = useSegmentsAutoSave({ autoSaveProjectFile, storeProjectInWorkingDir, filePath, customOutDir, cutSegments }); const { getEdlFilePath, projectFileSavePath, getProjectFileSavePath } = useSegmentsAutoSave({ autoSaveProjectFile, storeProjectInWorkingDir, filePath, customOutDir, cutSegments });
@ -2025,7 +2025,8 @@ function App() {
batchOpenNextFile: () => batchFileJump(1, true), batchOpenNextFile: () => batchFileJump(1, true),
batchOpenSelectedFile, batchOpenSelectedFile,
closeBatch, closeBatch,
removeCurrentSegment: () => removeCutSegment(currentSegIndexSafe), removeCurrentSegment: () => removeSegment(currentSegIndexSafe, true),
removeCurrentCutpoint: () => removeSegment(currentSegIndexSafe),
undo: () => cutSegmentsHistory.back(), undo: () => cutSegmentsHistory.back(),
redo: () => cutSegmentsHistory.forward(), redo: () => cutSegmentsHistory.forward(),
labelCurrentSegment: () => { labelSegment(currentSegIndexSafe); return false; }, labelCurrentSegment: () => { labelSegment(currentSegIndexSafe); return false; },
@ -2100,7 +2101,7 @@ function App() {
}; };
return ret; return ret;
}, [toggleLoopSelectedSegments, pause, timelineToggleComfortZoom, captureSnapshot, captureSnapshotAsCoverArt, setCutStart, setCutEnd, cleanupFilesDialog, splitCurrentSegment, focusSegmentAtCursor, increaseRotation, goToTimecode, jumpCutStart, jumpCutEnd, jumpTimelineStart, jumpTimelineEnd, batchOpenSelectedFile, closeBatch, addSegment, duplicateCurrentSegment, onExportPress, extractCurrentSegmentFramesAsImages, extractSelectedSegmentsFramesAsImages, reorderSegsByStartTime, invertAllSegments, fillSegmentsGaps, combineOverlappingSegments, combineSelectedSegments, createFixedDurationSegments, createNumSegments, createFixedByteSizedSegments, createRandomSegments, alignSegmentTimesToKeyframes, shuffleSegments, clearSegments, toggleSegmentsList, toggleStreamsSelector, extractAllStreams, convertFormatBatch, concatBatch, toggleCaptureFormat, toggleStripAudio, toggleStripThumbnail, askStartTimeOffset, deselectAllSegments, selectAllSegments, selectOnlyCurrentSegment, editCurrentSegmentTags, toggleCurrentSegmentSelected, invertSelectedSegments, removeSelectedSegments, tryFixInvalidDuration, shiftAllSegmentTimes, toggleMuted, copySegmentsToClipboard, handleShowStreamsSelectorClick, openFilesDialog, openDirDialog, toggleSettings, createSegmentsFromKeyframes, toggleWaveformMode, toggleShowThumbnails, toggleShowKeyframes, showIncludeExternalStreamsDialog, toggleFullscreenVideo, selectAllMarkers, checkFileOpened, cutSegments, seekRel, keyboardSeekAccFactor, togglePlay, play, userChangePlaybackRate, keyboardNormalSeekSpeed, keyboardSeekSpeed2, keyboardSeekSpeed3, seekRelPercent, seekClosestKeyframe, shortStep, jumpSeg, zoomRel, batchFileJump, removeCutSegment, currentSegIndexSafe, cutSegmentsHistory, labelSegment, toggleLastCommands, userHtml5ifyCurrentFile, toggleKeyframeCut, setPlaybackVolume, closeFileWithConfirm, openSendReportDialogWithState, detectBlackScenes, detectSilentScenes, detectSceneChanges]); }, [toggleLoopSelectedSegments, pause, timelineToggleComfortZoom, captureSnapshot, captureSnapshotAsCoverArt, setCutStart, setCutEnd, cleanupFilesDialog, splitCurrentSegment, focusSegmentAtCursor, increaseRotation, goToTimecode, jumpCutStart, jumpCutEnd, jumpTimelineStart, jumpTimelineEnd, batchOpenSelectedFile, closeBatch, addSegment, duplicateCurrentSegment, onExportPress, extractCurrentSegmentFramesAsImages, extractSelectedSegmentsFramesAsImages, reorderSegsByStartTime, invertAllSegments, fillSegmentsGaps, combineOverlappingSegments, combineSelectedSegments, createFixedDurationSegments, createNumSegments, createFixedByteSizedSegments, createRandomSegments, alignSegmentTimesToKeyframes, shuffleSegments, clearSegments, toggleSegmentsList, toggleStreamsSelector, extractAllStreams, convertFormatBatch, concatBatch, toggleCaptureFormat, toggleStripAudio, toggleStripThumbnail, askStartTimeOffset, deselectAllSegments, selectAllSegments, selectOnlyCurrentSegment, editCurrentSegmentTags, toggleCurrentSegmentSelected, invertSelectedSegments, removeSelectedSegments, tryFixInvalidDuration, shiftAllSegmentTimes, toggleMuted, copySegmentsToClipboard, handleShowStreamsSelectorClick, openFilesDialog, openDirDialog, toggleSettings, createSegmentsFromKeyframes, toggleWaveformMode, toggleShowThumbnails, toggleShowKeyframes, showIncludeExternalStreamsDialog, toggleFullscreenVideo, selectAllMarkers, checkFileOpened, cutSegments, seekRel, keyboardSeekAccFactor, togglePlay, play, userChangePlaybackRate, keyboardNormalSeekSpeed, keyboardSeekSpeed2, keyboardSeekSpeed3, seekRelPercent, seekClosestKeyframe, shortStep, jumpSeg, zoomRel, batchFileJump, removeSegment, currentSegIndexSafe, cutSegmentsHistory, labelSegment, toggleLastCommands, userHtml5ifyCurrentFile, toggleKeyframeCut, setPlaybackVolume, closeFileWithConfirm, openSendReportDialogWithState, detectBlackScenes, detectSilentScenes, detectSceneChanges]);
const getKeyboardAction = useCallback((action: MainKeyboardAction) => mainActions[action], [mainActions]); const getKeyboardAction = useCallback((action: MainKeyboardAction) => mainActions[action], [mainActions]);
@ -2553,7 +2554,7 @@ function App() {
segmentAtCursor={segmentAtCursor} segmentAtCursor={segmentAtCursor}
addSegment={addSegment} addSegment={addSegment}
onDuplicateSegmentClick={duplicateSegment} onDuplicateSegmentClick={duplicateSegment}
removeCutSegment={removeCutSegment} removeSegment={removeSegment}
onRemoveSelected={removeSelectedSegments} onRemoveSelected={removeSelectedSegments}
toggleSegmentsList={toggleSegmentsList} toggleSegmentsList={toggleSegmentsList}
splitCurrentSegment={splitCurrentSegment} splitCurrentSegment={splitCurrentSegment}

@ -66,7 +66,7 @@ const Segment = memo(({
getFrameCount: GetFrameCount, getFrameCount: GetFrameCount,
updateSegOrder: UseSegments['updateSegOrder'], updateSegOrder: UseSegments['updateSegOrder'],
onClick: (i: number) => void, onClick: (i: number) => void,
onRemovePress: UseSegments['removeCutSegment'], onRemovePress: UseSegments['removeSegment'],
onRemoveSelected: UseSegments['removeSelectedSegments'], onRemoveSelected: UseSegments['removeSelectedSegments'],
onLabelSelectedSegments: UseSegments['labelSelectedSegments'], onLabelSelectedSegments: UseSegments['labelSelectedSegments'],
onReorderPress: (i: number) => Promise<void>, onReorderPress: (i: number) => Promise<void>,
@ -242,7 +242,7 @@ function SegmentList({
updateSegOrder, updateSegOrder,
updateSegOrders, updateSegOrders,
addSegment, addSegment,
removeCutSegment, removeSegment,
onRemoveSelected, onRemoveSelected,
onLabelSegment, onLabelSegment,
currentCutSeg, currentCutSeg,
@ -283,7 +283,7 @@ function SegmentList({
updateSegOrder: UseSegments['updateSegOrder'], updateSegOrder: UseSegments['updateSegOrder'],
updateSegOrders: UseSegments['updateSegOrders'], updateSegOrders: UseSegments['updateSegOrders'],
addSegment: UseSegments['addSegment'], addSegment: UseSegments['addSegment'],
removeCutSegment: UseSegments['removeCutSegment'], removeSegment: UseSegments['removeSegment'],
onRemoveSelected: UseSegments['removeSelectedSegments'], onRemoveSelected: UseSegments['removeSelectedSegments'],
onLabelSegment: UseSegments['labelSegment'], onLabelSegment: UseSegments['labelSegment'],
currentCutSeg: UseSegments['currentCutSeg'], currentCutSeg: UseSegments['currentCutSeg'],
@ -377,8 +377,8 @@ function SegmentList({
size={24} size={24}
style={{ ...buttonBaseStyle, background: cutSegments.length >= 2 ? currentSegColor : neutralButtonColor }} style={{ ...buttonBaseStyle, background: cutSegments.length >= 2 ? currentSegColor : neutralButtonColor }}
role="button" role="button"
title={`${t('Remove segment')} ${currentSegIndex + 1}`} title={t('Remove cutpoint from segment {{segmentNumber}}', { segmentNumber: currentSegIndex + 1 })}
onClick={() => removeCutSegment(currentSegIndex)} onClick={() => removeSegment(currentSegIndex)}
/> />
{!invertCutSegments && !simpleMode && ( {!invertCutSegments && !simpleMode && (
@ -501,7 +501,7 @@ function SegmentList({
onClick={onSegClick} onClick={onSegClick}
addSegment={addSegment} addSegment={addSegment}
onRemoveSelected={onRemoveSelected} onRemoveSelected={onRemoveSelected}
onRemovePress={removeCutSegment} onRemovePress={removeSegment}
onReorderPress={onReorderSegs} onReorderPress={onReorderSegs}
onLabelPress={onLabelSegment} onLabelPress={onLabelSegment}
jumpSegStart={jumpSegStart} jumpSegStart={jumpSegStart}

@ -316,6 +316,10 @@ const KeyboardShortcuts = memo(({
name: t('Add cut segment'), name: t('Add cut segment'),
category: segmentsAndCutpointsCategory, category: segmentsAndCutpointsCategory,
}, },
removeCurrentCutpoint: {
name: t('Remove current segment cutpoint'),
category: segmentsAndCutpointsCategory,
},
removeCurrentSegment: { removeCurrentSegment: {
name: t('Remove current segment'), name: t('Remove current segment'),
category: segmentsAndCutpointsCategory, category: segmentsAndCutpointsCategory,

@ -231,17 +231,26 @@ function useSegments({ filePath, workingRef, setWorking, setProgress, videoStrea
if (newSegments.length === 0) { if (newSegments.length === 0) {
// when removing the last segments, we start over // when removing the last segments, we start over
clearSegColorCounter(); clearSegColorCounter();
return [];
} }
return newSegments; return newSegments;
}); });
}, [clearSegColorCounter, safeSetCutSegments]); }, [clearSegColorCounter, safeSetCutSegments]);
const removeCutSegment = useCallback((index: number) => { const removeSegment = useCallback((index: number, wholeSegment?: true) => {
const seg = cutSegments[index]; const seg = cutSegments[index];
if (seg == null) return; if (seg == null) return;
removeSegments([seg.segId]); if (wholeSegment || seg.end == null) {
}, [cutSegments, removeSegments]); // remove whole segment
removeSegments([seg.segId]);
} else {
// remove end cut point first
safeSetCutSegments((existingSegments) => existingSegments.map((existingSegment, i) => (
i === index ? {
...existingSegment,
end: undefined,
} : existingSegment)));
}
}, [cutSegments, removeSegments, safeSetCutSegments]);
const inverseCutSegments = useMemo(() => { const inverseCutSegments = useMemo(() => {
if (haveInvalidSegs || !isDurationValid(fileDuration)) return []; if (haveInvalidSegs || !isDurationValid(fileDuration)) return [];
@ -739,7 +748,7 @@ function useSegments({ filePath, workingRef, setWorking, setProgress, videoStrea
detectBlackScenes, detectBlackScenes,
detectSilentScenes, detectSilentScenes,
detectSceneChanges, detectSceneChanges,
removeCutSegment, removeSegment,
invertAllSegments, invertAllSegments,
fillSegmentsGaps, fillSegmentsGaps,
combineOverlappingSegments, combineOverlappingSegments,

@ -1,4 +1,4 @@
export type KeyboardAction = 'addSegment' | 'togglePlayResetSpeed' | 'togglePlayNoResetSpeed' | 'reducePlaybackRate' | 'reducePlaybackRateMore' | 'increasePlaybackRate' | 'increasePlaybackRateMore' | 'timelineToggleComfortZoom' | 'seekPreviousFrame' | 'seekNextFrame' | 'captureSnapshot' | 'setCutStart' | 'setCutEnd' | 'removeCurrentSegment' | 'cleanupFilesDialog' | 'splitCurrentSegment' | 'focusSegmentAtCursor' | 'increaseRotation' | 'goToTimecode' | 'seekBackwards' | 'seekBackwards2' | 'seekBackwards3' | 'seekBackwardsPercent' | 'seekBackwardsPercent' | 'seekBackwardsKeyframe' | 'jumpCutStart' | 'seekForwards' | 'seekForwards2' | 'seekForwards3' | 'seekForwardsPercent' | 'seekForwardsPercent' | 'seekForwardsKeyframe' | 'jumpCutEnd' | 'jumpTimelineStart' | 'jumpTimelineEnd' | 'jumpFirstSegment' | 'jumpPrevSegment' | 'jumpSeekFirstSegment' | 'jumpSeekPrevSegment' | 'timelineZoomIn' | 'timelineZoomIn' | 'batchPreviousFile' | 'jumpLastSegment' | 'jumpNextSegment' | 'jumpSeekLastSegment' | 'jumpSeekNextSegment' | 'timelineZoomOut' | 'timelineZoomOut' | 'batchNextFile' | 'batchOpenSelectedFile' | 'batchOpenPreviousFile' | 'batchOpenNextFile' | 'undo' | 'undo' | 'redo' | 'redo' | 'copySegmentsToClipboard' | 'copySegmentsToClipboard' | 'toggleFullscreenVideo' | 'labelCurrentSegment' | 'export' | 'toggleKeyboardShortcuts' | 'closeActiveScreen' | 'increaseVolume' | 'decreaseVolume' | 'toggleMuted' | 'detectBlackScenes' | 'detectSilentScenes' | 'detectSceneChanges' | 'toggleLastCommands' | 'play' | 'pause' | 'reloadFile' | 'html5ify' | 'togglePlayOnlyCurrentSegment' | 'toggleLoopOnlyCurrentSegment' | 'toggleLoopStartEndOnlyCurrentSegment' | 'toggleLoopSelectedSegments' | 'editCurrentSegmentTags' | 'duplicateCurrentSegment' | 'reorderSegsByStartTime' | 'invertAllSegments' | 'fillSegmentsGaps' | 'shiftAllSegmentTimes' | 'alignSegmentTimesToKeyframes' | 'createSegmentsFromKeyframes' | 'createFixedDurationSegments' | 'createNumSegments' | 'createFixedByteSizedSegments' | 'createRandomSegments' | 'shuffleSegments' | 'combineOverlappingSegments' | 'combineSelectedSegments' | 'clearSegments' | 'toggleSegmentsList' | 'selectOnlyCurrentSegment' | 'deselectAllSegments' | 'selectAllSegments' | 'toggleCurrentSegmentSelected' | 'invertSelectedSegments' | 'removeSelectedSegments' | 'toggleStreamsSelector' | 'extractAllStreams' | 'showStreamsSelector' | 'showIncludeExternalStreamsDialog' | 'captureSnapshotAsCoverArt' | 'extractCurrentSegmentFramesAsImages' | 'extractSelectedSegmentsFramesAsImages' | 'convertFormatBatch' | 'convertFormatCurrentFile' | 'fixInvalidDuration' | 'closeBatch' | 'concatBatch' | 'toggleKeyframeCutMode' | 'toggleCaptureFormat' | 'toggleStripAudio' | 'toggleStripThumbnail' | 'setStartTimeOffset' | 'toggleWaveformMode' | 'toggleShowThumbnails' | 'toggleShowKeyframes' | 'toggleSettings' | 'openSendReportDialog' | 'openFilesDialog' | 'openDirDialog' | 'exportYouTube' | 'closeCurrentFile' | 'quit' | 'selectAllMarkers'; export type KeyboardAction = 'addSegment' | 'togglePlayResetSpeed' | 'togglePlayNoResetSpeed' | 'reducePlaybackRate' | 'reducePlaybackRateMore' | 'increasePlaybackRate' | 'increasePlaybackRateMore' | 'timelineToggleComfortZoom' | 'seekPreviousFrame' | 'seekNextFrame' | 'captureSnapshot' | 'setCutStart' | 'setCutEnd' | 'removeCurrentSegment' | 'removeCurrentCutpoint' | 'cleanupFilesDialog' | 'splitCurrentSegment' | 'focusSegmentAtCursor' | 'increaseRotation' | 'goToTimecode' | 'seekBackwards' | 'seekBackwards2' | 'seekBackwards3' | 'seekBackwardsPercent' | 'seekBackwardsPercent' | 'seekBackwardsKeyframe' | 'jumpCutStart' | 'seekForwards' | 'seekForwards2' | 'seekForwards3' | 'seekForwardsPercent' | 'seekForwardsPercent' | 'seekForwardsKeyframe' | 'jumpCutEnd' | 'jumpTimelineStart' | 'jumpTimelineEnd' | 'jumpFirstSegment' | 'jumpPrevSegment' | 'jumpSeekFirstSegment' | 'jumpSeekPrevSegment' | 'timelineZoomIn' | 'timelineZoomIn' | 'batchPreviousFile' | 'jumpLastSegment' | 'jumpNextSegment' | 'jumpSeekLastSegment' | 'jumpSeekNextSegment' | 'timelineZoomOut' | 'timelineZoomOut' | 'batchNextFile' | 'batchOpenSelectedFile' | 'batchOpenPreviousFile' | 'batchOpenNextFile' | 'undo' | 'undo' | 'redo' | 'redo' | 'copySegmentsToClipboard' | 'copySegmentsToClipboard' | 'toggleFullscreenVideo' | 'labelCurrentSegment' | 'export' | 'toggleKeyboardShortcuts' | 'closeActiveScreen' | 'increaseVolume' | 'decreaseVolume' | 'toggleMuted' | 'detectBlackScenes' | 'detectSilentScenes' | 'detectSceneChanges' | 'toggleLastCommands' | 'play' | 'pause' | 'reloadFile' | 'html5ify' | 'togglePlayOnlyCurrentSegment' | 'toggleLoopOnlyCurrentSegment' | 'toggleLoopStartEndOnlyCurrentSegment' | 'toggleLoopSelectedSegments' | 'editCurrentSegmentTags' | 'duplicateCurrentSegment' | 'reorderSegsByStartTime' | 'invertAllSegments' | 'fillSegmentsGaps' | 'shiftAllSegmentTimes' | 'alignSegmentTimesToKeyframes' | 'createSegmentsFromKeyframes' | 'createFixedDurationSegments' | 'createNumSegments' | 'createFixedByteSizedSegments' | 'createRandomSegments' | 'shuffleSegments' | 'combineOverlappingSegments' | 'combineSelectedSegments' | 'clearSegments' | 'toggleSegmentsList' | 'selectOnlyCurrentSegment' | 'deselectAllSegments' | 'selectAllSegments' | 'toggleCurrentSegmentSelected' | 'invertSelectedSegments' | 'removeSelectedSegments' | 'toggleStreamsSelector' | 'extractAllStreams' | 'showStreamsSelector' | 'showIncludeExternalStreamsDialog' | 'captureSnapshotAsCoverArt' | 'extractCurrentSegmentFramesAsImages' | 'extractSelectedSegmentsFramesAsImages' | 'convertFormatBatch' | 'convertFormatCurrentFile' | 'fixInvalidDuration' | 'closeBatch' | 'concatBatch' | 'toggleKeyframeCutMode' | 'toggleCaptureFormat' | 'toggleStripAudio' | 'toggleStripThumbnail' | 'setStartTimeOffset' | 'toggleWaveformMode' | 'toggleShowThumbnails' | 'toggleShowKeyframes' | 'toggleSettings' | 'openSendReportDialog' | 'openFilesDialog' | 'openDirDialog' | 'exportYouTube' | 'closeCurrentFile' | 'quit' | 'selectAllMarkers';
export interface KeyBinding { export interface KeyBinding {
keys: string, keys: string,

Loading…
Cancel
Save