From c28d61829110a9894f1232442bf58670a1c56976 Mon Sep 17 00:00:00 2001 From: 0HyperCube <78500760+0HyperCube@users.noreply.github.com> Date: Sun, 28 Aug 2022 02:19:20 +0100 Subject: [PATCH] Fix fast drag with path tool eating handles (#763) * Fix fast drag with path tool eating handles * Remove extra space * Import ordering Co-authored-by: Keavon Chambers --- .../portfolio/document/document_message.rs | 1 - .../document/document_message_handler.rs | 4 +-- .../tool/common_functionality/shape_editor.rs | 5 ++-- .../messages/tool/tool_messages/path_tool.rs | 2 +- graphene/src/document.rs | 5 ++-- .../src/layers/vector/manipulator_group.rs | 27 +++++++------------ graphene/src/layers/vector/subpath.rs | 4 +-- graphene/src/operation.rs | 1 - 8 files changed, 18 insertions(+), 31 deletions(-) diff --git a/editor/src/messages/portfolio/document/document_message.rs b/editor/src/messages/portfolio/document/document_message.rs index e2486957..a1391c42 100644 --- a/editor/src/messages/portfolio/document/document_message.rs +++ b/editor/src/messages/portfolio/document/document_message.rs @@ -86,7 +86,6 @@ pub enum DocumentMessage { MoveSelectedManipulatorPoints { layer_path: Vec, delta: (f64, f64), - absolute_position: (f64, f64), }, NudgeSelectedLayers { delta_x: f64, diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index d9885a08..ff316853 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -436,10 +436,10 @@ impl MessageHandler { + MoveSelectedManipulatorPoints { layer_path, delta } => { self.backup(responses); if let Ok(_layer) = self.graphene_document.layer(&layer_path) { - responses.push_back(DocumentOperation::MoveSelectedManipulatorPoints { layer_path, delta, absolute_position }.into()); + responses.push_back(DocumentOperation::MoveSelectedManipulatorPoints { layer_path, delta }.into()); } } NudgeSelectedLayers { delta_x, delta_y } => { diff --git a/editor/src/messages/tool/common_functionality/shape_editor.rs b/editor/src/messages/tool/common_functionality/shape_editor.rs index 93be3086..4292c422 100644 --- a/editor/src/messages/tool/common_functionality/shape_editor.rs +++ b/editor/src/messages/tool/common_functionality/shape_editor.rs @@ -100,7 +100,7 @@ impl ShapeEditor { ); // Snap the selected point to the cursor if let Ok(viewspace) = document.generate_transform_relative_to_viewport(shape_layer_path) { - self.move_selected_points(mouse_position - viewspace.transform_point2(point_position), mouse_position, responses) + self.move_selected_points(mouse_position - viewspace.transform_point2(point_position), responses) } return Some(points); @@ -171,13 +171,12 @@ impl ShapeEditor { } /// Move the selected points by dragging the mouse. - pub fn move_selected_points(&self, delta: DVec2, absolute_position: DVec2, responses: &mut VecDeque) { + pub fn move_selected_points(&self, delta: DVec2, responses: &mut VecDeque) { for layer_path in &self.selected_layers { responses.push_back( DocumentMessage::MoveSelectedManipulatorPoints { layer_path: layer_path.clone(), delta: (delta.x, delta.y), - absolute_position: (absolute_position.x, absolute_position.y), } .into(), ); diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index f604a8ab..f6845d6a 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -260,7 +260,7 @@ impl Fsm for PathToolFsmState { // Move the selected points by the mouse position let snapped_position = tool_data.snap_manager.snap_position(responses, document, input.mouse.position); - tool_data.shape_editor.move_selected_points(snapped_position - tool_data.drag_start_pos, snapped_position, responses); + tool_data.shape_editor.move_selected_points(snapped_position - tool_data.drag_start_pos, responses); tool_data.drag_start_pos = snapped_position; PathToolFsmState::Dragging } diff --git a/graphene/src/document.rs b/graphene/src/document.rs index ef0e3cf1..cbcb86ef 100644 --- a/graphene/src/document.rs +++ b/graphene/src/document.rs @@ -971,14 +971,13 @@ impl Document { } Some(responses) } - Operation::MoveSelectedManipulatorPoints { layer_path, delta, absolute_position } => { + Operation::MoveSelectedManipulatorPoints { layer_path, delta } => { if let Ok(viewspace) = self.generate_transform_relative_to_viewport(&layer_path) { let objectspace = &viewspace.inverse(); let delta = objectspace.transform_vector2(DVec2::new(delta.0, delta.1)); - let absolute_position = objectspace.transform_point2(DVec2::new(absolute_position.0, absolute_position.1)); let layer = self.layer_mut(&layer_path)?; if let Some(shape) = layer.as_subpath_mut() { - shape.move_selected(delta, absolute_position, &viewspace); + shape.move_selected(delta); } } self.mark_as_dirty(&layer_path)?; diff --git a/graphene/src/layers/vector/manipulator_group.rs b/graphene/src/layers/vector/manipulator_group.rs index 52ae8314..85a9d095 100644 --- a/graphene/src/layers/vector/manipulator_group.rs +++ b/graphene/src/layers/vector/manipulator_group.rs @@ -1,7 +1,6 @@ -use super::{ - consts::{ManipulatorType, SELECTION_THRESHOLD}, - manipulator_point::ManipulatorPoint, -}; +use super::consts::ManipulatorType; +use super::manipulator_point::ManipulatorPoint; + use glam::{DAffine2, DVec2}; use serde::{Deserialize, Serialize}; @@ -95,22 +94,14 @@ impl ManipulatorGroup { } /// Move the selected points by the provided transform. - pub fn move_selected_points(&mut self, delta: DVec2, absolute_position: DVec2, viewspace: &DAffine2) { + pub fn move_selected_points(&mut self, delta: DVec2) { let mirror_angle = self.editor_state.mirror_angle_between_handles; // Invert distance since we want it to start disabled let mirror_distance = !self.editor_state.mirror_distance_between_handles; - // TODO Use an ID as opposed to distance, stopgap for now - // Transformed into viewspace so SELECTION_THRESHOLD is in pixels - let is_drag_target = |point: &mut ManipulatorPoint| -> bool { viewspace.transform_point2(absolute_position).distance(viewspace.transform_point2(point.position)) < SELECTION_THRESHOLD }; - // Move the point absolutely or relatively depending on if the point is under the cursor (the last selected point) - let move_point = |point: &mut ManipulatorPoint, delta: DVec2, absolute_position: DVec2| { - if is_drag_target(point) { - point.position = absolute_position; - } else { - point.position += delta; - } + let move_point = |point: &mut ManipulatorPoint, delta: DVec2| { + point.position += delta; assert!(point.position.is_finite(), "Point is not finite!") }; @@ -139,7 +130,7 @@ impl ManipulatorGroup { // If the anchor is selected, ignore any handle mirroring/dragging and drag all points if self.is_anchor_selected() { for point in self.points_mut() { - move_point(point, delta, absolute_position); + move_point(point, delta); } return; } @@ -147,7 +138,7 @@ impl ManipulatorGroup { // If the anchor isn't selected, but both handles are, drag only handles if self.both_handles_selected() { for point in self.selected_handles_mut() { - move_point(point, delta, absolute_position); + move_point(point, delta); } return; } @@ -156,7 +147,7 @@ impl ManipulatorGroup { // Drag the single handle let reflect_center = self.points[ManipulatorType::Anchor].as_ref().unwrap().position; let selected_handle = self.selected_handles_mut().next().unwrap(); - move_point(selected_handle, delta, absolute_position); + move_point(selected_handle, delta); // Move the opposing handle symmetrically if our mirroring flags allow let selected_handle = &selected_handle.clone(); diff --git a/graphene/src/layers/vector/subpath.rs b/graphene/src/layers/vector/subpath.rs index f8a81f8c..163b3e3d 100644 --- a/graphene/src/layers/vector/subpath.rs +++ b/graphene/src/layers/vector/subpath.rs @@ -179,9 +179,9 @@ impl Subpath { } /// Move the selected points by the delta vector - pub fn move_selected(&mut self, delta: DVec2, absolute_position: DVec2, viewspace: &DAffine2) { + pub fn move_selected(&mut self, delta: DVec2) { self.selected_manipulator_groups_any_points_mut() - .for_each(|manipulator_group| manipulator_group.move_selected_points(delta, absolute_position, viewspace)); + .for_each(|manipulator_group| manipulator_group.move_selected_points(delta)); } /// Delete the selected points from the [Subpath] diff --git a/graphene/src/operation.rs b/graphene/src/operation.rs index c838a449..8ca84ced 100644 --- a/graphene/src/operation.rs +++ b/graphene/src/operation.rs @@ -122,7 +122,6 @@ pub enum Operation { MoveSelectedManipulatorPoints { layer_path: Vec, delta: (f64, f64), - absolute_position: (f64, f64), }, MoveManipulatorPoint { layer_path: Vec,