@@ -267,6 +267,7 @@ struct PenToolData {
267
267
g1_continuous : bool ,
268
268
toggle_colinear_debounce : bool ,
269
269
270
+ // The segment that the end point is on before it is bent
270
271
segment_end_before_bent : Option < SegmentId > ,
271
272
272
273
angle : f64 ,
@@ -280,6 +281,7 @@ struct PenToolData {
280
281
alt_press : bool ,
281
282
282
283
handle_mode : HandleMode ,
284
+ // The point that is being dragged
283
285
end_point : Option < PointId > ,
284
286
end_point_segment : Option < SegmentId > ,
285
287
}
@@ -317,7 +319,7 @@ impl PenToolData {
317
319
}
318
320
319
321
/// If the user places the anchor on top of the previous anchor, it becomes sharp and the outgoing handle may be dragged.
320
- fn bend_from_previous_point ( & mut self , snap_data : SnapData , transform : DAffine2 , layer : LayerNodeIdentifier ) {
322
+ fn bend_from_previous_point ( & mut self , snap_data : SnapData , transform : DAffine2 , layer : LayerNodeIdentifier , preferences : & PreferencesMessageHandler ) {
321
323
self . g1_continuous = true ;
322
324
let document = snap_data. document ;
323
325
self . next_handle_start = self . next_point ;
@@ -333,15 +335,15 @@ impl PenToolData {
333
335
self . handle_end = None ;
334
336
self . segment_end_before_bent = last_segment. copied ( ) ;
335
337
self . end_point_segment = last_segment. copied ( ) ;
338
+ self . check_if_different_path ( document, snap_data. input , preferences) ;
339
+ self . handle_mode = HandleMode :: Free ;
336
340
337
341
if let Some ( point) = self . latest_point_mut ( ) {
338
342
point. in_segment = None ;
339
343
}
340
344
341
345
if self . modifiers . lock_angle {
342
346
self . set_lock_angle ( & vector_data, self . latest_point ( ) . unwrap ( ) . id , last_segment. copied ( ) ) ;
343
- } else {
344
- self . handle_mode = HandleMode :: Free ;
345
347
}
346
348
}
347
349
}
@@ -391,6 +393,7 @@ impl PenToolData {
391
393
let points = [ start, end] ;
392
394
let id = SegmentId :: generate ( ) ;
393
395
self . segment_end_before_bent = Some ( id) ;
396
+ self . end_point_segment = Some ( id) ;
394
397
let modification_type = VectorModificationType :: InsertSegment { id, points, handles } ;
395
398
responses. add ( GraphOperationMessage :: Vector { layer, modification_type } ) ;
396
399
@@ -469,12 +472,12 @@ impl PenToolData {
469
472
self . update_handle_position ( new_handle_position, anchor_point, responses, layer, is_start) ;
470
473
return ;
471
474
}
472
- let Some ( segment) = self . segment_end_before_bent else { return } ;
473
475
474
476
if self . end_point_segment == self . segment_end_before_bent {
475
477
let handle_offset = if let Some ( handle_end) = self . handle_end {
476
478
( handle_end - anchor_point) . length ( )
477
479
} else {
480
+ let Some ( segment) = self . segment_end_before_bent else { return } ;
478
481
let end_handle = ManipulatorPointId :: EndHandle ( segment) ;
479
482
let Some ( end_handle) = end_handle. get_position ( vector_data) else { return } ;
480
483
( end_handle - anchor_point) . length ( )
@@ -487,13 +490,7 @@ impl PenToolData {
487
490
let Some ( end_handle) = end_handle. get_position ( vector_data) else { return } ;
488
491
let handle_offset = ( end_handle - anchor_point) . length ( ) ;
489
492
let new_handle_position = anchor_point + handle_offset * direction;
490
- responses. add ( GraphOperationMessage :: Vector {
491
- layer,
492
- modification_type : VectorModificationType :: SetEndHandle {
493
- segment,
494
- relative_position : new_handle_position - anchor_point,
495
- } ,
496
- } ) ;
493
+ self . update_handle_position ( new_handle_position, anchor_point, responses, layer, is_start) ;
497
494
}
498
495
}
499
496
@@ -544,26 +541,25 @@ impl PenToolData {
544
541
}
545
542
546
543
fn update_handle_position ( & mut self , new_position : DVec2 , anchor_pos : DVec2 , responses : & mut VecDeque < Message > , layer : LayerNodeIdentifier , is_start : bool ) {
547
- if is_start {
544
+ let relative_position = new_position - anchor_pos;
545
+
546
+ let modification_type = if is_start {
548
547
let Some ( segment) = self . end_point_segment else { return } ;
549
- let relative_position = new_position - anchor_pos;
550
- let modification_type = VectorModificationType :: SetPrimaryHandle { segment, relative_position } ;
551
- responses. add ( GraphOperationMessage :: Vector { layer, modification_type } ) ;
548
+ VectorModificationType :: SetPrimaryHandle { segment, relative_position }
552
549
} else if self . end_point_segment == self . segment_end_before_bent {
553
550
if let Some ( handle) = self . handle_end . as_mut ( ) {
554
551
* handle = new_position;
552
+ return ;
555
553
} else {
556
554
let Some ( segment) = self . segment_end_before_bent else { return } ;
557
- let relative_position = new_position - anchor_pos;
558
- let modification_type = VectorModificationType :: SetEndHandle { segment, relative_position } ;
559
- responses. add ( GraphOperationMessage :: Vector { layer, modification_type } ) ;
555
+ VectorModificationType :: SetEndHandle { segment, relative_position }
560
556
}
561
557
} else {
562
558
let Some ( segment) = self . end_point_segment else { return } ;
563
- let relative_position = new_position - anchor_pos ;
564
- let modification_type = VectorModificationType :: SetEndHandle { segment , relative_position } ;
565
- responses . add ( GraphOperationMessage :: Vector { layer , modification_type } ) ;
566
- }
559
+ VectorModificationType :: SetEndHandle { segment , relative_position }
560
+ } ;
561
+
562
+ responses . add ( GraphOperationMessage :: Vector { layer , modification_type } ) ;
567
563
}
568
564
569
565
fn place_anchor ( & mut self , snap_data : SnapData , transform : DAffine2 , mouse : DVec2 , preferences : & PreferencesMessageHandler , responses : & mut VecDeque < Message > ) -> Option < PenToolFsmState > {
@@ -671,7 +667,7 @@ impl PenToolData {
671
667
tool_options : & PenOptions ,
672
668
append : bool ,
673
669
preferences : & PreferencesMessageHandler ,
674
- ) -> Option < ( PointId , LayerNodeIdentifier ) > {
670
+ ) {
675
671
let point = SnapCandidatePoint :: handle ( document. metadata ( ) . document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ) ;
676
672
let snapped = self . snap_manager . free_snap ( & SnapData :: new ( document, input) , & point, SnapTypeConfiguration :: default ( ) ) ;
677
673
let viewport = document. metadata ( ) . document_to_viewport . transform_point2 ( snapped. snapped_point_document ) ;
@@ -698,11 +694,11 @@ impl PenToolData {
698
694
self . set_lock_angle ( & vector_data, point, segment) ;
699
695
}
700
696
701
- return Some ( ( point , layer ) ) ;
697
+ return ;
702
698
}
703
699
704
700
if append {
705
- if let Some ( ( layer, point, position ) ) = closest_point ( & document, viewport, tolerance, document. metadata ( ) . all_layers ( ) , |_| false , & preferences) {
701
+ if let Some ( ( layer, point, _ ) ) = closest_point ( & document, viewport, tolerance, document. metadata ( ) . all_layers ( ) , |_| false , & preferences) {
706
702
let vector_data = document. network_interface . compute_modified_vector ( layer) . unwrap ( ) ;
707
703
let segment = vector_data. all_connected ( point) . collect :: < Vec < _ > > ( ) . first ( ) . map ( |s| s. segment ) ;
708
704
@@ -715,11 +711,11 @@ impl PenToolData {
715
711
if let Some ( layer) = existing_layer {
716
712
// Add point to existing layer
717
713
responses. add ( PenToolMessage :: AddPointLayerPosition { layer, viewport } ) ;
718
- return None ;
714
+ return ;
719
715
}
720
716
}
721
717
722
- if let Some ( ( layer, point, position ) ) = closest_point ( & document, viewport, tolerance, document. metadata ( ) . all_layers ( ) , |_| false , & preferences) {
718
+ if let Some ( ( layer, point, _position ) ) = closest_point ( & document, viewport, tolerance, document. metadata ( ) . all_layers ( ) , |_| false , & preferences) {
723
719
let vector_data = document. network_interface . compute_modified_vector ( layer) . unwrap ( ) ;
724
720
let segment = vector_data. all_connected ( point) . collect :: < Vec < _ > > ( ) . first ( ) . map ( |s| s. segment ) ;
725
721
@@ -743,7 +739,21 @@ impl PenToolData {
743
739
responses. add ( Message :: StartBuffer ) ;
744
740
// It is necessary to defer this until the transform of the layer can be accurately computed (quite hacky)
745
741
responses. add ( PenToolMessage :: AddPointLayerPosition { layer, viewport } ) ;
746
- return None ;
742
+ return ;
743
+ }
744
+
745
+ fn check_if_different_path ( & mut self , document : & DocumentMessageHandler , input : & InputPreprocessorMessageHandler , preferences : & PreferencesMessageHandler ) {
746
+ let point = SnapCandidatePoint :: handle ( document. metadata ( ) . document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ) ;
747
+ let snapped = self . snap_manager . free_snap ( & SnapData :: new ( document, input) , & point, SnapTypeConfiguration :: default ( ) ) ;
748
+ let viewport = document. metadata ( ) . document_to_viewport . transform_point2 ( snapped. snapped_point_document ) ;
749
+ let tolerance = crate :: consts:: SNAP_POINT_TOLERANCE ;
750
+
751
+ if let Some ( ( layer, point, _position) ) = closest_point ( & document, viewport, tolerance, document. metadata ( ) . all_layers ( ) , |_| false , & preferences) {
752
+ self . end_point = Some ( point) ;
753
+ let vector_data = document. network_interface . compute_modified_vector ( layer) . unwrap ( ) ;
754
+ let segment = vector_data. all_connected ( point) . collect :: < Vec < _ > > ( ) . first ( ) . map ( |s| s. segment ) ;
755
+ self . end_point_segment = segment;
756
+ }
747
757
}
748
758
749
759
fn set_lock_angle ( & mut self , vector_data : & VectorData , anchor : PointId , segment : Option < SegmentId > ) {
@@ -1043,13 +1053,10 @@ impl Fsm for PenToolFsmState {
1043
1053
( PenToolFsmState :: Ready , PenToolMessage :: DragStart { append_to_selected } ) => {
1044
1054
responses. add ( DocumentMessage :: StartTransaction ) ;
1045
1055
tool_data. handle_mode = HandleMode :: Free ;
1046
- if let Some ( ( point, layer) ) = tool_data. create_initial_point ( document, input, responses, tool_options, input. keyboard . key ( append_to_selected) , preferences) {
1047
- tool_data. end_point = Some ( point) ;
1048
- let vector_data = document. network_interface . compute_modified_vector ( layer) . unwrap ( ) ;
1049
- let segment = vector_data. all_connected ( point) . collect :: < Vec < _ > > ( ) . first ( ) . map ( |s| s. segment ) ;
1050
- tool_data. end_point_segment = segment;
1051
- }
1052
1056
1057
+ // Get the closest point and the segment it is on
1058
+ tool_data. create_initial_point ( document, input, responses, tool_options, input. keyboard . key ( append_to_selected) , preferences) ;
1059
+ tool_data. check_if_different_path ( document, input, preferences) ;
1053
1060
// Enter the dragging handle state while the mouse is held down, allowing the user to move the mouse and position the handle
1054
1061
PenToolFsmState :: DraggingHandle ( tool_data. handle_mode )
1055
1062
}
@@ -1071,7 +1078,7 @@ impl Fsm for PenToolFsmState {
1071
1078
if tool_data. buffering_merged_vector {
1072
1079
tool_data. buffering_merged_vector = false ;
1073
1080
tool_data. handle_mode = HandleMode :: ColinearLocked ;
1074
- tool_data. bend_from_previous_point ( SnapData :: new ( document, input) , transform, layer. unwrap ( ) ) ;
1081
+ tool_data. bend_from_previous_point ( SnapData :: new ( document, input) , transform, layer. unwrap ( ) , preferences ) ;
1075
1082
tool_data. place_anchor ( SnapData :: new ( document, input) , transform, input. mouse . position , preferences, responses) ;
1076
1083
tool_data. buffering_merged_vector = false ;
1077
1084
PenToolFsmState :: DraggingHandle ( tool_data. handle_mode )
0 commit comments