kopia lustrzana https://github.com/mifi/lossless-cut
Add merge+segments option #480
rodzic
f9ce69ee5f
commit
95db959f5b
|
@ -606,8 +606,6 @@ const App = memo(() => {
|
|||
return newVal;
|
||||
}), [hideAllNotifications, setKeyframeCut]);
|
||||
|
||||
const toggleAutoMerge = useCallback(() => setAutoMerge(val => !val), [setAutoMerge]);
|
||||
|
||||
const togglePreserveMovData = useCallback(() => setPreserveMovData((val) => !val), [setPreserveMovData]);
|
||||
|
||||
const toggleMovFastStart = useCallback(() => setMovFastStart((val) => !val), [setMovFastStart]);
|
||||
|
@ -2260,7 +2258,7 @@ const App = memo(() => {
|
|||
</div>
|
||||
</motion.div>
|
||||
|
||||
<ExportConfirm filePath={filePath} autoMerge={autoMerge} toggleAutoMerge={toggleAutoMerge} areWeCutting={areWeCutting} outSegments={outSegments} visible={exportConfirmVisible} onClosePress={closeExportConfirm} onExportConfirm={onExportConfirm} keyframeCut={keyframeCut} toggleKeyframeCut={toggleKeyframeCut} renderOutFmt={renderOutFmt} preserveMovData={preserveMovData} togglePreserveMovData={togglePreserveMovData} movFastStart={movFastStart} toggleMovFastStart={toggleMovFastStart} avoidNegativeTs={avoidNegativeTs} setAvoidNegativeTs={setAvoidNegativeTs} changeOutDir={changeOutDir} outputDir={outputDir} numStreamsTotal={numStreamsTotal} numStreamsToCopy={numStreamsToCopy} setStreamsSelectorShown={setStreamsSelectorShown} currentSegIndex={currentSegIndexSafe} invertCutSegments={invertCutSegments} exportConfirmEnabled={exportConfirmEnabled} toggleExportConfirmEnabled={toggleExportConfirmEnabled} segmentsToChapters={segmentsToChapters} toggleSegmentsToChapters={toggleSegmentsToChapters} outFormat={fileFormat} preserveMetadataOnMerge={preserveMetadataOnMerge} togglePreserveMetadataOnMerge={togglePreserveMetadataOnMerge} setOutSegTemplate={setOutSegTemplate} outSegTemplate={outSegTemplateOrDefault} generateOutSegFileNames={generateOutSegFileNames} currentSegIndexSafe={currentSegIndexSafe} isOutSegFileNamesValid={isOutSegFileNamesValid} />
|
||||
<ExportConfirm filePath={filePath} autoMerge={autoMerge} setAutoMerge={setAutoMerge} areWeCutting={areWeCutting} outSegments={outSegments} visible={exportConfirmVisible} onClosePress={closeExportConfirm} onExportConfirm={onExportConfirm} keyframeCut={keyframeCut} toggleKeyframeCut={toggleKeyframeCut} renderOutFmt={renderOutFmt} preserveMovData={preserveMovData} togglePreserveMovData={togglePreserveMovData} movFastStart={movFastStart} toggleMovFastStart={toggleMovFastStart} avoidNegativeTs={avoidNegativeTs} setAvoidNegativeTs={setAvoidNegativeTs} changeOutDir={changeOutDir} outputDir={outputDir} numStreamsTotal={numStreamsTotal} numStreamsToCopy={numStreamsToCopy} setStreamsSelectorShown={setStreamsSelectorShown} currentSegIndex={currentSegIndexSafe} invertCutSegments={invertCutSegments} exportConfirmEnabled={exportConfirmEnabled} toggleExportConfirmEnabled={toggleExportConfirmEnabled} segmentsToChapters={segmentsToChapters} toggleSegmentsToChapters={toggleSegmentsToChapters} outFormat={fileFormat} preserveMetadataOnMerge={preserveMetadataOnMerge} togglePreserveMetadataOnMerge={togglePreserveMetadataOnMerge} setOutSegTemplate={setOutSegTemplate} outSegTemplate={outSegTemplateOrDefault} generateOutSegFileNames={generateOutSegFileNames} currentSegIndexSafe={currentSegIndexSafe} isOutSegFileNamesValid={isOutSegFileNamesValid} autoDeleteMergedSegments={autoDeleteMergedSegments} setAutoDeleteMergedSegments={setAutoDeleteMergedSegments} />
|
||||
|
||||
<HelpSheet
|
||||
visible={helpVisible}
|
||||
|
|
|
@ -41,11 +41,11 @@ const HelpIcon = ({ onClick }) => <IoIosHelpCircle size={20} role="button" onCli
|
|||
|
||||
const ExportConfirm = memo(({
|
||||
autoMerge, areWeCutting, outSegments, visible, onClosePress, onExportConfirm, keyframeCut, toggleKeyframeCut,
|
||||
toggleAutoMerge, renderOutFmt, preserveMovData, togglePreserveMovData, movFastStart, toggleMovFastStart, avoidNegativeTs, setAvoidNegativeTs,
|
||||
setAutoMerge, renderOutFmt, preserveMovData, togglePreserveMovData, movFastStart, toggleMovFastStart, avoidNegativeTs, setAvoidNegativeTs,
|
||||
changeOutDir, outputDir, numStreamsTotal, numStreamsToCopy, setStreamsSelectorShown, currentSegIndex, invertCutSegments,
|
||||
exportConfirmEnabled, toggleExportConfirmEnabled, segmentsToChapters, toggleSegmentsToChapters, outFormat,
|
||||
preserveMetadataOnMerge, togglePreserveMetadataOnMerge, outSegTemplate, setOutSegTemplate, generateOutSegFileNames,
|
||||
filePath, currentSegIndexSafe, isOutSegFileNamesValid,
|
||||
filePath, currentSegIndexSafe, isOutSegFileNamesValid, autoDeleteMergedSegments, setAutoDeleteMergedSegments,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
|
@ -118,7 +118,7 @@ const ExportConfirm = memo(({
|
|||
<div style={boxStyle}>
|
||||
<h2 style={{ marginTop: 0 }}>{t('Export options')}</h2>
|
||||
<ul>
|
||||
{outSegments.length >= 2 && <li>{t('Merge {{segments}} cut segments to one file?', { segments: outSegments.length })} <MergeExportButton autoMerge={autoMerge} outSegments={outSegments} toggleAutoMerge={toggleAutoMerge} /></li>}
|
||||
{outSegments.length >= 2 && <li>{t('Merge {{segments}} cut segments to one file?', { segments: outSegments.length })} <MergeExportButton autoMerge={autoMerge} outSegments={outSegments} setAutoMerge={setAutoMerge} autoDeleteMergedSegments={autoDeleteMergedSegments} setAutoDeleteMergedSegments={setAutoDeleteMergedSegments} /></li>}
|
||||
<li>
|
||||
{t('Output container format:')} {renderOutFmt({ height: 20, maxWidth: 150 })}
|
||||
<HelpIcon onClick={onOutFmtHelpPress} />
|
||||
|
|
|
@ -6,19 +6,55 @@ import { MdCallSplit, MdCallMerge } from 'react-icons/md';
|
|||
import { withBlur } from '../util';
|
||||
|
||||
|
||||
const MergeExportButton = memo(({ autoMerge, outSegments, toggleAutoMerge }) => {
|
||||
const MergeExportButton = memo(({ autoMerge, outSegments, setAutoMerge, autoDeleteMergedSegments, setAutoDeleteMergedSegments }) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const AutoMergeIcon = autoMerge ? MdCallMerge : MdCallSplit;
|
||||
|
||||
let effectiveMode;
|
||||
let title;
|
||||
let description;
|
||||
if (autoMerge && autoDeleteMergedSegments) {
|
||||
effectiveMode = 'merge';
|
||||
title = t('Merge cuts');
|
||||
description = t('Auto merge segments to one file after export');
|
||||
} else if (autoMerge) {
|
||||
effectiveMode = 'merge+separate';
|
||||
title = t('Merge & Separate');
|
||||
description = t('Auto merge segments to one file after export, but keep segments too');
|
||||
} else {
|
||||
effectiveMode = 'separate';
|
||||
title = t('Separate files');
|
||||
description = t('Export to separate files');
|
||||
}
|
||||
|
||||
function onClick() {
|
||||
switch (effectiveMode) {
|
||||
case 'merge': {
|
||||
setAutoDeleteMergedSegments(false);
|
||||
break;
|
||||
}
|
||||
case 'merge+separate': {
|
||||
setAutoMerge(false);
|
||||
break;
|
||||
}
|
||||
case 'separate': {
|
||||
setAutoMerge(true);
|
||||
setAutoDeleteMergedSegments(true);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Button
|
||||
height={20}
|
||||
style={{ opacity: outSegments && outSegments.length < 2 ? 0.4 : undefined }}
|
||||
title={autoMerge ? t('Auto merge segments to one file after export') : t('Export to separate files')}
|
||||
onClick={withBlur(toggleAutoMerge)}
|
||||
title={description}
|
||||
onClick={withBlur(onClick)}
|
||||
>
|
||||
<AutoMergeIcon /> {autoMerge ? t('Merge cuts') : t('Separate files')}
|
||||
<AutoMergeIcon /> {title}
|
||||
</Button>
|
||||
);
|
||||
});
|
||||
|
|
Ładowanie…
Reference in New Issue