Improve Pen tool behavior to less aggressively delete single-point layers (#2605)
* add single-anchor-place * clippy_changes --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
parent
ac9fb2b02d
commit
a4a0e110d7
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue