@@ -380,7 +380,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
380380 log:: debug!( "copy_buffer: {:?}" , self . copy_buffer) ;
381381 }
382382 PasteLayers { path, insert_index } => {
383- for layer in self . copy_buffer . iter ( ) {
383+ let paste = | layer : & Layer , responses : & mut VecDeque < _ > | {
384384 log:: trace!( "pasting into folder {:?} as index: {}" , path, insert_index) ;
385385 responses. push_back (
386386 DocumentOperation :: PasteLayer {
@@ -390,6 +390,15 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
390390 }
391391 . into ( ) ,
392392 )
393+ } ;
394+ if insert_index == -1 {
395+ for layer in self . copy_buffer . iter ( ) {
396+ paste ( layer, responses)
397+ }
398+ } else {
399+ for layer in self . copy_buffer . iter ( ) . rev ( ) {
400+ paste ( layer, responses)
401+ }
393402 }
394403 }
395404 SelectLayers ( paths) => {
@@ -592,39 +601,39 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
592601 ReorderSelectedLayers ( relative_positon) => {
593602 let all_layer_paths = self . all_layers_sorted ( ) ;
594603 let selected_layers = self . selected_layers_sorted ( ) ;
595- let pivot = match relative_positon. signum ( ) {
604+ if let Some ( pivot) = match relative_positon. signum ( ) {
596605 -1 => selected_layers. first ( ) ,
597606 1 => selected_layers. last ( ) ,
598607 _ => unreachable ! ( ) ,
599- }
600- . expect ( "called move layers with an empty selection" ) ;
601- if let Some ( pos) = all_layer_paths . iter ( ) . position ( |path| path == pivot ) {
602- log :: debug! ( "pos {:?}" , pos ) ;
603- let max = all_layer_paths . len ( ) as i64 - selected_layers . len ( ) as i64 ;
604- log:: debug!( "max {:?}" , max ) ;
605- log:: debug!( "relative_positon {:?}" , relative_positon ) ;
606- log :: debug! ( "all_layer_paths: {:?}" , all_layer_paths ) ;
607- let insert_pos = ( pos as i64 + relative_positon as i64 ) . clamp ( 0 , max ) as usize ;
608- log :: debug! ( "inser_pos {:?}" , insert_pos) ;
609- let insert = all_layer_paths . get ( insert_pos ) ;
610- if let Some ( insert_path ) = insert {
611- log :: debug! ( "inserting at {:?}" , insert_path) ;
612- let ( id , path ) = insert_path . split_last ( ) . expect ( "Can't move the root folder" ) ;
613- if let Some ( folder ) = self . active_document ( ) . document . document_layer ( path ) . ok ( ) . map ( |layer| layer . as_folder ( ) . ok ( ) ) . flatten ( ) {
614- // TODO: Ignore existing thingsin folder
615- //
616- let selected : Vec < _ > = selected_layers
617- . iter ( )
618- . filter ( |layer| layer . starts_with ( path ) && layer . len ( ) == path . len ( ) + 1 )
619- . map ( |x| x . last ( ) . unwrap ( ) )
620- . collect ( ) ;
621- log :: debug! ( " selected {:?}" , selected ) ;
622- let non_selected : Vec < _ > = folder . layer_ids . iter ( ) . filter ( |id| selected. iter ( ) . all ( |x| x != id ) ) . collect ( ) ;
623- log :: debug! ( "non selected {:?}" , non_selected ) ;
624- let offset = if relative_positon < 0 { 0 } else { 1 } as usize ;
625- let fallback = offset * ( non_selected . len ( ) - 1 ) ;
626- let insert_index = non_selected . iter ( ) . position ( |x| * x == id ) . unwrap_or ( fallback ) as isize + offset as isize ;
627- responses . push_back ( DocumentMessage :: MoveSelectedLayersTo { path : path . to_vec ( ) , insert_index } . into ( ) )
608+ } {
609+ if let Some ( pos ) = all_layer_paths . iter ( ) . position ( |path| path == pivot ) {
610+ log :: debug! ( " pos {:?}" , pos ) ;
611+ let max = all_layer_paths . len ( ) as i64 - selected_layers . len ( ) as i64 ;
612+ log :: debug! ( " max {:?}" , max ) ;
613+ log:: debug!( "relative_positon {:?}" , relative_positon ) ;
614+ log:: debug!( "all_layer_paths: {:?}" , all_layer_paths ) ;
615+ let insert_pos = ( pos as i64 + relative_positon as i64 ) . clamp ( 0 , max ) as usize ;
616+ log :: debug! ( "inser_pos {:?}" , insert_pos ) ;
617+ let insert = all_layer_paths . get ( insert_pos) ;
618+ if let Some ( insert_path ) = insert {
619+ log :: debug! ( "inserting at {:?}" , insert_path ) ;
620+ let ( id , path ) = insert_path. split_last ( ) . expect ( "Can't move the root folder" ) ;
621+ if let Some ( folder ) = self . active_document ( ) . document . document_layer ( path ) . ok ( ) . map ( |layer| layer . as_folder ( ) . ok ( ) ) . flatten ( ) {
622+ // TODO: Ignore existing thingsin folder
623+ //
624+ let selected : Vec < _ > = selected_layers
625+ . iter ( )
626+ . filter ( |layer| layer . starts_with ( path ) && layer . len ( ) == path . len ( ) + 1 )
627+ . map ( |x| x . last ( ) . unwrap ( ) )
628+ . collect ( ) ;
629+ log :: debug! ( "selected {:?}" , selected ) ;
630+ let non_selected : Vec < _ > = folder . layer_ids . iter ( ) . filter ( |id| selected. iter ( ) . all ( |x| x != id ) ) . collect ( ) ;
631+ log :: debug! ( "non selected {:?}" , non_selected ) ;
632+ let offset = if relative_positon < 0 || non_selected . is_empty ( ) { 0 } else { selected . len ( ) } ;
633+ let fallback = offset * ( non_selected . len ( ) . clamp ( 1 , usize :: MAX ) - 1 ) ;
634+ let insert_index = non_selected . iter ( ) . position ( |x| * x == id ) . unwrap_or ( fallback ) as isize + offset as isize ;
635+ responses . push_back ( DocumentMessage :: MoveSelectedLayersTo { path : path . to_vec ( ) , insert_index } . into ( ) )
636+ }
628637 }
629638 }
630639 }
0 commit comments