@@ -127,6 +127,7 @@ pub enum PathToolMessage {
127127 UpdateSelectedPointsStatus {
128128 overlay_context : OverlayContext ,
129129 } ,
130+ StartSlidingPoint ,
130131 Copy {
131132 clipboard : Clipboard ,
132133 } ,
@@ -420,6 +421,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionMessageContext<'a>> for Path
420421 DeleteAndBreakPath ,
421422 ClosePath ,
422423 PointerMove ,
424+ StartSlidingPoint ,
423425 Copy ,
424426 Cut ,
425427 DeleteSelected ,
@@ -438,6 +440,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionMessageContext<'a>> for Path
438440 BreakPath ,
439441 DeleteAndBreakPath ,
440442 SwapSelectedHandles ,
443+ StartSlidingPoint ,
441444 Copy ,
442445 Cut ,
443446 DeleteSelected ,
@@ -456,6 +459,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionMessageContext<'a>> for Path
456459 DeleteAndBreakPath ,
457460 Escape ,
458461 RightClick ,
462+ StartSlidingPoint ,
459463 TogglePointEditing ,
460464 ToggleSegmentEditing
461465 ) ,
@@ -1208,11 +1212,6 @@ impl PathToolData {
12081212 } ;
12091213 let Some ( vector) = document. network_interface . compute_modified_vector ( layer) else { return false } ;
12101214
1211- // Check that the handles of anchor point are also colinear
1212- if !vector. colinear ( * anchor) {
1213- return false ;
1214- } ;
1215-
12161215 let Some ( point_id) = anchor. as_anchor ( ) else { return false } ;
12171216
12181217 let mut connected_segments = [ None , None ] ;
@@ -2083,10 +2082,6 @@ impl Fsm for PathToolFsmState {
20832082 }
20842083
20852084 if !tool_data. update_colinear ( equidistant_state, toggle_colinear_state, tool_action_data. shape_editor , tool_action_data. document , responses) {
2086- if snap_angle_state && lock_angle_state && tool_data. start_sliding_point ( tool_action_data. shape_editor , tool_action_data. document ) {
2087- return PathToolFsmState :: SlidingPoint ;
2088- }
2089-
20902085 tool_data. drag (
20912086 equidistant_state,
20922087 lock_angle_state,
@@ -2382,6 +2377,8 @@ impl Fsm for PathToolFsmState {
23822377 tool_data. ghost_outline . clear ( ) ;
23832378 let extend_selection = input. keyboard . get ( extend_selection as usize ) ;
23842379 let drag_occurred = tool_data. drag_start_pos . distance ( input. mouse . position ) > DRAG_THRESHOLD ;
2380+ let mut segment_dissolved = false ;
2381+ let mut point_inserted = false ;
23852382
23862383 let nearest_point = shape_editor. find_nearest_visible_point_indices (
23872384 & document. network_interface ,
@@ -2402,6 +2399,7 @@ impl Fsm for PathToolFsmState {
24022399 if tool_data. delete_segment_pressed {
24032400 if let Some ( vector) = document. network_interface . compute_modified_vector ( segment. layer ( ) ) {
24042401 shape_editor. dissolve_segment ( responses, segment. layer ( ) , & vector, segment. segment ( ) , segment. points ( ) ) ;
2402+ segment_dissolved = true ;
24052403 }
24062404 } else {
24072405 let is_segment_selected = shape_editor
@@ -2410,18 +2408,19 @@ impl Fsm for PathToolFsmState {
24102408 . is_some_and ( |state| state. is_segment_selected ( segment. segment ( ) ) ) ;
24112409
24122410 segment. adjusted_insert_and_select ( shape_editor, responses, extend_selection, point_mode, is_segment_selected) ;
2413- tool_data. segment = None ;
2414- tool_data. molding_info = None ;
2415- tool_data. molding_segment = false ;
2416- tool_data. temporary_adjacent_handles_while_molding = None ;
2417- return PathToolFsmState :: Ready ;
2411+ point_inserted = true ;
24182412 }
24192413 }
24202414
24212415 tool_data. segment = None ;
24222416 tool_data. molding_info = None ;
24232417 tool_data. molding_segment = false ;
24242418 tool_data. temporary_adjacent_handles_while_molding = None ;
2419+
2420+ if segment_dissolved || point_inserted {
2421+ responses. add ( DocumentMessage :: EndTransaction ) ;
2422+ return PathToolFsmState :: Ready ;
2423+ }
24252424 }
24262425
24272426 let segment_mode = tool_options. path_editing_mode . segment_editing_mode ;
@@ -2578,6 +2577,14 @@ impl Fsm for PathToolFsmState {
25782577 shape_editor. delete_point_and_break_path ( document, responses) ;
25792578 PathToolFsmState :: Ready
25802579 }
2580+ ( _, PathToolMessage :: StartSlidingPoint ) => {
2581+ responses. add ( DocumentMessage :: StartTransaction ) ;
2582+ if tool_data. start_sliding_point ( shape_editor, document) {
2583+ PathToolFsmState :: SlidingPoint
2584+ } else {
2585+ PathToolFsmState :: Ready
2586+ }
2587+ }
25812588 ( _, PathToolMessage :: Copy { clipboard } ) => {
25822589 // TODO: Add support for selected segments
25832590
@@ -3297,18 +3304,14 @@ fn update_dynamic_hints(
32973304 }
32983305 }
32993306
3300- let mut drag_selected_hints = vec ! [ HintInfo :: mouse( MouseMotion :: LmbDrag , "Drag Selected" ) ] ;
3307+ let drag_selected_hints = vec ! [ HintInfo :: mouse( MouseMotion :: LmbDrag , "Drag Selected" ) ] ;
33013308 let mut delete_selected_hints = vec ! [ HintInfo :: keys( [ Key :: Delete ] , "Delete Selected" ) ] ;
33023309
33033310 if at_least_one_anchor_selected {
33043311 delete_selected_hints. push ( HintInfo :: keys ( [ Key :: Accel ] , "No Dissolve" ) . prepend_plus ( ) ) ;
33053312 delete_selected_hints. push ( HintInfo :: keys ( [ Key :: Shift ] , "Cut Anchor" ) . prepend_plus ( ) ) ;
33063313 }
33073314
3308- if single_colinear_anchor_selected {
3309- drag_selected_hints. push ( HintInfo :: multi_keys ( [ [ Key :: Control ] , [ Key :: Shift ] ] , "Slide" ) . prepend_plus ( ) ) ;
3310- }
3311-
33123315 let segment_edit = tool_options. path_editing_mode . segment_editing_mode ;
33133316 let point_edit = tool_options. path_editing_mode . point_editing_mode ;
33143317
@@ -3373,9 +3376,15 @@ fn update_dynamic_hints(
33733376 let mut groups = vec ! [
33743377 HintGroup ( drag_selected_hints) ,
33753378 HintGroup ( vec![ HintInfo :: multi_keys( [ [ Key :: KeyG ] , [ Key :: KeyR ] , [ Key :: KeyS ] ] , "Grab/Rotate/Scale Selected" ) ] ) ,
3376- HintGroup ( vec![ HintInfo :: arrow_keys( "Nudge Selected" ) , HintInfo :: keys( [ Key :: Shift ] , "10x" ) . prepend_plus( ) ] ) ,
3377- HintGroup ( delete_selected_hints) ,
33783379 ] ;
3380+
3381+ if single_colinear_anchor_selected {
3382+ groups. push ( HintGroup ( vec ! [ HintInfo :: multi_keys( [ [ Key :: KeyG ] , [ Key :: KeyG ] ] , "Slide" ) ] ) ) ;
3383+ }
3384+
3385+ groups. push ( HintGroup ( vec ! [ HintInfo :: arrow_keys( "Nudge Selected" ) , HintInfo :: keys( [ Key :: Shift ] , "10x" ) . prepend_plus( ) ] ) ) ;
3386+ groups. push ( HintGroup ( delete_selected_hints) ) ;
3387+
33793388 hint_data. append ( & mut groups) ;
33803389 }
33813390
0 commit comments