@@ -369,7 +369,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
369369 CopySelectedLayers => {
370370 let paths = self . selected_layers_sorted ( ) ;
371371 self . copy_buffer . clear ( ) ;
372- for path in paths {
372+ for path in paths. iter ( ) . rev ( ) {
373373 match self . active_document ( ) . document . layer ( & path) . map ( |t| t. clone ( ) ) {
374374 Ok ( layer) => {
375375 self . copy_buffer . push ( layer) ;
@@ -590,18 +590,41 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
590590 }
591591 ReorderSelectedLayers ( relative_positon) => {
592592 let all_layer_paths = self . all_layers_sorted ( ) ;
593- let non_selected_layers = self . non_selected_layers_sorted ( ) ;
594- if let Some ( insert_path) = all_layer_paths
595- . iter ( )
596- . position ( |path| self . layerdata ( & path) . selected )
597- . map ( |pos| non_selected_layers. get ( ( pos as i64 + relative_positon as i64 ) . clamp ( 0 , all_layer_paths. len ( ) as i64 - 1 ) as usize ) )
598- . flatten ( )
599- {
600- log:: debug!( "inserting at {:?}" , insert_path) ;
601- let ( id, path) = insert_path. split_last ( ) . expect ( "Can't move the root folder" ) ;
602- if let Some ( folder) = self . active_document ( ) . document . document_layer ( path) . ok ( ) . map ( |layer| layer. as_folder ( ) . ok ( ) ) . flatten ( ) {
603- let insert_index = folder. position_of_layer ( * id) . unwrap ( ) as isize ;
604- responses. push_back ( DocumentMessage :: MoveSelectedLayersTo { path : path. to_vec ( ) , insert_index } . into ( ) )
593+ let selected_layers = self . selected_layers_sorted ( ) ;
594+ let pivot = match relative_positon. signum ( ) {
595+ -1 => selected_layers. first ( ) ,
596+ 1 => selected_layers. last ( ) ,
597+ _ => unreachable ! ( ) ,
598+ }
599+ . expect ( "called move layers with an empty selection" ) ;
600+ if let Some ( pos) = all_layer_paths. iter ( ) . position ( |path| path == pivot) {
601+ log:: debug!( "pos {:?}" , pos) ;
602+ let max = all_layer_paths. len ( ) as i64 - selected_layers. len ( ) as i64 ;
603+ log:: debug!( "max {:?}" , max) ;
604+ log:: debug!( "relative_positon {:?}" , relative_positon) ;
605+ log:: debug!( "all_layer_paths: {:?}" , all_layer_paths) ;
606+ let insert_pos = ( pos as i64 + relative_positon as i64 ) . clamp ( 0 , max) as usize ;
607+ log:: debug!( "inser_pos {:?}" , insert_pos) ;
608+ let insert = all_layer_paths. get ( insert_pos) ;
609+ if let Some ( insert_path) = insert {
610+ log:: debug!( "inserting at {:?}" , insert_path) ;
611+ let ( id, path) = insert_path. split_last ( ) . expect ( "Can't move the root folder" ) ;
612+ if let Some ( folder) = self . active_document ( ) . document . document_layer ( path) . ok ( ) . map ( |layer| layer. as_folder ( ) . ok ( ) ) . flatten ( ) {
613+ // TODO: Ignore existing thingsin folder
614+ //
615+ let selected: Vec < _ > = selected_layers
616+ . iter ( )
617+ . filter ( |layer| layer. starts_with ( path) && layer. len ( ) == path. len ( ) + 1 )
618+ . map ( |x| x. last ( ) . unwrap ( ) )
619+ . collect ( ) ;
620+ log:: debug!( "selected {:?}" , selected) ;
621+ let non_selected: Vec < _ > = folder. layer_ids . iter ( ) . filter ( |id| selected. iter ( ) . all ( |x| x != id) ) . collect ( ) ;
622+ log:: debug!( "non selected {:?}" , non_selected) ;
623+ let offset = if relative_positon < 0 { 0 } else { 1 } as usize ;
624+ let fallback = offset * ( non_selected. len ( ) - 1 ) ;
625+ let insert_index = non_selected. iter ( ) . position ( |x| * x == id) . unwrap_or ( fallback) as isize + offset as isize ;
626+ responses. push_back ( DocumentMessage :: MoveSelectedLayersTo { path : path. to_vec ( ) , insert_index } . into ( ) )
627+ }
605628 }
606629 }
607630 }
0 commit comments