@@ -151,6 +151,9 @@ enum LineEnd {
151
151
152
152
#[ derive( Clone , Debug , Default ) ]
153
153
struct LineToolData {
154
+ drag_begin : DVec2 ,
155
+ drag_start_shifted : DVec2 ,
156
+ drag_current_shifted : DVec2 ,
154
157
drag_start : DVec2 ,
155
158
drag_current : DVec2 ,
156
159
angle : f64 ,
@@ -188,7 +191,7 @@ impl Fsm for LineToolFsmState {
188
191
} ;
189
192
190
193
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. ) {
192
195
overlay_context. line ( viewport_start, viewport_end, None , None ) ;
193
196
overlay_context. square ( viewport_start, Some ( 6. ) , None , None ) ;
194
197
overlay_context. square ( viewport_end, Some ( 6. ) , None , None ) ;
@@ -204,6 +207,7 @@ impl Fsm for LineToolFsmState {
204
207
let point = SnapCandidatePoint :: handle ( document. metadata ( ) . document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ) ;
205
208
let snapped = tool_data. snap_manager . free_snap ( & SnapData :: new ( document, input) , & point, SnapTypeConfiguration :: default ( ) ) ;
206
209
tool_data. drag_start = snapped. snapped_point_document ;
210
+ tool_data. drag_begin = document. metadata ( ) . document_to_viewport . transform_point2 ( tool_data. drag_start ) ;
207
211
208
212
responses. add ( DocumentMessage :: StartTransaction ) ;
209
213
@@ -256,7 +260,9 @@ impl Fsm for LineToolFsmState {
256
260
( LineToolFsmState :: Drawing , LineToolMessage :: PointerMove { center, snap_angle, lock_angle } ) => {
257
261
let Some ( layer) = tool_data. editing_layer else { return LineToolFsmState :: Ready } ;
258
262
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 ) ;
260
266
261
267
let keyboard = & input. keyboard ;
262
268
let ignore = vec ! [ layer] ;
@@ -361,6 +367,7 @@ impl Fsm for LineToolFsmState {
361
367
}
362
368
363
369
fn 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 ;
364
371
let mut document_points = [ tool_data. drag_start , tool_data. drag_current ] ;
365
372
366
373
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:
419
426
snap. update_indicator ( snapped) ;
420
427
}
421
428
422
- document_points
429
+ // Snapping happens in other space, while document graph renders in another.
430
+ document_points. map ( |vector| vector + shift)
423
431
}
424
432
425
433
#[ cfg( test) ]
0 commit comments