Skip to content

Commit adfd1b3

Browse files
committed
[*] refactor video editor
1 parent 20f7764 commit adfd1b3

File tree

1 file changed

+58
-1
lines changed

1 file changed

+58
-1
lines changed

lib/video-editor/src/commands/segment.rs

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use super::command::{AffectedSegments, Command};
22
use crate::{
33
Error, Result,
4+
filters::traits::{
5+
AudioFilterWrapper, ImageFilterWrapper, SubtitleFilterWrapper, VideoFilterWrapper,
6+
},
47
tracks::track::Track,
58
tracks::{manager::Manager, segment::Segment},
69
};
@@ -1720,6 +1723,11 @@ pub struct MergeSegmentsCommand {
17201723
// For undo
17211724
original_first_duration: Option<Duration>,
17221725
removed_second_segment: Option<Arc<Segment>>,
1726+
// Save entire filter lists for undo (not just counts)
1727+
original_video_filters: Option<Vec<Arc<VideoFilterWrapper>>>,
1728+
original_audio_filters: Option<Vec<Arc<AudioFilterWrapper>>>,
1729+
original_subtitle_filters: Option<Vec<Arc<SubtitleFilterWrapper>>>,
1730+
original_image_filters: Option<Vec<Arc<ImageFilterWrapper>>>,
17231731

17241732
// Shift info for undo
17251733
shift_amount: Option<Duration>,
@@ -1738,6 +1746,10 @@ impl MergeSegmentsCommand {
17381746
second_segment_index,
17391747
original_first_duration: None,
17401748
removed_second_segment: None,
1749+
original_video_filters: None,
1750+
original_audio_filters: None,
1751+
original_subtitle_filters: None,
1752+
original_image_filters: None,
17411753
shift_amount: None,
17421754
shifted_from_index: 0,
17431755
}
@@ -1779,6 +1791,10 @@ impl Command for MergeSegmentsCommand {
17791791
// Save original state for undo
17801792
self.original_first_duration = Some(first_segment.duration);
17811793
self.removed_second_segment = Some(second_segment.clone());
1794+
self.original_video_filters = Some(first_segment.video_filters.clone());
1795+
self.original_audio_filters = Some(first_segment.audio_filters.clone());
1796+
self.original_subtitle_filters = Some(first_segment.subtitle_filters.clone());
1797+
self.original_image_filters = Some(first_segment.image_filters.clone());
17821798

17831799
// Calculate new duration based on source positions
17841800
// Merged segment covers from first_segment.source_offset to end of second_segment in source
@@ -1795,8 +1811,18 @@ impl Command for MergeSegmentsCommand {
17951811
self.shift_amount = Some(new_duration - original_total);
17961812
}
17971813

1814+
// Clone second segment's filters for merging (before removing the segment)
1815+
let second_video_filters = second_segment.video_filters.clone();
1816+
let second_audio_filters = second_segment.audio_filters.clone();
1817+
let second_subtitle_filters = second_segment.subtitle_filters.clone();
1818+
let second_image_filters = second_segment.image_filters.clone();
1819+
17981820
track.modify_segment(self.first_segment_index, |segment| {
17991821
segment.duration = new_duration;
1822+
merge_filters_dedup_video(&mut segment.video_filters, &second_video_filters);
1823+
merge_filters_dedup_audio(&mut segment.audio_filters, &second_audio_filters);
1824+
merge_filters_dedup_subtitle(&mut segment.subtitle_filters, &second_subtitle_filters);
1825+
merge_filters_dedup_image(&mut segment.image_filters, &second_image_filters);
18001826
})?;
18011827

18021828
track.remove_segment_leave_gap(self.second_segment_index)?;
@@ -1815,10 +1841,21 @@ impl Command for MergeSegmentsCommand {
18151841
fn undo(&mut self, manager: &mut Manager) -> Result<()> {
18161842
let track = get_track_from_manager(manager, self.track_index)?;
18171843

1818-
// Restore first segment's original duration
18191844
if let Some(original_duration) = self.original_first_duration {
18201845
track.modify_segment(self.first_segment_index, |segment| {
18211846
segment.duration = original_duration;
1847+
if let Some(filters) = self.original_video_filters.take() {
1848+
segment.video_filters = filters;
1849+
}
1850+
if let Some(filters) = self.original_audio_filters.take() {
1851+
segment.audio_filters = filters;
1852+
}
1853+
if let Some(filters) = self.original_subtitle_filters.take() {
1854+
segment.subtitle_filters = filters;
1855+
}
1856+
if let Some(filters) = self.original_image_filters.take() {
1857+
segment.image_filters = filters;
1858+
}
18221859
})?;
18231860
}
18241861

@@ -1861,3 +1898,23 @@ impl Command for MergeSegmentsCommand {
18611898
affected
18621899
}
18631900
}
1901+
1902+
macro_rules! impl_merge_filters_dedup {
1903+
($fn_name:ident, $wrapper_type:ty) => {
1904+
fn $fn_name(target: &mut Vec<Arc<$wrapper_type>>, source: &[Arc<$wrapper_type>]) {
1905+
for source_filter in source {
1906+
let is_duplicate = target
1907+
.iter()
1908+
.any(|target_filter| target_filter.inner.name() == source_filter.inner.name());
1909+
if !is_duplicate {
1910+
target.push(source_filter.clone());
1911+
}
1912+
}
1913+
}
1914+
};
1915+
}
1916+
1917+
impl_merge_filters_dedup!(merge_filters_dedup_video, VideoFilterWrapper);
1918+
impl_merge_filters_dedup!(merge_filters_dedup_audio, AudioFilterWrapper);
1919+
impl_merge_filters_dedup!(merge_filters_dedup_subtitle, SubtitleFilterWrapper);
1920+
impl_merge_filters_dedup!(merge_filters_dedup_image, ImageFilterWrapper);

0 commit comments

Comments
 (0)