From 10863acd830a6b42f55704162bec98f932147b7e Mon Sep 17 00:00:00 2001 From: 0HyperCube <78500760+0HyperCube@users.noreply.github.com> Date: Sat, 9 Dec 2023 13:08:46 +0000 Subject: [PATCH] Fix crash when reordering layers (#1492) --- .../document/node_graph/graph_operation_message_handler.rs | 4 ++++ .../portfolio/document/utility_types/transformation.rs | 1 + editor/src/messages/tool/tool_messages/select_tool.rs | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/editor/src/messages/portfolio/document/node_graph/graph_operation_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/graph_operation_message_handler.rs index 9fcc257d..74321752 100644 --- a/editor/src/messages/portfolio/document/node_graph/graph_operation_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/graph_operation_message_handler.rs @@ -525,6 +525,10 @@ impl<'a> ModifyInputsContext<'a> { let mut delete_nodes = vec![id]; for (_node, id) in self.network.upstream_flow_back_from_nodes(vec![id], true) { + // Don't delete the node if other layers depend on it. + if self.outwards_links.get(&id).is_some_and(|nodes| nodes.len() > 1) { + break; + } if self.outwards_links.get(&id).is_some_and(|outwards| outwards.len() == 1) { delete_nodes.push(id); } diff --git a/editor/src/messages/portfolio/document/utility_types/transformation.rs b/editor/src/messages/portfolio/document/utility_types/transformation.rs index 6ba78905..1a417196 100644 --- a/editor/src/messages/portfolio/document/utility_types/transformation.rs +++ b/editor/src/messages/portfolio/document/utility_types/transformation.rs @@ -33,6 +33,7 @@ impl OriginalTransforms { pub fn update<'a>(&mut self, selected: &'a [LayerNodeIdentifier], document: &'a Document, shape_editor: Option<&'a ShapeState>) { match self { OriginalTransforms::Layer(layer_map) => { + layer_map.retain(|layer, _| selected.contains(layer)); for &layer in selected { layer_map.entry(layer).or_insert_with(|| document.metadata.upstream_transform(layer.to_node())); } diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 4630a981..0415e4d8 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -483,6 +483,7 @@ impl Fsm for SelectToolFsmState { if let Some(bounds) = &mut tool_data.bounding_box_overlays { let document = &document.document_legacy; + tool_data.layers_dragging.retain(|layer| document.document_network.nodes.contains_key(&layer.to_node())); let mut selected = Selected::new( &mut bounds.original_transforms, &mut bounds.center_of_transformation, @@ -500,6 +501,7 @@ impl Fsm for SelectToolFsmState { responses.add(DocumentMessage::StartTransaction); if let Some(bounds) = &mut tool_data.bounding_box_overlays { + tool_data.layers_dragging.retain(|layer| document.network().nodes.contains_key(&layer.to_node())); let mut selected = Selected::new( &mut bounds.original_transforms, &mut bounds.center_of_transformation, @@ -610,6 +612,7 @@ impl Fsm for SelectToolFsmState { let (position, size) = movement.new_size(snapped_mouse_position, bounds.transform, center, bounds.center_of_transformation, axis_align); let (delta, mut _pivot) = movement.bounds_to_scale_transform(position, size); + tool_data.layers_dragging.retain(|layer| document.network().nodes.contains_key(&layer.to_node())); let selected = &tool_data.layers_dragging; let mut selected = Selected::new(&mut bounds.original_transforms, &mut _pivot, selected, responses, &document.document_legacy, None, &ToolType::Select); @@ -636,6 +639,7 @@ impl Fsm for SelectToolFsmState { let delta = DAffine2::from_angle(snapped_angle); + tool_data.layers_dragging.retain(|layer| document.network().nodes.contains_key(&layer.to_node())); let mut selected = Selected::new( &mut bounds.original_transforms, &mut bounds.center_of_transformation, @@ -815,6 +819,7 @@ impl Fsm for SelectToolFsmState { if let Some(path) = tool_data.drag_box_overlay_layer.take() { responses.add_front(DocumentMessage::Overlays(Operation::DeleteLayer { path }.into())) }; + tool_data.layers_dragging.retain(|layer| document.network().nodes.contains_key(&layer.to_node())); if let Some(mut bounding_box_overlays) = tool_data.bounding_box_overlays.take() { let mut selected = Selected::new( &mut bounding_box_overlays.original_transforms,