@@ -151,6 +151,9 @@ enum LineEnd {
151151
152152#[ derive( Clone , Debug , Default ) ]
153153struct LineToolData {
154+ drag_begin : DVec2 ,
155+ drag_start_shifted : DVec2 ,
156+ drag_current_shifted : DVec2 ,
154157 drag_start : DVec2 ,
155158 drag_current : DVec2 ,
156159 angle : f64 ,
@@ -188,7 +191,7 @@ impl Fsm for LineToolFsmState {
188191 } ;
189192
190193 let [ viewport_start, viewport_end] = [ start, end] . map ( |point| document. metadata ( ) . transform_to_viewport ( layer) . transform_point2 ( point) ) ;
191- if ( start. x - end . x ) . abs ( ) > f64 :: EPSILON * 1000. && ( start . y - end. y ) . abs ( ) > f64:: EPSILON * 1000. {
194+ if ! start. abs_diff_eq ( end, f64:: EPSILON * 1000. ) {
192195 overlay_context. line ( viewport_start, viewport_end, None , None ) ;
193196 overlay_context. square ( viewport_start, Some ( 6. ) , None , None ) ;
194197 overlay_context. square ( viewport_end, Some ( 6. ) , None , None ) ;
@@ -204,6 +207,7 @@ impl Fsm for LineToolFsmState {
204207 let point = SnapCandidatePoint :: handle ( document. metadata ( ) . document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ) ;
205208 let snapped = tool_data. snap_manager . free_snap ( & SnapData :: new ( document, input) , & point, SnapTypeConfiguration :: default ( ) ) ;
206209 tool_data. drag_start = snapped. snapped_point_document ;
210+ tool_data. drag_begin = document. metadata ( ) . document_to_viewport . transform_point2 ( tool_data. drag_start ) ;
207211
208212 responses. add ( DocumentMessage :: StartTransaction ) ;
209213
@@ -256,7 +260,9 @@ impl Fsm for LineToolFsmState {
256260 ( LineToolFsmState :: Drawing , LineToolMessage :: PointerMove { center, snap_angle, lock_angle } ) => {
257261 let Some ( layer) = tool_data. editing_layer else { return LineToolFsmState :: Ready } ;
258262
259- tool_data. drag_current = document. metadata ( ) . transform_to_viewport ( layer) . inverse ( ) . transform_point2 ( input. mouse . position ) ;
263+ tool_data. drag_current_shifted = document. metadata ( ) . transform_to_viewport ( layer) . inverse ( ) . transform_point2 ( input. mouse . position ) ;
264+ tool_data. drag_current = document. metadata ( ) . document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ;
265+ tool_data. drag_start_shifted = document. metadata ( ) . transform_to_viewport ( layer) . inverse ( ) . transform_point2 ( tool_data. drag_begin ) ;
260266
261267 let keyboard = & input. keyboard ;
262268 let ignore = vec ! [ layer] ;
@@ -361,6 +367,7 @@ impl Fsm for LineToolFsmState {
361367}
362368
363369fn generate_line ( tool_data : & mut LineToolData , snap_data : SnapData , lock_angle : bool , snap_angle : bool , center : bool ) -> [ DVec2 ; 2 ] {
370+ let shift = tool_data. drag_current_shifted - tool_data. drag_current ;
364371 let mut document_points = [ tool_data. drag_start , tool_data. drag_current ] ;
365372
366373 let mut angle = -( document_points[ 1 ] - document_points[ 0 ] ) . angle_to ( DVec2 :: X ) ;
@@ -419,7 +426,8 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
419426 snap. update_indicator ( snapped) ;
420427 }
421428
422- document_points
429+ // Snapping happens in other space, while document graph renders in another.
430+ document_points. map ( |vector| vector + shift)
423431}
424432
425433#[ cfg( test) ]
0 commit comments