From c0de1a044885e6c052b5d717a47404341ae2cadf Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Tue, 11 Feb 2025 01:22:17 -0800 Subject: [PATCH] Cleanup, fix compiling, fix history bug --- .../document/document_message_handler.rs | 184 +++++++++--------- 1 file changed, 90 insertions(+), 94 deletions(-) diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index f3c5f1dcbd..efcb5201e6 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -949,7 +949,7 @@ impl MessageHandler> for DocumentMessag responses.add(DocumentMessage::SelectedLayersReorder { relative_index_offset: isize::MIN }); } DocumentMessage::SelectedLayersReverse => { - self.selected_layers_reverse(responses); + self.selected_layers_reverse(responses); } DocumentMessage::SelectedLayersReorder { relative_index_offset } => { self.selected_layers_reorder(relative_index_offset, responses); @@ -2151,102 +2151,98 @@ impl DocumentMessageHandler { layout_target: LayoutTarget::LayersPanelControlBar, }); } - + pub fn selected_layers_reverse(&mut self, responses: &mut VecDeque) { - let selected_layers = self.network_interface.selected_nodes(&[]).unwrap(); - let metadata = self.metadata(); - let selected_layer_set: HashSet = selected_layers.selected_layers(metadata).collect(); - - // ignore those with selected ancestors - let mut top_level_layers = Vec::new(); - for &layer in &selected_layer_set { - let mut is_top_level = true; - let mut current_layer = layer; - - while let Some(parent) = current_layer.parent(metadata) { - if selected_layer_set.contains(&parent) { - is_top_level = false; - break; - } - current_layer = parent; - } - - if is_top_level { - top_level_layers.push(layer); - } - } - - //Group selected layers by their parent - let mut grouped_layers: HashMap> = HashMap::new(); - for &layer in &top_level_layers { - if let Some(parent) = layer.parent(metadata) { - let index = parent - .children(metadata) - .position(|child| child == layer) - .unwrap_or(usize::MAX); - - grouped_layers.entry(parent).or_insert_with(Vec::new).push((index, layer)); - } - } - - let mut modified = false; - - //Process each group separately - for (parent, mut layers) in grouped_layers { - // Retrieve all children under the parent - let all_children: Vec = parent.children(metadata).collect(); - - // Separate unselected layers with their original indices - let mut unselected_layers: Vec<(usize, LayerNodeIdentifier)> = all_children - .iter() - .enumerate() - .filter_map(|(index, &layer)| { - if !selected_layer_set.contains(&layer) { - Some((index, layer)) - } else { - None - } - }) - .collect(); - + let selected_layers = self.network_interface.selected_nodes(&[]).unwrap(); + let metadata = self.metadata(); + let selected_layer_set = selected_layers.selected_layers(metadata).collect::>(); + + // Ignore those with selected ancestors + let mut top_level_layers = Vec::new(); + for &layer in &selected_layer_set { + let mut is_top_level = true; + let mut current_layer = layer; + + while let Some(parent) = current_layer.parent(metadata) { + if selected_layer_set.contains(&parent) { + is_top_level = false; + break; + } + current_layer = parent; + } + + if is_top_level { + top_level_layers.push(layer); + } + } + + // Group selected layers by their parent + let mut grouped_layers: HashMap> = HashMap::new(); + for &layer in &top_level_layers { + if let Some(parent) = layer.parent(metadata) { + let index = parent.children(metadata).position(|child| child == layer).unwrap_or(usize::MAX); + + grouped_layers.entry(parent).or_default().push((index, layer)); + } + } + + let mut modified = false; + + // Process each group separately + for (parent, mut layers) in grouped_layers { + // Retrieve all children under the parent + let all_children = parent.children(metadata).collect::>(); + + // Separate unselected layers with their original indices + let unselected_layers = all_children + .iter() + .enumerate() + .filter_map(|(index, &layer)| if !selected_layer_set.contains(&layer) { Some((index, layer)) } else { None }) + .collect::>(); + layers.sort_by_key(|(index, _)| *index); - - let reversed_layers: Vec = layers.iter().rev().map(|(_, layer)| *layer).collect(); - let selected_positions: Vec = layers.iter().map(|(index, _)| *index).collect(); - let selected_iter = reversed_layers.into_iter(); - let merged_layers = vec![None; all_children.len()]; - - for (&original_index, new_layer) in selected_positions.iter().zip(selected_iter) { - merged_layers[original_index] = Some(new_layer); - } - - // Place unselected layers at their original positions - for (index, layer) in unselected_layers { - if merged_layers[index].is_none() { - merged_layers[index] = Some(layer); - } - } - - let final_layers: Vec = merged_layers.into_iter().flatten().collect(); - - for (index, layer) in final_layers.iter().enumerate() { - responses.add(NodeGraphMessage::MoveLayerToStack { - layer: *layer, - parent, - insert_index: index, - }); - } - - modified = true; - } - - if modified { - responses.add(DocumentMessage::AddTransaction); - responses.add(NodeGraphMessage::RunDocumentGraph); - responses.add(NodeGraphMessage::SendGraph); - } - } + let reversed_layers = layers.iter().rev().map(|(_, layer)| *layer).collect::>(); + let selected_positions = layers.iter().map(|(index, _)| *index).collect::>(); + let selected_iter = reversed_layers.into_iter(); + let mut merged_layers = vec![None; all_children.len()]; + + for (&original_index, new_layer) in selected_positions.iter().zip(selected_iter) { + merged_layers[original_index] = Some(new_layer); + } + + // Place unselected layers at their original positions + for (index, layer) in unselected_layers { + if merged_layers[index].is_none() { + merged_layers[index] = Some(layer); + } + } + + let final_layers = merged_layers.into_iter().flatten().collect::>(); + if final_layers.is_empty() { + continue; + } + + if !modified { + responses.add(DocumentMessage::AddTransaction); + } + + for (index, layer) in final_layers.iter().enumerate() { + responses.add(NodeGraphMessage::MoveLayerToStack { + layer: *layer, + parent, + insert_index: index, + }); + } + + modified = true; + } + + if modified { + responses.add(NodeGraphMessage::RunDocumentGraph); + responses.add(NodeGraphMessage::SendGraph); + } + } pub fn selected_layers_reorder(&mut self, relative_index_offset: isize, responses: &mut VecDeque) { let selected_nodes = self.network_interface.selected_nodes(&[]).unwrap();