Make Path tool deselect all points on single-click, and select all on double-click, of shape's fill (#2148)

* Implement deselect on single-click and select all anchors on double-click

* fixed the single_click_behaviour

* fix flipSmoothSharp when doubleclick and drag

* Cleanup and Clippy fixes

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
0SlowPoke0 2024-12-23 11:29:59 +05:30 committed by GitHub
parent a1dc9556af
commit 77936c44b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 7 deletions

View File

@ -1655,8 +1655,7 @@ impl DocumentMessageHandler {
/// Finds the artboard that bounds the point in viewport space and be the container of any newly added layers. /// Finds the artboard that bounds the point in viewport space and be the container of any newly added layers.
pub fn new_layer_bounding_artboard(&self, ipp: &InputPreprocessorMessageHandler) -> LayerNodeIdentifier { pub fn new_layer_bounding_artboard(&self, ipp: &InputPreprocessorMessageHandler) -> LayerNodeIdentifier {
self.click_xray(ipp) self.click_xray(ipp)
.filter(|layer| self.network_interface.is_artboard(&layer.to_node(), &[])) .find(|layer| self.network_interface.is_artboard(&layer.to_node(), &[]))
.next()
.unwrap_or(LayerNodeIdentifier::ROOT_PARENT) .unwrap_or(LayerNodeIdentifier::ROOT_PARENT)
} }

View File

@ -397,7 +397,6 @@ impl PathToolData {
} }
self.drag_start_pos = input.mouse.position; self.drag_start_pos = input.mouse.position;
self.previous_mouse_position = document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position); self.previous_mouse_position = document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position);
shape_editor.select_connected_anchors(document, layer, input.mouse.position);
responses.add(DocumentMessage::StartTransaction); responses.add(DocumentMessage::StartTransaction);
@ -566,6 +565,7 @@ impl Fsm for PathToolFsmState {
) => { ) => {
let extend_selection = input.keyboard.get(extend_selection as usize); let extend_selection = input.keyboard.get(extend_selection as usize);
let direct_insert_without_sliding = input.keyboard.get(direct_insert_without_sliding as usize); let direct_insert_without_sliding = input.keyboard.get(direct_insert_without_sliding as usize);
tool_data.mouse_down(shape_editor, document, input, responses, extend_selection, direct_insert_without_sliding) tool_data.mouse_down(shape_editor, document, input, responses, extend_selection, direct_insert_without_sliding)
} }
( (
@ -606,6 +606,12 @@ impl Fsm for PathToolFsmState {
move_anchor_with_handles, move_anchor_with_handles,
}, },
) => { ) => {
if tool_data.selection_status.is_none() {
if let Some(layer) = document.click(input) {
shape_editor.select_all_anchors_in_layer(document, layer);
}
}
let anchor_and_handle_toggled = input.keyboard.get(move_anchor_with_handles as usize); let anchor_and_handle_toggled = input.keyboard.get(move_anchor_with_handles as usize);
let initial_press = anchor_and_handle_toggled && !tool_data.select_anchor_toggled; let initial_press = anchor_and_handle_toggled && !tool_data.select_anchor_toggled;
let released_from_toggle = tool_data.select_anchor_toggled && !anchor_and_handle_toggled; let released_from_toggle = tool_data.select_anchor_toggled && !anchor_and_handle_toggled;
@ -749,10 +755,15 @@ impl Fsm for PathToolFsmState {
} }
} }
} }
// Deselect all points if the user clicks the filled region of the shape
else if tool_data.drag_start_pos.distance(input.mouse.position) <= DRAG_THRESHOLD {
shape_editor.deselect_all_points();
}
responses.add(DocumentMessage::EndTransaction); responses.add(DocumentMessage::EndTransaction);
responses.add(PathToolMessage::SelectedPointUpdated); responses.add(PathToolMessage::SelectedPointUpdated);
tool_data.snap_manager.cleanup(responses); tool_data.snap_manager.cleanup(responses);
PathToolFsmState::Ready PathToolFsmState::Ready
} }
@ -774,11 +785,25 @@ impl Fsm for PathToolFsmState {
PathToolFsmState::Ready PathToolFsmState::Ready
} }
(_, PathToolMessage::FlipSmoothSharp) => { (_, PathToolMessage::FlipSmoothSharp) => {
if !tool_data.double_click_handled { // Double-clicked on a point
shape_editor.flip_smooth_sharp(&document.network_interface, input.mouse.position, SELECTION_TOLERANCE, responses); let nearest_point = shape_editor.find_nearest_point_indices(&document.network_interface, input.mouse.position, SELECTION_THRESHOLD);
responses.add(PathToolMessage::SelectedPointUpdated); if nearest_point.is_some() {
// Flip the selected point between smooth and sharp
if !tool_data.double_click_handled && tool_data.drag_start_pos.distance(input.mouse.position) <= DRAG_THRESHOLD {
shape_editor.flip_smooth_sharp(&document.network_interface, input.mouse.position, SELECTION_TOLERANCE, responses);
responses.add(PathToolMessage::SelectedPointUpdated);
}
return PathToolFsmState::Ready;
} }
self
// Double-clicked on a filled region
if let Some(layer) = document.click(input) {
// Select all points in the layer
shape_editor.select_connected_anchors(document, layer, input.mouse.position);
}
PathToolFsmState::Ready
} }
(_, PathToolMessage::Abort) => { (_, PathToolMessage::Abort) => {
responses.add(OverlaysMessage::Draw); responses.add(OverlaysMessage::Draw);