@@ -590,6 +590,7 @@ struct PathToolData {
590590 last_clicked_point_was_selected : bool ,
591591 last_clicked_segment_was_selected : bool ,
592592 snapping_axis : Option < Axis > ,
593+ snap_axis_origin : Option < DVec2 > ,
593594 alt_clicked_on_anchor : bool ,
594595 alt_dragging_from_anchor : bool ,
595596 angle_locked : bool ,
@@ -1974,7 +1975,7 @@ impl Fsm for PathToolFsmState {
19741975 // Draw the snapping axis lines
19751976 if tool_data. snapping_axis . is_some ( ) {
19761977 let Some ( axis) = tool_data. snapping_axis else { return self } ;
1977- let origin = tool_data. snap_manager . indicator_pos ( ) . unwrap_or ( tool_data. drag_start_pos ) ;
1978+ let origin = tool_data. snap_axis_origin . or_else ( || tool_data . snap_manager . indicator_pos ( ) ) . unwrap_or ( tool_data. drag_start_pos ) ;
19781979 let viewport_diagonal = viewport. size ( ) . into_dvec2 ( ) . length ( ) ;
19791980
19801981 let faded = |color : & str | {
@@ -2124,16 +2125,35 @@ impl Fsm for PathToolFsmState {
21242125 {
21252126 // Constrain molding to a single axis when Shift is held
21262127 let mouse_position = if snap_axis_state {
2127- let delta = input. mouse . position - tool_data. drag_start_pos ;
2128+ // Calculate the midpoint between the segment's two anchor endpoints for the axis overlay
2129+ let midpoint = if let Some ( vector) = document. network_interface . compute_modified_vector ( segment. layer ( ) ) {
2130+ let transform = document. metadata ( ) . transform_to_viewport ( segment. layer ( ) ) ;
2131+ let points = segment. points ( ) ;
2132+ let pos1 = vector. point_domain . position_from_id ( points[ 0 ] ) ;
2133+ let pos2 = vector. point_domain . position_from_id ( points[ 1 ] ) ;
2134+ if let ( Some ( p1) , Some ( p2) ) = ( pos1, pos2) {
2135+ ( transform. transform_point2 ( p1) + transform. transform_point2 ( p2) ) / 2.0
2136+ } else {
2137+ tool_data. drag_start_pos
2138+ }
2139+ } else {
2140+ tool_data. drag_start_pos
2141+ } ;
2142+ tool_data. snap_axis_origin = Some ( midpoint) ;
2143+
2144+ // Constrain mouse movement relative to drag start so molding delta stays correct
2145+ let drag_start = tool_data. drag_start_pos ;
2146+ let delta = input. mouse . position - drag_start;
21282147 let axis = if delta. x . abs ( ) >= delta. y . abs ( ) { Axis :: X } else { Axis :: Y } ;
21292148 tool_data. snapping_axis = Some ( axis) ;
21302149 match axis {
2131- Axis :: X => DVec2 :: new ( input. mouse . position . x , tool_data . drag_start_pos . y ) ,
2132- Axis :: Y => DVec2 :: new ( tool_data . drag_start_pos . x , input. mouse . position . y ) ,
2150+ Axis :: X => DVec2 :: new ( input. mouse . position . x , drag_start . y ) ,
2151+ Axis :: Y => DVec2 :: new ( drag_start . x , input. mouse . position . y ) ,
21332152 _ => input. mouse . position ,
21342153 }
21352154 } else {
21362155 tool_data. snapping_axis = None ;
2156+ tool_data. snap_axis_origin = None ;
21372157 input. mouse . position
21382158 } ;
21392159
@@ -2397,6 +2417,7 @@ impl Fsm for PathToolFsmState {
23972417 tool_data. temporary_adjacent_handles_while_molding = None ;
23982418 tool_data. angle_locked = false ;
23992419 tool_data. snapping_axis = None ;
2420+ tool_data. snap_axis_origin = None ;
24002421 responses. add ( DocumentMessage :: AbortTransaction ) ;
24012422 tool_data. snap_manager . cleanup ( responses) ;
24022423 PathToolFsmState :: Ready
@@ -2645,6 +2666,7 @@ impl Fsm for PathToolFsmState {
26452666 }
26462667
26472668 tool_data. snapping_axis = None ;
2669+ tool_data. snap_axis_origin = None ;
26482670 tool_data. sliding_point_info = None ;
26492671
26502672 if drag_occurred || extend_selection {
0 commit comments