diff --git a/editor/src/messages/tool/tool_messages/pen_tool.rs b/editor/src/messages/tool/tool_messages/pen_tool.rs index 3d148121..b7783c50 100644 --- a/editor/src/messages/tool/tool_messages/pen_tool.rs +++ b/editor/src/messages/tool/tool_messages/pen_tool.rs @@ -608,7 +608,9 @@ impl PenToolData { // Get close path let mut end = None; - let layer = self.current_layer?; + let selected_nodes = document.network_interface.selected_nodes(); + let mut selected_layers = selected_nodes.selected_layers(document.metadata()); + let layer = selected_layers.next().filter(|_| selected_layers.next().is_none()).or(self.current_layer)?; let vector_data = document.network_interface.compute_modified_vector(layer)?; let start = self.latest_point()?.id; let transform = document.metadata().document_to_viewport * transform; @@ -1029,7 +1031,9 @@ impl PenToolData { let relative = if self.path_closed { None } else { self.latest_point().map(|point| point.pos) }; self.next_point = self.compute_snapped_angle(snap_data, transform, false, mouse, relative, true); - let layer = self.current_layer?; + let selected_nodes = document.network_interface.selected_nodes(); + let mut selected_layers = selected_nodes.selected_layers(document.metadata()); + let layer = selected_layers.next().filter(|_| selected_layers.next().is_none()).or(self.current_layer)?; let vector_data = document.network_interface.compute_modified_vector(layer)?; let transform = document.metadata().document_to_viewport * transform; for point in vector_data.extendable_points(preferences.vector_meshes) { @@ -1363,8 +1367,10 @@ impl Fsm for PenToolFsmState { preferences, .. } = tool_action_data; + let selected_nodes = document.network_interface.selected_nodes(); + let mut selected_layers = selected_nodes.selected_layers(document.metadata()); + let layer = selected_layers.next().filter(|_| selected_layers.next().is_none()).or(tool_data.current_layer); - let layer = tool_data.current_layer; let mut transform = layer.map(|layer| document.metadata().transform_to_document(layer)).unwrap_or_default(); if !transform.inverse().is_finite() { @@ -1666,7 +1672,13 @@ impl Fsm for PenToolFsmState { .descendants(document.metadata()) .filter(|layer| !document.network_interface.is_artboard(&layer.to_node(), &[])); if let Some((other_layer, _, _)) = should_extend(document, viewport, crate::consts::SNAP_POINT_TOLERANCE, layers, preferences) { - if let Some(current_layer) = tool_data.current_layer.filter(|layer| *layer != other_layer) { + let selected_nodes = document.network_interface.selected_nodes(); + let mut selected_layers = selected_nodes.selected_layers(document.metadata()); + if let Some(current_layer) = selected_layers + .next() + .filter(|current_layer| selected_layers.next().is_none() && *current_layer != other_layer) + .or(tool_data.current_layer.filter(|layer| *layer != other_layer)) + { merge_layers(document, current_layer, other_layer, responses); } } @@ -1947,17 +1959,6 @@ impl Fsm for PenToolFsmState { PenToolFsmState::Ready } (PenToolFsmState::PlacingAnchor, PenToolMessage::Confirm) => { - if let Some((vector_data, layer)) = layer.and_then(|layer| document.network_interface.compute_modified_vector(layer)).zip(layer) { - let single_point_in_layer = vector_data.point_domain.ids().len() == 1; - - if single_point_in_layer { - responses.add(NodeGraphMessage::DeleteNodes { - node_ids: vec![layer.to_node()], - delete_children: true, - }); - responses.add(NodeGraphMessage::RunDocumentGraph); - } - } responses.add(DocumentMessage::EndTransaction); tool_data.cleanup(responses); tool_data.cleanup_target_selections(shape_editor, layer, document, responses); @@ -1965,8 +1966,8 @@ impl Fsm for PenToolFsmState { PenToolFsmState::Ready } (PenToolFsmState::DraggingHandle(..), PenToolMessage::Abort) => { + responses.add(DocumentMessage::AbortTransaction); if tool_data.handle_end.is_none() { - responses.add(DocumentMessage::AbortTransaction); tool_data.cleanup(responses); tool_data.cleanup_target_selections(shape_editor, layer, document, responses); @@ -1977,7 +1978,7 @@ impl Fsm for PenToolFsmState { .unwrap_or(PenToolFsmState::Ready) } } - (_, PenToolMessage::Abort) => { + (PenToolFsmState::PlacingAnchor, PenToolMessage::Abort) => { let should_delete_layer = if let Some(vector_data) = layer.and_then(|layer| document.network_interface.compute_modified_vector(layer)) { vector_data.point_domain.ids().len() == 1 } else { @@ -1999,6 +2000,7 @@ impl Fsm for PenToolFsmState { PenToolFsmState::Ready } + (_, PenToolMessage::Abort) => PenToolFsmState::Ready, (PenToolFsmState::DraggingHandle(..) | PenToolFsmState::PlacingAnchor, PenToolMessage::Undo) => { if tool_data.point_index > 0 { tool_data.point_index -= 1;