Skip to content

Commit 33de539

Browse files
0SlowPoke0Keavon
andauthored
Fix Pen tool unable to combine multiple selected paths by extending their endpoints or mesh points (#2570)
* fixed issue * merge-layers * node-graph-autopanning-wire * store the layer whne created instead of querying * fix layers temporarily geting deselected while exteneding path --------- Co-authored-by: Keavon Chambers <[email protected]>
1 parent 29e8e8b commit 33de539

File tree

2 files changed

+20
-18
lines changed

2 files changed

+20
-18
lines changed

editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1293,7 +1293,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
12931293
self.update_node_graph_hints(responses);
12941294
}
12951295
NodeGraphMessage::PointerOutsideViewport { shift } => {
1296-
if self.drag_start.is_some() || self.box_selection_start.is_some() {
1296+
if self.drag_start.is_some() || self.box_selection_start.is_some() || (self.wire_in_progress_from_connector.is_some() && self.context_menu.is_none()) {
12971297
let _ = self.auto_panning.shift_viewport(ipp, responses);
12981298
} else {
12991299
// Auto-panning

editor/src/messages/tool/tool_messages/pen_tool.rs

+19-17
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ struct PenToolData {
358358

359359
handle_mode: HandleMode,
360360
prior_segment_layer: Option<LayerNodeIdentifier>,
361+
current_layer: Option<LayerNodeIdentifier>,
361362
prior_segment_endpoint: Option<PointId>,
362363
prior_segment: Option<SegmentId>,
363364
handle_type: TargetHandle,
@@ -607,9 +608,7 @@ impl PenToolData {
607608

608609
// Get close path
609610
let mut end = None;
610-
let selected_nodes = document.network_interface.selected_nodes();
611-
let mut selected_layers = selected_nodes.selected_layers(document.metadata());
612-
let layer = selected_layers.next().filter(|_| selected_layers.next().is_none())?;
611+
let layer = self.current_layer?;
613612
let vector_data = document.network_interface.compute_modified_vector(layer)?;
614613
let start = self.latest_point()?.id;
615614
let transform = document.metadata().document_to_viewport * transform;
@@ -1030,9 +1029,7 @@ impl PenToolData {
10301029
let relative = if self.path_closed { None } else { self.latest_point().map(|point| point.pos) };
10311030
self.next_point = self.compute_snapped_angle(snap_data, transform, false, mouse, relative, true);
10321031

1033-
let selected_nodes = document.network_interface.selected_nodes();
1034-
let mut selected_layers = selected_nodes.selected_layers(document.metadata());
1035-
let layer = selected_layers.next().filter(|_| selected_layers.next().is_none())?;
1032+
let layer = self.current_layer?;
10361033
let vector_data = document.network_interface.compute_modified_vector(layer)?;
10371034
let transform = document.metadata().document_to_viewport * transform;
10381035
for point in vector_data.extendable_points(preferences.vector_meshes) {
@@ -1141,6 +1138,7 @@ impl PenToolData {
11411138
let tolerance = crate::consts::SNAP_POINT_TOLERANCE;
11421139
let extension_choice = should_extend(document, viewport, tolerance, selected_nodes.selected_layers(document.metadata()), preferences);
11431140
if let Some((layer, point, position)) = extension_choice {
1141+
self.current_layer = Some(layer);
11441142
self.extend_existing_path(document, layer, point, position, responses);
11451143
return;
11461144
}
@@ -1180,6 +1178,7 @@ impl PenToolData {
11801178

11811179
let parent = document.new_layer_bounding_artboard(input);
11821180
let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, parent, responses);
1181+
self.current_layer = Some(layer);
11831182
tool_options.fill.apply_fill(layer, responses);
11841183
tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses);
11851184
self.prior_segment = None;
@@ -1236,8 +1235,6 @@ impl PenToolData {
12361235
handle_start,
12371236
});
12381237

1239-
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![layer.to_node()] });
1240-
12411238
self.next_point = position;
12421239
self.next_handle_start = handle_start;
12431240
let vector_data = document.network_interface.compute_modified_vector(layer).unwrap();
@@ -1367,9 +1364,7 @@ impl Fsm for PenToolFsmState {
13671364
..
13681365
} = tool_action_data;
13691366

1370-
let selected_nodes = document.network_interface.selected_nodes();
1371-
let mut selected_layers = selected_nodes.selected_layers(document.metadata());
1372-
let layer = selected_layers.next().filter(|_| selected_layers.next().is_none());
1367+
let layer = tool_data.current_layer;
13731368
let mut transform = layer.map(|layer| document.metadata().transform_to_document(layer)).unwrap_or_default();
13741369

13751370
if !transform.inverse().is_finite() {
@@ -1671,9 +1666,7 @@ impl Fsm for PenToolFsmState {
16711666
.descendants(document.metadata())
16721667
.filter(|layer| !document.network_interface.is_artboard(&layer.to_node(), &[]));
16731668
if let Some((other_layer, _, _)) = should_extend(document, viewport, crate::consts::SNAP_POINT_TOLERANCE, layers, preferences) {
1674-
let selected_nodes = document.network_interface.selected_nodes();
1675-
let mut selected_layers = selected_nodes.selected_layers(document.metadata());
1676-
if let Some(current_layer) = selected_layers.next().filter(|current_layer| selected_layers.next().is_none() && *current_layer != other_layer) {
1669+
if let Some(current_layer) = tool_data.current_layer.filter(|layer| *layer != other_layer) {
16771670
merge_layers(document, current_layer, other_layer, responses);
16781671
}
16791672
}
@@ -1946,7 +1939,6 @@ impl Fsm for PenToolFsmState {
19461939
responses.add(DocumentMessage::EndTransaction);
19471940
}
19481941
}
1949-
19501942
tool_data.cleanup(responses);
19511943
tool_data.cleanup_target_selections(shape_editor, layer, document, responses);
19521944

@@ -1955,6 +1947,17 @@ impl Fsm for PenToolFsmState {
19551947
PenToolFsmState::Ready
19561948
}
19571949
(PenToolFsmState::PlacingAnchor, PenToolMessage::Confirm) => {
1950+
if let Some((vector_data, layer)) = layer.and_then(|layer| document.network_interface.compute_modified_vector(layer)).zip(layer) {
1951+
let single_point_in_layer = vector_data.point_domain.ids().len() == 1;
1952+
1953+
if single_point_in_layer {
1954+
responses.add(NodeGraphMessage::DeleteNodes {
1955+
node_ids: vec![layer.to_node()],
1956+
delete_children: true,
1957+
});
1958+
responses.add(NodeGraphMessage::RunDocumentGraph);
1959+
}
1960+
}
19581961
responses.add(DocumentMessage::EndTransaction);
19591962
tool_data.cleanup(responses);
19601963
tool_data.cleanup_target_selections(shape_editor, layer, document, responses);
@@ -1975,8 +1978,7 @@ impl Fsm for PenToolFsmState {
19751978
}
19761979
}
19771980
(_, PenToolMessage::Abort) => {
1978-
let should_delete_layer = if layer.is_some() {
1979-
let vector_data = document.network_interface.compute_modified_vector(layer.unwrap()).unwrap();
1981+
let should_delete_layer = if let Some(vector_data) = layer.and_then(|layer| document.network_interface.compute_modified_vector(layer)) {
19801982
vector_data.point_domain.ids().len() == 1
19811983
} else {
19821984
false

0 commit comments

Comments
 (0)