From 60019677b371941d3535459b8fb2e6e3ea7a6daa Mon Sep 17 00:00:00 2001 From: nng98 Date: Thu, 11 Dec 2025 11:11:10 -0500 Subject: [PATCH 1/4] Added initial nudge-scaling for alt key --- .../messages/input_mapper/input_mappings.rs | 53 ++++++++++--------- .../tool/common_functionality/shape_editor.rs | 22 ++++++++ .../messages/tool/tool_messages/path_tool.rs | 16 +++--- 3 files changed, 60 insertions(+), 31 deletions(-) diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index 34d6ed0b3b..fd9569afa9 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -104,6 +104,7 @@ pub fn input_mappings() -> Mapping { entry!(DoubleClick(MouseButton::Left); action_dispatch=SelectToolMessage::EditLayer), entry!(KeyDown(MouseRight); action_dispatch=SelectToolMessage::Abort), entry!(KeyDown(Escape); action_dispatch=SelectToolMessage::Abort), + // // ArtboardToolMessage entry!(KeyDown(MouseLeft); action_dispatch=ArtboardToolMessage::PointerDown), @@ -231,30 +232,34 @@ pub fn input_mappings() -> Mapping { entry!(KeyUp(MouseLeft); action_dispatch=PathToolMessage::DragStop { extend_selection: Shift, shrink_selection: Alt }), entry!(KeyDown(Enter); action_dispatch=PathToolMessage::Enter { extend_selection: Shift, shrink_selection: Alt }), entry!(DoubleClick(MouseButton::Left); action_dispatch=PathToolMessage::DoubleClick { extend_selection: Shift, shrink_selection: Alt }), - entry!(KeyDown(ArrowRight); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: 0. }), - entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0. }), - entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowUp); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowLeft); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0. }), - entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0. }), - entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowDown); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowRight); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: 0., nudge_alt: false}), + entry!(KeyDown(ArrowRight); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: 0., nudge_alt: true}), + entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0., nudge_alt: false}), + entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowUp); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowUp); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: true}), + entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowLeft); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: false}), + entry!(KeyDown(ArrowLeft); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: true}), + entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0., nudge_alt: false}), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowDown); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowDown); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: true}), + entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), entry!(KeyDown(KeyJ); modifiers=[Accel], action_dispatch=ToolMessage::Path(PathToolMessage::ClosePath)), // // PenToolMessage diff --git a/editor/src/messages/tool/common_functionality/shape_editor.rs b/editor/src/messages/tool/common_functionality/shape_editor.rs index 5f00d97111..876861d5a3 100644 --- a/editor/src/messages/tool/common_functionality/shape_editor.rs +++ b/editor/src/messages/tool/common_functionality/shape_editor.rs @@ -1206,6 +1206,7 @@ impl ShapeState { opposite_handle_position: Option, skip_opposite_handle: bool, responses: &mut VecDeque, + bot_right: bool, ) { for (&layer, state) in &self.selected_shape_state { let Some(vector) = document.network_interface.compute_modified_vector(layer) else { continue }; @@ -1221,6 +1222,20 @@ impl ShapeState { }; let delta = delta_transform.inverse().transform_vector2(delta); + let center = if bot_right { + let points: Vec = state + .selected_points() + .filter_map(|point| point.get_position(&vector)) + .collect(); + if points.is_empty() { + continue; + } + let sum = points.iter().fold(DVec2::ZERO, |acc, &p| acc + p); + Some(sum / points.len() as f64) + } else { + None + }; + // Make a new collection of anchor points which needs to be moved let mut affected_points = state.selected_points.clone(); @@ -1236,6 +1251,13 @@ impl ShapeState { continue; } + if let Some(center) = center { + let Some(point_position) = point.get_position(&vector) else { continue }; + if point_position.x <= center.x || point_position.y <= center.y { + continue; + } + } + let handle = match point { ManipulatorPointId::Anchor(point) => { self.move_anchor(point, &vector, delta, layer, Some(state), responses); diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index be300ebe5c..f8ddfaf4a0 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -92,6 +92,7 @@ pub enum PathToolMessage { NudgeSelectedPoints { delta_x: f64, delta_y: f64, + nudge_alt: bool, }, PointerMove { equidistant: Key, @@ -1148,7 +1149,7 @@ impl PathToolData { let drag_start = self.drag_start_pos; let opposite_delta = drag_start - current_mouse; - shape_editor.move_selected_points_and_segments(None, document, opposite_delta, false, true, false, None, false, responses); + shape_editor.move_selected_points_and_segments(None, document, opposite_delta, false, true, false, None, false, responses, false); // Calculate the projected delta and shift the points along that delta let delta = current_mouse - drag_start; @@ -1160,7 +1161,7 @@ impl PathToolData { _ => DVec2::new(delta.x, 0.), }; - shape_editor.move_selected_points_and_segments(None, document, projected_delta, false, true, false, None, false, responses); + shape_editor.move_selected_points_and_segments(None, document, projected_delta, false, true, false, None, false, responses, false); } fn stop_snap_along_axis(&mut self, shape_editor: &mut ShapeState, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque) { @@ -1176,12 +1177,12 @@ impl PathToolData { _ => DVec2::new(opposite_delta.x, 0.), }; - shape_editor.move_selected_points_and_segments(None, document, opposite_projected_delta, false, true, false, None, false, responses); + shape_editor.move_selected_points_and_segments(None, document, opposite_projected_delta, false, true, false, None, false, responses, false); // Calculate what actually would have been the original delta for the point, and apply that let delta = current_mouse - drag_start; - shape_editor.move_selected_points_and_segments(None, document, delta, false, true, false, None, false, responses); + shape_editor.move_selected_points_and_segments(None, document, delta, false, true, false, None, false, responses, false); self.snapping_axis = None; } @@ -1504,7 +1505,7 @@ impl PathToolData { self.temporary_colinear_handles = false; skip_opposite = true; } - shape_editor.move_selected_points_and_segments(handle_lengths, document, snapped_delta, equidistant, true, was_alt_dragging, opposite, skip_opposite, responses); + shape_editor.move_selected_points_and_segments(handle_lengths, document, snapped_delta, equidistant, true, was_alt_dragging, opposite, skip_opposite, responses, false); self.previous_mouse_position += document_to_viewport.inverse().transform_vector2(snapped_delta); } else { let Some(axis) = self.snapping_axis else { return }; @@ -1513,7 +1514,7 @@ impl PathToolData { Axis::Y => DVec2::new(0., unsnapped_delta.y), _ => DVec2::new(unsnapped_delta.x, 0.), }; - shape_editor.move_selected_points_and_segments(handle_lengths, document, projected_delta, equidistant, true, false, opposite, false, responses); + shape_editor.move_selected_points_and_segments(handle_lengths, document, projected_delta, equidistant, true, false, opposite, false, responses, false); self.previous_mouse_position += document_to_viewport.inverse().transform_vector2(unsnapped_delta); } @@ -3063,7 +3064,7 @@ impl Fsm for PathToolFsmState { responses.add(OverlaysMessage::Draw); PathToolFsmState::Ready } - (_, PathToolMessage::NudgeSelectedPoints { delta_x, delta_y }) => { + (_, PathToolMessage::NudgeSelectedPoints { delta_x, delta_y, nudge_alt}) => { shape_editor.move_selected_points_and_segments( tool_data.opposing_handle_lengths.take(), document, @@ -3074,6 +3075,7 @@ impl Fsm for PathToolFsmState { tool_data.opposite_handle_position, false, responses, + nudge_alt, ); PathToolFsmState::Ready From 36f4ba5596482a7d1d865b334ee7ad6b4754fa8a Mon Sep 17 00:00:00 2001 From: Matthew Mingus Date: Thu, 11 Dec 2025 17:15:04 -0500 Subject: [PATCH 2/4] add nudge scaling support for alt and control key press --- .../messages/input_mapper/input_mappings.rs | 60 ++++++++++--------- .../tool/common_functionality/shape_editor.rs | 45 ++++++++------ .../messages/tool/tool_messages/path_tool.rs | 16 ++--- 3 files changed, 68 insertions(+), 53 deletions(-) diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index fd9569afa9..2f72ea8230 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -232,34 +232,38 @@ pub fn input_mappings() -> Mapping { entry!(KeyUp(MouseLeft); action_dispatch=PathToolMessage::DragStop { extend_selection: Shift, shrink_selection: Alt }), entry!(KeyDown(Enter); action_dispatch=PathToolMessage::Enter { extend_selection: Shift, shrink_selection: Alt }), entry!(DoubleClick(MouseButton::Left); action_dispatch=PathToolMessage::DoubleClick { extend_selection: Shift, shrink_selection: Alt }), - entry!(KeyDown(ArrowRight); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: 0., nudge_alt: false}), - entry!(KeyDown(ArrowRight); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: 0., nudge_alt: true}), - entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0., nudge_alt: false}), - entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowUp); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowUp); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: true}), - entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowLeft); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: false}), - entry!(KeyDown(ArrowLeft); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: true}), - entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0., nudge_alt: false}), - entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowDown); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowDown); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: true}), - entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), - entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false}), + entry!(KeyDown(ArrowRight); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: 0., nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[Control, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: 0., nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowRight); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: 0., nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0., nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[Control, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowUp); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[Control, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowLeft); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0., nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[Control, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowDown); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(KeyJ); modifiers=[Accel], action_dispatch=ToolMessage::Path(PathToolMessage::ClosePath)), // // PenToolMessage diff --git a/editor/src/messages/tool/common_functionality/shape_editor.rs b/editor/src/messages/tool/common_functionality/shape_editor.rs index 876861d5a3..0935572a75 100644 --- a/editor/src/messages/tool/common_functionality/shape_editor.rs +++ b/editor/src/messages/tool/common_functionality/shape_editor.rs @@ -1207,6 +1207,7 @@ impl ShapeState { skip_opposite_handle: bool, responses: &mut VecDeque, bot_right: bool, + top_left: bool, ) { for (&layer, state) in &self.selected_shape_state { let Some(vector) = document.network_interface.compute_modified_vector(layer) else { continue }; @@ -1222,19 +1223,19 @@ impl ShapeState { }; let delta = delta_transform.inverse().transform_vector2(delta); - let center = if bot_right { - let points: Vec = state - .selected_points() - .filter_map(|point| point.get_position(&vector)) - .collect(); - if points.is_empty() { - continue; - } - let sum = points.iter().fold(DVec2::ZERO, |acc, &p| acc + p); - Some(sum / points.len() as f64) - } else { - None - }; + let center = if bot_right || top_left { + let points: Vec = state + .selected_points() + .filter_map(|point| point.get_position(&vector)) + .collect(); + if points.is_empty() { + continue; + } + let sum = points.iter().fold(DVec2::ZERO, |acc, &p| acc + p); + Some(sum / points.len() as f64) + } else { + None + }; // Make a new collection of anchor points which needs to be moved let mut affected_points = state.selected_points.clone(); @@ -1252,11 +1253,19 @@ impl ShapeState { } if let Some(center) = center { - let Some(point_position) = point.get_position(&vector) else { continue }; - if point_position.x <= center.x || point_position.y <= center.y { - continue; - } - } + let Some(point_position) = point.get_position(&vector) else { continue }; + if bot_right { + // Only move points on/below-right of center for bottom-right scaling + if !(point_position.x >= center.x && point_position.y >= center.y) { + continue; + } + } else if top_left { + // only move points on/above-left of center for top-left scaling + if !(point_position.x <= center.x && point_position.y <= center.y) { + continue; + } + } + } let handle = match point { ManipulatorPointId::Anchor(point) => { diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index f8ddfaf4a0..f83d87df74 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -93,6 +93,7 @@ pub enum PathToolMessage { delta_x: f64, delta_y: f64, nudge_alt: bool, + nudge_ctrl: bool, }, PointerMove { equidistant: Key, @@ -1149,7 +1150,7 @@ impl PathToolData { let drag_start = self.drag_start_pos; let opposite_delta = drag_start - current_mouse; - shape_editor.move_selected_points_and_segments(None, document, opposite_delta, false, true, false, None, false, responses, false); + shape_editor.move_selected_points_and_segments(None, document, opposite_delta, false, true, false, None, false, responses, false, false); // Calculate the projected delta and shift the points along that delta let delta = current_mouse - drag_start; @@ -1161,7 +1162,7 @@ impl PathToolData { _ => DVec2::new(delta.x, 0.), }; - shape_editor.move_selected_points_and_segments(None, document, projected_delta, false, true, false, None, false, responses, false); + shape_editor.move_selected_points_and_segments(None, document, projected_delta, false, true, false, None, false, responses, false, false); } fn stop_snap_along_axis(&mut self, shape_editor: &mut ShapeState, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque) { @@ -1177,12 +1178,12 @@ impl PathToolData { _ => DVec2::new(opposite_delta.x, 0.), }; - shape_editor.move_selected_points_and_segments(None, document, opposite_projected_delta, false, true, false, None, false, responses, false); + shape_editor.move_selected_points_and_segments(None, document, opposite_projected_delta, false, true, false, None, false, responses, false, false); // Calculate what actually would have been the original delta for the point, and apply that let delta = current_mouse - drag_start; - shape_editor.move_selected_points_and_segments(None, document, delta, false, true, false, None, false, responses, false); + shape_editor.move_selected_points_and_segments(None, document, delta, false, true, false, None, false, responses, false, false); self.snapping_axis = None; } @@ -1505,7 +1506,7 @@ impl PathToolData { self.temporary_colinear_handles = false; skip_opposite = true; } - shape_editor.move_selected_points_and_segments(handle_lengths, document, snapped_delta, equidistant, true, was_alt_dragging, opposite, skip_opposite, responses, false); + shape_editor.move_selected_points_and_segments(handle_lengths, document, snapped_delta, equidistant, true, was_alt_dragging, opposite, skip_opposite, responses, false, false,); self.previous_mouse_position += document_to_viewport.inverse().transform_vector2(snapped_delta); } else { let Some(axis) = self.snapping_axis else { return }; @@ -1514,7 +1515,7 @@ impl PathToolData { Axis::Y => DVec2::new(0., unsnapped_delta.y), _ => DVec2::new(unsnapped_delta.x, 0.), }; - shape_editor.move_selected_points_and_segments(handle_lengths, document, projected_delta, equidistant, true, false, opposite, false, responses, false); + shape_editor.move_selected_points_and_segments(handle_lengths, document, projected_delta, equidistant, true, false, opposite, false, responses, false, false); self.previous_mouse_position += document_to_viewport.inverse().transform_vector2(unsnapped_delta); } @@ -3064,7 +3065,7 @@ impl Fsm for PathToolFsmState { responses.add(OverlaysMessage::Draw); PathToolFsmState::Ready } - (_, PathToolMessage::NudgeSelectedPoints { delta_x, delta_y, nudge_alt}) => { + (_, PathToolMessage::NudgeSelectedPoints { delta_x, delta_y, nudge_alt, nudge_ctrl}) => { shape_editor.move_selected_points_and_segments( tool_data.opposing_handle_lengths.take(), document, @@ -3076,6 +3077,7 @@ impl Fsm for PathToolFsmState { false, responses, nudge_alt, + nudge_ctrl, ); PathToolFsmState::Ready From abea0e5d0de9a2a63e275fd2d912cce66983982c Mon Sep 17 00:00:00 2001 From: Matthew Mingus Date: Thu, 11 Dec 2025 17:41:29 -0500 Subject: [PATCH 3/4] add nudge scaling support for control and alt key diagonal movements --- .../messages/input_mapper/input_mappings.rs | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index 2f72ea8230..ae9d86c154 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -104,7 +104,6 @@ pub fn input_mappings() -> Mapping { entry!(DoubleClick(MouseButton::Left); action_dispatch=SelectToolMessage::EditLayer), entry!(KeyDown(MouseRight); action_dispatch=SelectToolMessage::Abort), entry!(KeyDown(Escape); action_dispatch=SelectToolMessage::Abort), - // // ArtboardToolMessage entry!(KeyDown(MouseLeft); action_dispatch=ArtboardToolMessage::PointerDown), @@ -240,6 +239,14 @@ pub fn input_mappings() -> Mapping { entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowUp, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowDown, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowUp, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowDown, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), entry!(KeyDown(ArrowUp); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowUp); modifiers=[Control, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), entry!(KeyDown(ArrowUp); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: -NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), @@ -248,6 +255,14 @@ pub fn input_mappings() -> Mapping { entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowRight, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowRight, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), entry!(KeyDown(ArrowLeft); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowLeft); modifiers=[Control, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: false, nudge_ctrl: true }), entry!(KeyDown(ArrowLeft); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: 0., nudge_alt: true, nudge_ctrl: false }), @@ -256,6 +271,14 @@ pub fn input_mappings() -> Mapping { entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), entry!(KeyDown(ArrowDown); action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowDown); modifiers=[Control, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), entry!(KeyDown(ArrowDown); modifiers=[Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: 0., delta_y: NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), @@ -264,6 +287,14 @@ pub fn input_mappings() -> Mapping { entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowRight, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowRight, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight, Alt], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: true, nudge_ctrl: false }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight, Alt, Control], action_dispatch=PathToolMessage::NudgeSelectedPoints { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, nudge_alt: false, nudge_ctrl: true }), entry!(KeyDown(KeyJ); modifiers=[Accel], action_dispatch=ToolMessage::Path(PathToolMessage::ClosePath)), // // PenToolMessage From a02810feee6742ba29f7ca08222355574c6714be Mon Sep 17 00:00:00 2001 From: Matthew Mingus Date: Thu, 11 Dec 2025 17:49:00 -0500 Subject: [PATCH 4/4] format fix from cargo fmt --- .../tool/common_functionality/shape_editor.rs | 5 +---- editor/src/messages/tool/tool_messages/path_tool.rs | 12 ++++++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/editor/src/messages/tool/common_functionality/shape_editor.rs b/editor/src/messages/tool/common_functionality/shape_editor.rs index 0935572a75..fb022a7f75 100644 --- a/editor/src/messages/tool/common_functionality/shape_editor.rs +++ b/editor/src/messages/tool/common_functionality/shape_editor.rs @@ -1224,10 +1224,7 @@ impl ShapeState { let delta = delta_transform.inverse().transform_vector2(delta); let center = if bot_right || top_left { - let points: Vec = state - .selected_points() - .filter_map(|point| point.get_position(&vector)) - .collect(); + let points: Vec = state.selected_points().filter_map(|point| point.get_position(&vector)).collect(); if points.is_empty() { continue; } diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index f83d87df74..bcd97f687f 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -1506,7 +1506,7 @@ impl PathToolData { self.temporary_colinear_handles = false; skip_opposite = true; } - shape_editor.move_selected_points_and_segments(handle_lengths, document, snapped_delta, equidistant, true, was_alt_dragging, opposite, skip_opposite, responses, false, false,); + shape_editor.move_selected_points_and_segments(handle_lengths, document, snapped_delta, equidistant, true, was_alt_dragging, opposite, skip_opposite, responses, false, false); self.previous_mouse_position += document_to_viewport.inverse().transform_vector2(snapped_delta); } else { let Some(axis) = self.snapping_axis else { return }; @@ -3065,7 +3065,15 @@ impl Fsm for PathToolFsmState { responses.add(OverlaysMessage::Draw); PathToolFsmState::Ready } - (_, PathToolMessage::NudgeSelectedPoints { delta_x, delta_y, nudge_alt, nudge_ctrl}) => { + ( + _, + PathToolMessage::NudgeSelectedPoints { + delta_x, + delta_y, + nudge_alt, + nudge_ctrl, + }, + ) => { shape_editor.move_selected_points_and_segments( tool_data.opposing_handle_lengths.take(), document,