diff --git a/editor/src/document/document_file.rs b/editor/src/document/document_file.rs index 6a5cda3494..dd668718d3 100644 --- a/editor/src/document/document_file.rs +++ b/editor/src/document/document_file.rs @@ -273,25 +273,29 @@ impl DocumentMessageHandler { self.layer_metadata.iter().filter_map(|(path, data)| data.selected.then(|| path.as_slice())) } - pub fn selected_layers_without_children(&self) -> Vec> { + pub fn selected_layers_without_children(&self) -> impl Iterator { let mut sorted_layers = self.selected_layers().collect::>(); // Sorting here creates groups of similar UUID paths sorted_layers.sort(); - if sorted_layers.is_empty() { - return vec![]; + let mut current_path: &[u64] = &[]; + let mut layers_to_keep = vec![]; + + // Required since we are returning an iterator, cannot return early + if let Some(first) = sorted_layers.first() { + current_path = first; + layers_to_keep.push(*first); } - let mut current_path = sorted_layers.first().unwrap(); - let mut keep = vec![current_path.to_vec()]; for path in &sorted_layers { if !path.starts_with(current_path) { - keep.push(path.to_vec()); + layers_to_keep.push(path); current_path = path; } } - keep + // We need to maintain layer ordering + self.selected_layers().filter(move |p| layers_to_keep.binary_search(p).is_ok()) } pub fn selected_layers_contains(&self, path: &[LayerId]) -> bool { @@ -646,7 +650,7 @@ impl MessageHandler for DocumentMessageHand self.backup(responses); for path in self.selected_layers_without_children() { - responses.push_front(DocumentOperation::DeleteLayer { path }.into()); + responses.push_front(DocumentOperation::DeleteLayer { path: path.to_vec() }.into()); } responses.push_front(ToolMessage::DocumentIsDirty.into()); diff --git a/editor/src/document/document_message_handler.rs b/editor/src/document/document_message_handler.rs index 052c408112..75625a28d9 100644 --- a/editor/src/document/document_message_handler.rs +++ b/editor/src/document/document_message_handler.rs @@ -359,7 +359,7 @@ impl MessageHandler for DocumentsMessageHa copy_buffer[clipboard as usize].clear(); for layer_path in active_document.selected_layers_without_children() { - match (active_document.graphene_document.layer(&layer_path).map(|t| t.clone()), *active_document.layer_metadata(&layer_path)) { + match (active_document.graphene_document.layer(layer_path).map(|t| t.clone()), *active_document.layer_metadata(layer_path)) { (Ok(layer), layer_metadata) => { copy_buffer[clipboard as usize].push(CopyBufferEntry { layer, layer_metadata }); }