@@ -362,12 +362,6 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
362362 Escape ,
363363 RightClick
364364 ) ,
365- PathToolFsmState :: MoldingSegment => actions ! ( PathToolMessageDiscriminant ;
366- PointerMove ,
367- DragStop ,
368- RightClick ,
369- Escape ,
370- ) ,
371365 }
372366 }
373367}
@@ -419,7 +413,6 @@ enum PathToolFsmState {
419413 selection_shape : SelectionShapeType ,
420414 } ,
421415 SlidingPoint ,
422- MoldingSegment ,
423416}
424417
425418#[ derive( Default ) ]
@@ -688,7 +681,7 @@ impl PathToolData {
688681 self . molding_info = Some ( ( pos1, pos2) )
689682 }
690683 }
691- PathToolFsmState :: MoldingSegment
684+ PathToolFsmState :: Dragging ( self . dragging_state )
692685 }
693686 }
694687 // 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 {
15051498 }
15061499 }
15071500 Self :: SlidingPoint => { }
1508- Self :: MoldingSegment => { }
15091501 }
15101502
15111503 responses. add ( PathToolMessage :: SelectedPointUpdated ) ;
@@ -1610,20 +1602,33 @@ impl Fsm for PathToolFsmState {
16101602 break_colinear_molding,
16111603 } ,
16121604 ) => {
1605+ let selected_only_handles = !shape_editor. selected_points ( ) . any ( |point| matches ! ( point, ManipulatorPointId :: Anchor ( _) ) ) ;
16131606 tool_data. stored_selection = None ;
1614- let mut selected_only_handles = true ;
16151607
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+ }
16171611
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 ;
16231614 }
16241615
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 ) ;
16271632 }
16281633
16291634 let anchor_and_handle_toggled = input. keyboard . get ( move_anchor_with_handles as usize ) ;
@@ -1701,29 +1706,6 @@ impl Fsm for PathToolFsmState {
17011706 tool_data. slide_point ( input. mouse . position , responses, & document. network_interface , shape_editor) ;
17021707 PathToolFsmState :: SlidingPoint
17031708 }
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- }
17271709 ( PathToolFsmState :: Ready , PathToolMessage :: PointerMove { delete_segment, .. } ) => {
17281710 tool_data. delete_segment_pressed = input. keyboard . get ( delete_segment as usize ) ;
17291711
@@ -1855,6 +1837,9 @@ impl Fsm for PathToolFsmState {
18551837 tool_data. saved_points_before_handle_drag . clear ( ) ;
18561838 tool_data. handle_drag_toggle = false ;
18571839 }
1840+ tool_data. molding_info = None ;
1841+ tool_data. molding_segment = false ;
1842+ tool_data. temporary_adjacent_handles_while_molding = None ;
18581843 tool_data. angle_locked = false ;
18591844 responses. add ( DocumentMessage :: AbortTransaction ) ;
18601845 tool_data. snap_manager . cleanup ( responses) ;
@@ -1872,17 +1857,6 @@ impl Fsm for PathToolFsmState {
18721857
18731858 PathToolFsmState :: Ready
18741859 }
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- }
18861860 // Mouse up
18871861 ( PathToolFsmState :: Drawing { selection_shape } , PathToolMessage :: DragStop { extend_selection, shrink_selection } ) => {
18881862 let extend_selection = input. keyboard . get ( extend_selection as usize ) ;
@@ -2598,48 +2572,49 @@ fn update_dynamic_hints(
25982572 dragging_hint_data. 0 . push ( HintGroup ( hold_group) ) ;
25992573 }
26002574
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 ;
26132577
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 ( ) ) ;
26172581
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
26242595 } ;
2625- }
26262596
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;
26322598
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 ( ) ] ) ] ;
26342600
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+ }
26362604
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
26392608 }
2640-
2641- HintData ( molding_hints)
26422609 }
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+ ] ) ,
26432618 PathToolFsmState :: SlidingPoint => HintData ( vec ! [ HintGroup ( vec![ HintInfo :: mouse( MouseMotion :: Rmb , "" ) , HintInfo :: keys( [ Key :: Escape ] , "Cancel" ) . prepend_slash( ) ] ) ] ) ,
26442619 } ;
26452620 responses. add ( FrontendMessage :: UpdateInputHints { hint_data } ) ;
0 commit comments