diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index d8a7a0d58..9f023d263 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -17,6 +17,9 @@
"delete-button": "Delete",
"delete-restore-tooltip": "Mark or unmark the segment at the current position as to be deleted. Hotkey: {{hotkeyName}}",
"delete-restore-tooltip-aria": "Delete and Restore. Mark or unmark the segment at the current position as to be deleted. Hotkey: {{hotKeyName}}.",
+ "merge-all-button": "Merge All",
+ "merge-all-tooltip": "Combine all segments into a single segment.",
+ "merge-all-tooltip-aria": "Merge All. Combine all segments into a single segment.",
"restore-button": "Restore",
"mergeLeft-button": "Merge Left",
"mergeLeft-tooltip": "Combine the currently active segment with the segment to its left. Hotkey: {{hotkeyName}}",
diff --git a/src/main/CuttingActions.tsx b/src/main/CuttingActions.tsx
index e46c097de..680118066 100644
--- a/src/main/CuttingActions.tsx
+++ b/src/main/CuttingActions.tsx
@@ -3,14 +3,14 @@ import React, { SyntheticEvent } from "react";
import { basicButtonStyle, customIconStyle } from '../cssStyles'
import { IconType } from "react-icons";
-import { LuScissors, LuChevronLeft, LuChevronRight, LuTrash} from "react-icons/lu";
+import { LuScissors, LuChevronLeft, LuChevronRight, LuTrash, LuMoveHorizontal} from "react-icons/lu";
import { ReactComponent as TrashRestore } from '../img/trash-restore.svg';
import { css } from '@emotion/react'
import { useDispatch, useSelector } from 'react-redux';
import {
- cut, markAsDeletedOrAlive, selectIsCurrentSegmentAlive, mergeLeft, mergeRight
+ cut, markAsDeletedOrAlive, selectIsCurrentSegmentAlive, mergeLeft, mergeRight, mergeAll
} from '../redux/videoSlice'
import { GlobalHotKeys, KeySequence, KeyMapOptions } from "react-hotkeys";
import { cuttingKeyMap } from "../globalKeys";
@@ -91,6 +91,12 @@ const CuttingActions: React.FC = () => {
tooltip={t('cuttingActions.mergeRight-tooltip', { hotkeyName: (cuttingKeyMap[handlers.mergeRight.name] as KeyMapOptions).sequence })}
ariaLabelText={t('cuttingActions.mergeRight-tooltip-aria', { hotkeyName: (cuttingKeyMap[handlers.mergeRight.name] as KeyMapOptions).sequence })}
/>
+
+
{/* {
+ mergeSegments(state, state.activeSegmentIndex, 0)
+ mergeSegments(state, state.activeSegmentIndex, state.segments.length - 1)
+ state.hasChanges = true
+ },
},
// For Async Requests
extraReducers: builder => {
@@ -258,22 +263,25 @@ export const parseSegments = (segments: Segment[], duration: number) => {
}
/**
- * Helper function for merging two segments
+ * Helper function for merging segments
*/
-const mergeSegments = (state: video, activeSegmentIndex: number, mergeSegmentIndex: number) => {
+const mergeSegments = (state: video, startSegmentIndex: number, endSegmentIndex: number) => {
// Check if mergeSegmentIndex is valid
- if (mergeSegmentIndex < 0 || mergeSegmentIndex > state.segments.length - 1) {
+ if (endSegmentIndex < 0 || endSegmentIndex > state.segments.length - 1) {
return
}
// Increase activeSegment length
- state.segments[activeSegmentIndex].start = Math.min(
- state.segments[activeSegmentIndex].start, state.segments[mergeSegmentIndex].start)
- state.segments[activeSegmentIndex].end = Math.max(
- state.segments[activeSegmentIndex].end, state.segments[mergeSegmentIndex].end)
+ state.segments[startSegmentIndex].start = Math.min(
+ state.segments[startSegmentIndex].start, state.segments[endSegmentIndex].start)
+ state.segments[startSegmentIndex].end = Math.max(
+ state.segments[startSegmentIndex].end, state.segments[endSegmentIndex].end)
- // Remove the other segment
- state.segments.splice(mergeSegmentIndex, 1);
+ // Remove the end segment and segments between
+ state.segments.splice(
+ startSegmentIndex < endSegmentIndex ? startSegmentIndex + 1 : endSegmentIndex,
+ Math.abs(endSegmentIndex - startSegmentIndex)
+ );
// Update active segment
updateActiveSegment(state)
@@ -336,7 +344,7 @@ const setThumbnailHelper = (state: video, id: Track["id"], uri: Track["thumbnail
export const { setTrackEnabled, setIsPlaying, setIsPlayPreview, setCurrentlyAt, setCurrentlyAtInSeconds,
addSegment, setAspectRatio, setHasChanges, setWaveformImages, setThumbnails, setThumbnail, removeThumbnail,
- cut, markAsDeletedOrAlive, setSelectedWorkflowIndex, mergeLeft, mergeRight, setPreviewTriggered,
+ cut, markAsDeletedOrAlive, setSelectedWorkflowIndex, mergeLeft, mergeRight, mergeAll, setPreviewTriggered,
setClickTriggered } = videoSlice.actions
// Export selectors