@@ -139,6 +139,8 @@ pub enum DocumentMessage {
139139 StartTransaction ,
140140 RollbackTransaction ,
141141 GroupSelectedLayers ,
142+ UngroupSelectedLayers ,
143+ UngroupLayers ( Vec < LayerId > ) ,
142144 AbortTransaction ,
143145 CommitTransaction ,
144146 ExportDocument ,
@@ -217,9 +219,14 @@ impl DocumentMessageHandler {
217219 fn select_layer ( & mut self , path : & [ LayerId ] ) -> Option < Message > {
218220 println ! ( "Select_layer fail: {:?}" , self . all_layers_sorted( ) ) ;
219221
220- self . layer_metadata_mut ( path) . selected = true ;
221- let data = self . layer_panel_entry ( path. to_vec ( ) ) . ok ( ) ?;
222- ( !path. is_empty ( ) ) . then ( || FrontendMessage :: UpdateLayer { data } . into ( ) )
222+ if let Some ( layer) = self . layer_metadata . get_mut ( path) {
223+ layer. selected = true ;
224+ let data = self . layer_panel_entry ( path. to_vec ( ) ) . ok ( ) ?;
225+ ( !path. is_empty ( ) ) . then ( || FrontendMessage :: UpdateLayer { data } . into ( ) )
226+ } else {
227+ log:: warn!( "Tried to select non existing layer {:?}" , path) ;
228+ None
229+ }
223230 }
224231
225232 pub fn selected_visible_layers_bounding_box ( & self ) -> Option < [ DVec2 ; 2 ] > {
@@ -274,13 +281,10 @@ impl DocumentMessageHandler {
274281 }
275282
276283 pub fn selected_layers_without_children ( & self ) -> Vec < & [ LayerId ] > {
277- let mut sorted_layers = self . selected_layers ( ) . collect :: < Vec < _ > > ( ) ;
278- // Sorting here creates groups of similar UUID paths
279- sorted_layers. sort ( ) ;
280- sorted_layers. dedup_by ( |a, b| a. starts_with ( b) ) ;
284+ let unique_layers = self . graphene_document . shallowest_unique_layers ( self . selected_layers ( ) ) ;
281285
282286 // We need to maintain layer ordering
283- self . sort_layers ( sorted_layers . iter ( ) . copied ( ) )
287+ self . sort_layers ( unique_layers . iter ( ) . copied ( ) )
284288 }
285289
286290 pub fn selected_layers_contains ( & self , path : & [ LayerId ] ) -> bool {
@@ -427,6 +431,9 @@ impl DocumentMessageHandler {
427431 let document = std:: mem:: replace ( & mut self . graphene_document , document) ;
428432 let layer_metadata = std:: mem:: replace ( & mut self . layer_metadata , layer_metadata) ;
429433 self . document_redo_history . push ( ( document, layer_metadata) ) ;
434+ for layer in self . layer_metadata . keys ( ) {
435+ responses. push_back ( DocumentMessage :: LayerChanged ( layer. clone ( ) ) . into ( ) )
436+ }
430437 Ok ( ( ) )
431438 }
432439 None => Err ( EditorError :: NoTransactionInProgress ) ,
@@ -442,6 +449,9 @@ impl DocumentMessageHandler {
442449 let document = std:: mem:: replace ( & mut self . graphene_document , document) ;
443450 let layer_metadata = std:: mem:: replace ( & mut self . layer_metadata , layer_metadata) ;
444451 self . document_undo_history . push ( ( document, layer_metadata) ) ;
452+ for layer in self . layer_metadata . keys ( ) {
453+ responses. push_back ( DocumentMessage :: LayerChanged ( layer. clone ( ) ) . into ( ) )
454+ }
445455 Ok ( ( ) )
446456 }
447457 None => Err ( EditorError :: NoTransactionInProgress ) ,
@@ -470,7 +480,10 @@ impl DocumentMessageHandler {
470480 }
471481
472482 pub fn layer_panel_entry ( & mut self , path : Vec < LayerId > ) -> Result < LayerPanelEntry , EditorError > {
473- let data: LayerMetadata = * self . layer_metadata_mut ( & path) ;
483+ let data: LayerMetadata = * self
484+ . layer_metadata
485+ . get_mut ( & path)
486+ . ok_or_else ( || EditorError :: Document ( format ! ( "Could not get layer metadata for {:?}" , path) ) ) ?;
474487 let layer = self . graphene_document . layer ( & path) ?;
475488 let entry = layer_panel_entry ( & data, self . graphene_document . multiply_transforms ( & path) ?, layer, path) ;
476489 Ok ( entry)
@@ -505,7 +518,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
505518 TransformLayers ( message) => self
506519 . transform_layer_handler
507520 . process_action ( message, ( & mut self . layer_metadata , & mut self . graphene_document , ipp) , responses) ,
508- DeleteLayer ( path) => responses. push_back ( DocumentOperation :: DeleteLayer { path } . into ( ) ) ,
521+ DeleteLayer ( path) => responses. push_front ( DocumentOperation :: DeleteLayer { path } . into ( ) ) ,
509522 StartTransaction => self . backup ( responses) ,
510523 RollbackTransaction => {
511524 self . rollback ( responses) . unwrap_or_else ( |e| log:: warn!( "{}" , e) ) ;
@@ -595,6 +608,37 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
595608 ) ;
596609 responses. push_back ( DocumentMessage :: SetSelectedLayers ( vec ! [ new_folder_path] ) . into ( ) ) ;
597610 }
611+ UngroupLayers ( folder_path) => {
612+ // Select all the children of the folder
613+ let to_select = self . graphene_document . folder_children_paths ( & folder_path) ;
614+ let message_buffer = [
615+ // Copy them
616+ DocumentMessage :: SetSelectedLayers ( to_select) . into ( ) ,
617+ DocumentsMessage :: Copy ( Clipboard :: System ) . into ( ) ,
618+ // Paste them into the folder above
619+ DocumentsMessage :: PasteIntoFolder {
620+ clipboard : Clipboard :: System ,
621+ path : folder_path[ ..folder_path. len ( ) - 1 ] . to_vec ( ) ,
622+ insert_index : -1 ,
623+ }
624+ . into ( ) ,
625+ // Delete parent folder
626+ DocumentMessage :: DeleteLayer ( folder_path) . into ( ) ,
627+ ] ;
628+
629+ // Push these messages in reverse due to push_front
630+ for message in message_buffer. into_iter ( ) . rev ( ) {
631+ responses. push_front ( message) ;
632+ }
633+ }
634+ UngroupSelectedLayers => {
635+ responses. push_back ( DocumentMessage :: StartTransaction . into ( ) ) ;
636+ let folder_paths = self . graphene_document . sorted_folders_by_depth ( self . selected_layers ( ) ) ;
637+ for folder_path in folder_paths {
638+ responses. push_back ( DocumentMessage :: UngroupLayers ( folder_path. to_vec ( ) ) . into ( ) ) ;
639+ }
640+ responses. push_back ( DocumentMessage :: CommitTransaction . into ( ) ) ;
641+ }
598642 SetBlendModeForSelectedLayers ( blend_mode) => {
599643 self . backup ( responses) ;
600644 for path in self . layer_metadata . iter ( ) . filter_map ( |( path, data) | data. selected . then ( || path. clone ( ) ) ) {
@@ -864,7 +908,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
864908 let insert = all_layer_paths. get ( insert_pos) ;
865909 if let Some ( insert_path) = insert {
866910 let ( id, path) = insert_path. split_last ( ) . expect ( "Can't move the root folder" ) ;
867- if let Some ( folder) = self . graphene_document . layer ( path) . ok ( ) . map ( |layer| layer. as_folder ( ) . ok ( ) ) . flatten ( ) {
911+ if let Some ( folder) = self . graphene_document . layer ( path) . ok ( ) . and_then ( |layer| layer. as_folder ( ) . ok ( ) ) {
868912 let selected: Vec < _ > = selected_layers
869913 . iter ( )
870914 . filter ( |layer| layer. starts_with ( path) && layer. len ( ) == path. len ( ) + 1 )
@@ -1003,6 +1047,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
10031047 NudgeSelectedLayers ,
10041048 ReorderSelectedLayers ,
10051049 GroupSelectedLayers ,
1050+ UngroupSelectedLayers ,
10061051 ) ;
10071052 common. extend ( select) ;
10081053 }
0 commit comments