1
0
mirror of https://github.com/mifi/lossless-cut.git synced 2024-11-22 02:12:30 +01:00

add keyboard actions:

- Show waveform
- Show thumbnails
- Show keyframes

https://github.com/mifi/lossless-cut/issues/254#issuecomment-1604063833
This commit is contained in:
Mikael Finstad 2023-12-22 14:13:09 +08:00
parent f4249c7d61
commit 7173564c41
No known key found for this signature in database
GPG Key ID: 25AB36E3E81CBC26
3 changed files with 27 additions and 12 deletions

View File

@ -214,7 +214,7 @@ const App = memo(() => {
} }
}, [detectedFileFormat, outFormatLocked, setFileFormat, setOutFormatLocked]); }, [detectedFileFormat, outFormatLocked, setFileFormat, setOutFormatLocked]);
const toggleEnableThumbnails = useCallback(() => setThumbnailsEnabled((v) => !v), []); const toggleShowThumbnails = useCallback(() => setThumbnailsEnabled((v) => !v), []);
const toggleExportConfirmEnabled = useCallback(() => setExportConfirmEnabled((v) => { const toggleExportConfirmEnabled = useCallback(() => setExportConfirmEnabled((v) => {
const newVal = !v; const newVal = !v;
@ -226,7 +226,7 @@ const App = memo(() => {
const togglePreserveMetadataOnMerge = useCallback(() => setPreserveMetadataOnMerge((v) => !v), [setPreserveMetadataOnMerge]); const togglePreserveMetadataOnMerge = useCallback(() => setPreserveMetadataOnMerge((v) => !v), [setPreserveMetadataOnMerge]);
const toggleKeyframesEnabled = useCallback(() => { const toggleShowKeyframes = useCallback(() => {
setKeyframesEnabled((old) => { setKeyframesEnabled((old) => {
const enabled = !old; const enabled = !old;
if (enabled && !calcShouldShowKeyframes(zoomedDuration)) { if (enabled && !calcShouldShowKeyframes(zoomedDuration)) {
@ -2024,8 +2024,11 @@ const App = memo(() => {
detectSilentScenes, detectSilentScenes,
detectSceneChanges, detectSceneChanges,
createSegmentsFromKeyframes, createSegmentsFromKeyframes,
toggleWaveformMode,
toggleShowThumbnails,
toggleShowKeyframes,
}; };
}, [addSegment, alignSegmentTimesToKeyframes, apparentCutSegments, askStartTimeOffset, batchFileJump, batchOpenSelectedFile, captureSnapshot, captureSnapshotAsCoverArt, changePlaybackRate, checkFileOpened, cleanupFilesDialog, clearSegments, closeBatch, closeFileWithConfirm, combineOverlappingSegments, combineSelectedSegments, concatBatch, convertFormatBatch, copySegmentsToClipboard, createFixedDurationSegments, createNumSegments, createRandomSegments, createSegmentsFromKeyframes, currentSegIndexSafe, cutSegmentsHistory, deselectAllSegments, detectBlackScenes, detectSceneChanges, detectSilentScenes, duplicateCurrentSegment, extractAllStreams, extractCurrentSegmentFramesAsImages, extractSelectedSegmentsFramesAsImages, fillSegmentsGaps, goToTimecode, handleShowStreamsSelectorClick, increaseRotation, invertAllSegments, invertSelectedSegments, jumpCutEnd, jumpCutStart, jumpSeg, jumpTimelineEnd, jumpTimelineStart, keyboardNormalSeekSpeed, keyboardSeekAccFactor, onExportPress, onLabelSegment, openFilesDialog, openSendReportDialogWithState, pause, play, removeCutSegment, removeSelectedSegments, reorderSegsByStartTime, seekClosestKeyframe, seekRel, seekRelPercent, selectAllSegments, selectOnlyCurrentSegment, setCutEnd, setCutStart, setPlaybackVolume, shiftAllSegmentTimes, shortStep, shuffleSegments, splitCurrentSegment, timelineToggleComfortZoom, toggleCaptureFormat, toggleCurrentSegmentSelected, toggleKeyboardShortcuts, toggleKeyframeCut, toggleLastCommands, toggleLoopSelectedSegments, togglePlay, toggleSegmentsList, toggleSettings, toggleStreamsSelector, toggleStripAudio, tryFixInvalidDuration, userHtml5ifyCurrentFile, zoomRel]); }, [addSegment, alignSegmentTimesToKeyframes, apparentCutSegments, askStartTimeOffset, batchFileJump, batchOpenSelectedFile, captureSnapshot, captureSnapshotAsCoverArt, changePlaybackRate, checkFileOpened, cleanupFilesDialog, clearSegments, closeBatch, closeFileWithConfirm, combineOverlappingSegments, combineSelectedSegments, concatBatch, convertFormatBatch, copySegmentsToClipboard, createFixedDurationSegments, createNumSegments, createRandomSegments, createSegmentsFromKeyframes, currentSegIndexSafe, cutSegmentsHistory, deselectAllSegments, detectBlackScenes, detectSceneChanges, detectSilentScenes, duplicateCurrentSegment, extractAllStreams, extractCurrentSegmentFramesAsImages, extractSelectedSegmentsFramesAsImages, fillSegmentsGaps, goToTimecode, handleShowStreamsSelectorClick, increaseRotation, invertAllSegments, invertSelectedSegments, jumpCutEnd, jumpCutStart, jumpSeg, jumpTimelineEnd, jumpTimelineStart, keyboardNormalSeekSpeed, keyboardSeekAccFactor, onExportPress, onLabelSegment, openFilesDialog, openSendReportDialogWithState, pause, play, removeCutSegment, removeSelectedSegments, reorderSegsByStartTime, seekClosestKeyframe, seekRel, seekRelPercent, selectAllSegments, selectOnlyCurrentSegment, setCutEnd, setCutStart, setPlaybackVolume, shiftAllSegmentTimes, shortStep, shuffleSegments, splitCurrentSegment, timelineToggleComfortZoom, toggleCaptureFormat, toggleCurrentSegmentSelected, toggleKeyboardShortcuts, toggleKeyframeCut, toggleShowKeyframes, toggleLastCommands, toggleLoopSelectedSegments, togglePlay, toggleSegmentsList, toggleSettings, toggleShowThumbnails, toggleStreamsSelector, toggleStripAudio, toggleWaveformMode, tryFixInvalidDuration, userHtml5ifyCurrentFile, zoomRel]);
const getKeyboardAction = useCallback((action) => mainActions[action], [mainActions]); const getKeyboardAction = useCallback((action) => mainActions[action], [mainActions]);
@ -2190,7 +2193,7 @@ const App = memo(() => {
const actionsWithArgs = { const actionsWithArgs = {
openFiles: (filePaths) => { userOpenFiles(filePaths.map(resolvePathIfNeeded)); }, openFiles: (filePaths) => { userOpenFiles(filePaths.map(resolvePathIfNeeded)); },
// todo separate actions per type and move them into mainActions? // todo separate actions per type and move them into mainActions? https://github.com/mifi/lossless-cut/issues/254#issuecomment-932649424
importEdlFile, importEdlFile,
exportEdlFile: tryExportEdlFile, exportEdlFile: tryExportEdlFile,
}; };
@ -2494,12 +2497,12 @@ const App = memo(() => {
seekClosestKeyframe={seekClosestKeyframe} seekClosestKeyframe={seekClosestKeyframe}
togglePlay={togglePlay} togglePlay={togglePlay}
showThumbnails={showThumbnails} showThumbnails={showThumbnails}
toggleEnableThumbnails={toggleEnableThumbnails} toggleShowThumbnails={toggleShowThumbnails}
toggleWaveformMode={toggleWaveformMode} toggleWaveformMode={toggleWaveformMode}
waveformMode={waveformMode} waveformMode={waveformMode}
hasAudio={hasAudio} hasAudio={hasAudio}
keyframesEnabled={keyframesEnabled} keyframesEnabled={keyframesEnabled}
toggleKeyframesEnabled={toggleKeyframesEnabled} toggleShowKeyframes={toggleShowKeyframes}
detectedFps={detectedFps} detectedFps={detectedFps}
toggleLoopSelectedSegments={toggleLoopSelectedSegments} toggleLoopSelectedSegments={toggleLoopSelectedSegments}
isFileOpened={isFileOpened} isFileOpened={isFileOpened}

View File

@ -142,9 +142,9 @@ const BottomBar = memo(({
setCurrentSegIndex, setCurrentSegIndex,
jumpTimelineStart, jumpTimelineEnd, jumpCutEnd, jumpCutStart, startTimeOffset, setCutTime, currentApparentCutSeg, jumpTimelineStart, jumpTimelineEnd, jumpCutEnd, jumpCutStart, startTimeOffset, setCutTime, currentApparentCutSeg,
playing, shortStep, togglePlay, toggleLoopSelectedSegments, hasAudio, playing, shortStep, togglePlay, toggleLoopSelectedSegments, hasAudio,
keyframesEnabled, toggleKeyframesEnabled, seekClosestKeyframe, detectedFps, isFileOpened, selectedSegments, keyframesEnabled, toggleShowKeyframes, seekClosestKeyframe, detectedFps, isFileOpened, selectedSegments,
darkMode, setDarkMode, darkMode, setDarkMode,
toggleEnableThumbnails, toggleWaveformMode, waveformMode, showThumbnails, toggleShowThumbnails, toggleWaveformMode, waveformMode, showThumbnails,
outputPlaybackRate, setOutputPlaybackRate, outputPlaybackRate, setOutputPlaybackRate,
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -249,7 +249,7 @@ const BottomBar = memo(({
style={{ padding: '0 .2em', color: showThumbnails ? primaryTextColor : undefined }} style={{ padding: '0 .2em', color: showThumbnails ? primaryTextColor : undefined }}
role="button" role="button"
title={t('Show thumbnails')} title={t('Show thumbnails')}
onClick={toggleEnableThumbnails} onClick={toggleShowThumbnails}
/> />
<FaKey <FaKey
@ -257,7 +257,7 @@ const BottomBar = memo(({
style={{ padding: '0 .2em', color: keyframesEnabled ? primaryTextColor : undefined }} style={{ padding: '0 .2em', color: keyframesEnabled ? primaryTextColor : undefined }}
role="button" role="button"
title={t('Show keyframes')} title={t('Show keyframes')}
onClick={toggleKeyframesEnabled} onClick={toggleShowKeyframes}
/> />
</> </>
)} )}

View File

@ -524,6 +524,18 @@ const KeyboardShortcuts = memo(({
name: t('Copy selected segments times to clipboard'), name: t('Copy selected segments times to clipboard'),
category: otherCategory, category: otherCategory,
}, },
toggleWaveformMode: {
name: t('Show waveform'),
category: otherCategory,
},
toggleShowThumbnails: {
name: t('Show thumbnails'),
category: otherCategory,
},
toggleShowKeyframes: {
name: t('Show keyframes'),
category: otherCategory,
},
toggleSettings: { toggleSettings: {
name: t('Settings'), name: t('Settings'),
category: otherCategory, category: otherCategory,
@ -614,8 +626,8 @@ const KeyboardShortcuts = memo(({
}); });
}, [setKeyBindings]); }, [setKeyBindings]);
const missingAction = Object.keys(mainActions).find((key) => actionsMap[key] == null); const missingActions = Object.keys(mainActions).filter((key) => actionsMap[key] == null);
if (missingAction) throw new Error(`Action missing: ${missingAction}`); if (missingActions.length > 0) throw new Error(`Action(s) missing: ${missingActions.join(',')}`);
return ( return (
<> <>