@@ -394,6 +394,7 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
394
394
395
395
let near_point = SnapCandidatePoint :: handle_neighbors ( document_points[ 1 ] , [ tool_data. drag_start ] ) ;
396
396
let far_point = SnapCandidatePoint :: handle_neighbors ( 2. * document_points[ 0 ] - document_points[ 1 ] , [ tool_data. drag_start ] ) ;
397
+ let mid_point = SnapCandidatePoint :: handle_neighbors ( ( tool_data. drag_start + document_points[ 1 ] ) / 2. , [ tool_data. drag_start ] ) ;
397
398
let config = SnapTypeConfiguration :: default ( ) ;
398
399
399
400
if constrained {
@@ -410,8 +411,15 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
410
411
snap. update_indicator ( best) ;
411
412
} else {
412
413
let snapped = snap. constrained_snap ( & snap_data, & near_point, constraint, config) ;
413
- document_points[ 1 ] = snapped. snapped_point_document ;
414
- snap. update_indicator ( snapped) ;
414
+ let snapped_mid = snap. constrained_snap ( & snap_data, & mid_point, constraint, config) ;
415
+ let best = if snap_data. document . snapping_state . path . line_midpoint && snapped_mid. other_snap_better ( & snapped_mid) {
416
+ document_points[ 1 ] += ( snapped_mid. snapped_point_document - mid_point. document_point ) * 2. ;
417
+ snapped_mid
418
+ } else {
419
+ document_points[ 1 ] = snapped. snapped_point_document ;
420
+ snapped. clone ( )
421
+ } ;
422
+ snap. update_indicator ( best) ;
415
423
}
416
424
} else if center {
417
425
let snapped = snap. free_snap ( & snap_data, & near_point, config) ;
@@ -422,8 +430,15 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
422
430
snap. update_indicator ( best) ;
423
431
} else {
424
432
let snapped = snap. free_snap ( & snap_data, & near_point, config) ;
425
- document_points[ 1 ] = snapped. snapped_point_document ;
426
- snap. update_indicator ( snapped) ;
433
+ let snapped_mid = snap. free_snap ( & snap_data, & mid_point, config) ;
434
+ let best = if snap_data. document . snapping_state . path . line_midpoint && snapped_mid. other_snap_better ( & snapped_mid) {
435
+ document_points[ 1 ] += ( snapped_mid. snapped_point_document - mid_point. document_point ) * 2. ;
436
+ snapped_mid
437
+ } else {
438
+ document_points[ 1 ] = snapped. snapped_point_document ;
439
+ snapped. clone ( )
440
+ } ;
441
+ snap. update_indicator ( best) ;
427
442
}
428
443
429
444
// Snapping happens in other space, while document graph renders in another.
@@ -433,7 +448,8 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
433
448
#[ cfg( test) ]
434
449
mod test_line_tool {
435
450
use crate :: messages:: portfolio:: document:: graph_operation:: utility_types:: TransformIn ;
436
- use crate :: { messages:: tool:: common_functionality:: graph_modification_utils:: NodeGraphLayer , test_utils:: test_prelude:: * } ;
451
+ use crate :: messages:: tool:: common_functionality:: graph_modification_utils:: NodeGraphLayer ;
452
+ use crate :: test_utils:: test_prelude:: * ;
437
453
use glam:: DAffine2 ;
438
454
use graph_craft:: document:: value:: TaggedValue ;
439
455
0 commit comments