11use super :: command:: { AffectedSegments , Command } ;
22use 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