@@ -362,12 +362,6 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
362
362
Escape ,
363
363
RightClick
364
364
) ,
365
- PathToolFsmState :: MoldingSegment => actions ! ( PathToolMessageDiscriminant ;
366
- PointerMove ,
367
- DragStop ,
368
- RightClick ,
369
- Escape ,
370
- ) ,
371
365
}
372
366
}
373
367
}
@@ -419,7 +413,6 @@ enum PathToolFsmState {
419
413
selection_shape : SelectionShapeType ,
420
414
} ,
421
415
SlidingPoint ,
422
- MoldingSegment ,
423
416
}
424
417
425
418
#[ derive( Default ) ]
@@ -688,7 +681,7 @@ impl PathToolData {
688
681
self . molding_info = Some ( ( pos1, pos2) )
689
682
}
690
683
}
691
- PathToolFsmState :: MoldingSegment
684
+ PathToolFsmState :: Dragging ( self . dragging_state )
692
685
}
693
686
}
694
687
// If no other layers are selected and this is a single-click, then also select the layer (exception)
@@ -1505,7 +1498,6 @@ impl Fsm for PathToolFsmState {
1505
1498
}
1506
1499
}
1507
1500
Self :: SlidingPoint => { }
1508
- Self :: MoldingSegment => { }
1509
1501
}
1510
1502
1511
1503
responses. add ( PathToolMessage :: SelectedPointUpdated ) ;
@@ -1610,20 +1602,33 @@ impl Fsm for PathToolFsmState {
1610
1602
break_colinear_molding,
1611
1603
} ,
1612
1604
) => {
1605
+ let selected_only_handles = !shape_editor. selected_points ( ) . any ( |point| matches ! ( point, ManipulatorPointId :: Anchor ( _) ) ) ;
1613
1606
tool_data. stored_selection = None ;
1614
- let mut selected_only_handles = true ;
1615
1607
1616
- let selected_points = shape_editor. selected_points ( ) ;
1608
+ if !tool_data. saved_points_before_handle_drag . is_empty ( ) && ( tool_data. drag_start_pos . distance ( input. mouse . position ) > DRAG_THRESHOLD ) && ( selected_only_handles) {
1609
+ tool_data. handle_drag_toggle = true ;
1610
+ }
1617
1611
1618
- for point in selected_points {
1619
- if matches ! ( point, ManipulatorPointId :: Anchor ( _) ) {
1620
- selected_only_handles = false ;
1621
- break ;
1622
- }
1612
+ if tool_data. drag_start_pos . distance ( input. mouse . position ) > DRAG_THRESHOLD {
1613
+ tool_data. molding_segment = true ;
1623
1614
}
1624
1615
1625
- if !tool_data. saved_points_before_handle_drag . is_empty ( ) && ( tool_data. drag_start_pos . distance ( input. mouse . position ) > DRAG_THRESHOLD ) && ( selected_only_handles) {
1626
- tool_data. handle_drag_toggle = true ;
1616
+ let break_molding = input. keyboard . get ( break_colinear_molding as usize ) ;
1617
+
1618
+ // Logic for molding segment
1619
+ if let Some ( segment) = & mut tool_data. segment {
1620
+ if let Some ( molding_segment_handles) = tool_data. molding_info {
1621
+ tool_data. temporary_adjacent_handles_while_molding = segment. mold_handle_positions (
1622
+ document,
1623
+ responses,
1624
+ molding_segment_handles,
1625
+ input. mouse . position ,
1626
+ break_molding,
1627
+ tool_data. temporary_adjacent_handles_while_molding ,
1628
+ ) ;
1629
+ }
1630
+
1631
+ return PathToolFsmState :: Dragging ( tool_data. dragging_state ) ;
1627
1632
}
1628
1633
1629
1634
let anchor_and_handle_toggled = input. keyboard . get ( move_anchor_with_handles as usize ) ;
@@ -1701,29 +1706,6 @@ impl Fsm for PathToolFsmState {
1701
1706
tool_data. slide_point ( input. mouse . position , responses, & document. network_interface , shape_editor) ;
1702
1707
PathToolFsmState :: SlidingPoint
1703
1708
}
1704
- ( PathToolFsmState :: MoldingSegment , PathToolMessage :: PointerMove { break_colinear_molding, .. } ) => {
1705
- if tool_data. drag_start_pos . distance ( input. mouse . position ) > DRAG_THRESHOLD {
1706
- tool_data. molding_segment = true ;
1707
- }
1708
-
1709
- let break_colinear_molding = input. keyboard . get ( break_colinear_molding as usize ) ;
1710
-
1711
- // Logic for molding segment
1712
- if let Some ( segment) = & mut tool_data. segment {
1713
- if let Some ( molding_segment_handles) = tool_data. molding_info {
1714
- tool_data. temporary_adjacent_handles_while_molding = segment. mold_handle_positions (
1715
- document,
1716
- responses,
1717
- molding_segment_handles,
1718
- input. mouse . position ,
1719
- break_colinear_molding,
1720
- tool_data. temporary_adjacent_handles_while_molding ,
1721
- ) ;
1722
- }
1723
- }
1724
-
1725
- PathToolFsmState :: MoldingSegment
1726
- }
1727
1709
( PathToolFsmState :: Ready , PathToolMessage :: PointerMove { delete_segment, .. } ) => {
1728
1710
tool_data. delete_segment_pressed = input. keyboard . get ( delete_segment as usize ) ;
1729
1711
@@ -1855,6 +1837,9 @@ impl Fsm for PathToolFsmState {
1855
1837
tool_data. saved_points_before_handle_drag . clear ( ) ;
1856
1838
tool_data. handle_drag_toggle = false ;
1857
1839
}
1840
+ tool_data. molding_info = None ;
1841
+ tool_data. molding_segment = false ;
1842
+ tool_data. temporary_adjacent_handles_while_molding = None ;
1858
1843
tool_data. angle_locked = false ;
1859
1844
responses. add ( DocumentMessage :: AbortTransaction ) ;
1860
1845
tool_data. snap_manager . cleanup ( responses) ;
@@ -1872,17 +1857,6 @@ impl Fsm for PathToolFsmState {
1872
1857
1873
1858
PathToolFsmState :: Ready
1874
1859
}
1875
- ( PathToolFsmState :: MoldingSegment , PathToolMessage :: Escape | PathToolMessage :: RightClick ) => {
1876
- // Undo the molding and go back to the state before
1877
- tool_data. molding_info = None ;
1878
- tool_data. molding_segment = false ;
1879
- tool_data. temporary_adjacent_handles_while_molding = None ;
1880
-
1881
- responses. add ( DocumentMessage :: AbortTransaction ) ;
1882
- tool_data. snap_manager . cleanup ( responses) ;
1883
-
1884
- PathToolFsmState :: Ready
1885
- }
1886
1860
// Mouse up
1887
1861
( PathToolFsmState :: Drawing { selection_shape } , PathToolMessage :: DragStop { extend_selection, shrink_selection } ) => {
1888
1862
let extend_selection = input. keyboard . get ( extend_selection as usize ) ;
@@ -2598,48 +2572,49 @@ fn update_dynamic_hints(
2598
2572
dragging_hint_data. 0 . push ( HintGroup ( hold_group) ) ;
2599
2573
}
2600
2574
2601
- dragging_hint_data
2602
- }
2603
- PathToolFsmState :: Drawing { .. } => HintData ( vec ! [
2604
- HintGroup ( vec![ HintInfo :: mouse( MouseMotion :: Rmb , "" ) , HintInfo :: keys( [ Key :: Escape ] , "Cancel" ) . prepend_slash( ) ] ) ,
2605
- HintGroup ( vec![
2606
- HintInfo :: mouse( MouseMotion :: LmbDrag , "Select Area" ) ,
2607
- HintInfo :: keys( [ Key :: Shift ] , "Extend" ) . prepend_plus( ) ,
2608
- HintInfo :: keys( [ Key :: Alt ] , "Subtract" ) . prepend_plus( ) ,
2609
- ] ) ,
2610
- ] ) ,
2611
- PathToolFsmState :: MoldingSegment => {
2612
- let mut has_colinear_anchors = false ;
2575
+ if tool_data. molding_segment {
2576
+ let mut has_colinear_anchors = false ;
2613
2577
2614
- if let Some ( segment) = & tool_data. segment {
2615
- let handle1 = HandleId :: primary ( segment. segment ( ) ) ;
2616
- let handle2 = HandleId :: end ( segment. segment ( ) ) ;
2578
+ if let Some ( segment) = & tool_data. segment {
2579
+ let handle1 = HandleId :: primary ( segment. segment ( ) ) ;
2580
+ let handle2 = HandleId :: end ( segment. segment ( ) ) ;
2617
2581
2618
- if let Some ( vector_data) = document. network_interface . compute_modified_vector ( segment. layer ( ) ) {
2619
- let other_handle1 = vector_data. other_colinear_handle ( handle1) ;
2620
- let other_handle2 = vector_data. other_colinear_handle ( handle2) ;
2621
- if other_handle1. is_some ( ) || other_handle2. is_some ( ) {
2622
- has_colinear_anchors = true ;
2623
- }
2582
+ if let Some ( vector_data) = document. network_interface . compute_modified_vector ( segment. layer ( ) ) {
2583
+ let other_handle1 = vector_data. other_colinear_handle ( handle1) ;
2584
+ let other_handle2 = vector_data. other_colinear_handle ( handle2) ;
2585
+ if other_handle1. is_some ( ) || other_handle2. is_some ( ) {
2586
+ has_colinear_anchors = true ;
2587
+ }
2588
+ } ;
2589
+ }
2590
+
2591
+ let handles_stored = if let Some ( other_handles) = tool_data. temporary_adjacent_handles_while_molding {
2592
+ other_handles[ 0 ] . is_some ( ) || other_handles[ 1 ] . is_some ( )
2593
+ } else {
2594
+ false
2624
2595
} ;
2625
- }
2626
2596
2627
- let handles_stored = if let Some ( other_handles) = tool_data. temporary_adjacent_handles_while_molding {
2628
- other_handles[ 0 ] . is_some ( ) || other_handles[ 1 ] . is_some ( )
2629
- } else {
2630
- false
2631
- } ;
2597
+ let molding_disable_possible = has_colinear_anchors || handles_stored;
2632
2598
2633
- let molding_disable_possible = has_colinear_anchors || handles_stored ;
2599
+ let mut molding_hints = vec ! [ HintGroup ( vec! [ HintInfo :: mouse ( MouseMotion :: Rmb , "" ) , HintInfo :: keys ( [ Key :: Escape ] , "Cancel" ) . prepend_slash ( ) ] ) ] ;
2634
2600
2635
- let mut molding_hints = vec ! [ HintGroup ( vec![ HintInfo :: mouse( MouseMotion :: Rmb , "" ) , HintInfo :: keys( [ Key :: Escape ] , "Cancel" ) . prepend_slash( ) ] ) ] ;
2601
+ if molding_disable_possible {
2602
+ molding_hints. push ( HintGroup ( vec ! [ HintInfo :: keys( [ Key :: Alt ] , "Break Colinear Handles" ) ] ) ) ;
2603
+ }
2636
2604
2637
- if molding_disable_possible {
2638
- molding_hints. push ( HintGroup ( vec ! [ HintInfo :: keys( [ Key :: Alt ] , "Break Colinear Handles" ) ] ) ) ;
2605
+ HintData ( molding_hints)
2606
+ } else {
2607
+ dragging_hint_data
2639
2608
}
2640
-
2641
- HintData ( molding_hints)
2642
2609
}
2610
+ PathToolFsmState :: Drawing { .. } => HintData ( vec ! [
2611
+ HintGroup ( vec![ HintInfo :: mouse( MouseMotion :: Rmb , "" ) , HintInfo :: keys( [ Key :: Escape ] , "Cancel" ) . prepend_slash( ) ] ) ,
2612
+ HintGroup ( vec![
2613
+ HintInfo :: mouse( MouseMotion :: LmbDrag , "Select Area" ) ,
2614
+ HintInfo :: keys( [ Key :: Shift ] , "Extend" ) . prepend_plus( ) ,
2615
+ HintInfo :: keys( [ Key :: Alt ] , "Subtract" ) . prepend_plus( ) ,
2616
+ ] ) ,
2617
+ ] ) ,
2643
2618
PathToolFsmState :: SlidingPoint => HintData ( vec ! [ HintGroup ( vec![ HintInfo :: mouse( MouseMotion :: Rmb , "" ) , HintInfo :: keys( [ Key :: Escape ] , "Cancel" ) . prepend_slash( ) ] ) ] ) ,
2644
2619
} ;
2645
2620
responses. add ( FrontendMessage :: UpdateInputHints { hint_data } ) ;
0 commit comments