Skip to content

Commit a4a0e11

Browse files
0SlowPoke0Keavon
andauthored
Improve Pen tool behavior to less aggressively delete single-point layers (#2605)
* add single-anchor-place * clippy_changes --------- Co-authored-by: Keavon Chambers <[email protected]>
1 parent ac9fb2b commit a4a0e11

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

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

+19-17
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,9 @@ impl PenToolData {
608608

609609
// Get close path
610610
let mut end = None;
611-
let layer = self.current_layer?;
611+
let selected_nodes = document.network_interface.selected_nodes();
612+
let mut selected_layers = selected_nodes.selected_layers(document.metadata());
613+
let layer = selected_layers.next().filter(|_| selected_layers.next().is_none()).or(self.current_layer)?;
612614
let vector_data = document.network_interface.compute_modified_vector(layer)?;
613615
let start = self.latest_point()?.id;
614616
let transform = document.metadata().document_to_viewport * transform;
@@ -1029,7 +1031,9 @@ impl PenToolData {
10291031
let relative = if self.path_closed { None } else { self.latest_point().map(|point| point.pos) };
10301032
self.next_point = self.compute_snapped_angle(snap_data, transform, false, mouse, relative, true);
10311033

1032-
let layer = self.current_layer?;
1034+
let selected_nodes = document.network_interface.selected_nodes();
1035+
let mut selected_layers = selected_nodes.selected_layers(document.metadata());
1036+
let layer = selected_layers.next().filter(|_| selected_layers.next().is_none()).or(self.current_layer)?;
10331037
let vector_data = document.network_interface.compute_modified_vector(layer)?;
10341038
let transform = document.metadata().document_to_viewport * transform;
10351039
for point in vector_data.extendable_points(preferences.vector_meshes) {
@@ -1363,8 +1367,10 @@ impl Fsm for PenToolFsmState {
13631367
preferences,
13641368
..
13651369
} = tool_action_data;
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()).or(tool_data.current_layer);
13661373

1367-
let layer = tool_data.current_layer;
13681374
let mut transform = layer.map(|layer| document.metadata().transform_to_document(layer)).unwrap_or_default();
13691375

13701376
if !transform.inverse().is_finite() {
@@ -1666,7 +1672,13 @@ impl Fsm for PenToolFsmState {
16661672
.descendants(document.metadata())
16671673
.filter(|layer| !document.network_interface.is_artboard(&layer.to_node(), &[]));
16681674
if let Some((other_layer, _, _)) = should_extend(document, viewport, crate::consts::SNAP_POINT_TOLERANCE, layers, preferences) {
1669-
if let Some(current_layer) = tool_data.current_layer.filter(|layer| *layer != other_layer) {
1675+
let selected_nodes = document.network_interface.selected_nodes();
1676+
let mut selected_layers = selected_nodes.selected_layers(document.metadata());
1677+
if let Some(current_layer) = selected_layers
1678+
.next()
1679+
.filter(|current_layer| selected_layers.next().is_none() && *current_layer != other_layer)
1680+
.or(tool_data.current_layer.filter(|layer| *layer != other_layer))
1681+
{
16701682
merge_layers(document, current_layer, other_layer, responses);
16711683
}
16721684
}
@@ -1947,26 +1959,15 @@ impl Fsm for PenToolFsmState {
19471959
PenToolFsmState::Ready
19481960
}
19491961
(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-
}
19611962
responses.add(DocumentMessage::EndTransaction);
19621963
tool_data.cleanup(responses);
19631964
tool_data.cleanup_target_selections(shape_editor, layer, document, responses);
19641965

19651966
PenToolFsmState::Ready
19661967
}
19671968
(PenToolFsmState::DraggingHandle(..), PenToolMessage::Abort) => {
1969+
responses.add(DocumentMessage::AbortTransaction);
19681970
if tool_data.handle_end.is_none() {
1969-
responses.add(DocumentMessage::AbortTransaction);
19701971
tool_data.cleanup(responses);
19711972
tool_data.cleanup_target_selections(shape_editor, layer, document, responses);
19721973

@@ -1977,7 +1978,7 @@ impl Fsm for PenToolFsmState {
19771978
.unwrap_or(PenToolFsmState::Ready)
19781979
}
19791980
}
1980-
(_, PenToolMessage::Abort) => {
1981+
(PenToolFsmState::PlacingAnchor, PenToolMessage::Abort) => {
19811982
let should_delete_layer = if let Some(vector_data) = layer.and_then(|layer| document.network_interface.compute_modified_vector(layer)) {
19821983
vector_data.point_domain.ids().len() == 1
19831984
} else {
@@ -1999,6 +2000,7 @@ impl Fsm for PenToolFsmState {
19992000

20002001
PenToolFsmState::Ready
20012002
}
2003+
(_, PenToolMessage::Abort) => PenToolFsmState::Ready,
20022004
(PenToolFsmState::DraggingHandle(..) | PenToolFsmState::PlacingAnchor, PenToolMessage::Undo) => {
20032005
if tool_data.point_index > 0 {
20042006
tool_data.point_index -= 1;

0 commit comments

Comments
 (0)