@@ -435,6 +435,7 @@ struct PathToolData {
435435 angle : f64 ,
436436 opposite_handle_position : Option < DVec2 > ,
437437 last_clicked_point_was_selected : bool ,
438+ last_clicked_segment_was_selected : bool ,
438439 snapping_axis : Option < Axis > ,
439440 alt_clicked_on_anchor : bool ,
440441 alt_dragging_from_anchor : bool ,
@@ -632,6 +633,7 @@ impl PathToolData {
632633 let layer = segment. layer ( ) ;
633634 let segment_id = segment. segment ( ) ;
634635 let already_selected = shape_editor. selected_shape_state . get ( & layer) . map_or ( false , |state| state. is_selected_segment ( segment_id) ) ;
636+ self . last_clicked_segment_was_selected = already_selected;
635637
636638 if !( already_selected && extend_selection) {
637639 // let vector_data = document.network_interface.compute_modified_vector(segment.layer());
@@ -676,6 +678,7 @@ impl PathToolData {
676678 // We didn't find a segment, so consider selecting the nearest shape instead
677679 else if let Some ( layer) = document. click ( input) {
678680 shape_editor. deselect_all_points ( ) ;
681+ shape_editor. deselect_all_segments ( ) ;
679682 if extend_selection {
680683 responses. add ( NodeGraphMessage :: SelectedNodesAdd { nodes : vec ! [ layer. to_node( ) ] } ) ;
681684 } else {
@@ -698,77 +701,6 @@ impl PathToolData {
698701 }
699702 }
700703
701- #[ allow( clippy:: too_many_arguments) ]
702- fn mouse_down_segment_mode (
703- & mut self ,
704- shape_editor : & mut ShapeState ,
705- document : & DocumentMessageHandler ,
706- input : & InputPreprocessorMessageHandler ,
707- responses : & mut VecDeque < Message > ,
708- extend_selection : bool ,
709- _lasso_select : bool ,
710- _handle_drag_from_anchor : bool ,
711- _drag_zero_handle : bool ,
712- _path_overlay_mode : PathOverlayMode ,
713- ) -> PathToolFsmState {
714- self . drag_start_pos = input. mouse . position ;
715-
716- // Check if a segment is already selected; if not, select the first segment within the threshold
717- if let Some ( segment) = shape_editor. upper_closest_segment ( & document. network_interface , input. mouse . position , SELECTION_THRESHOLD ) {
718- //Got the segment add the segment in selected segments
719- let layer = segment. layer ( ) ;
720- let segment_id = segment. segment ( ) ;
721- let already_selected = shape_editor. selected_shape_state . get ( & layer) . map_or ( false , |state| state. is_selected_segment ( segment_id) ) ;
722-
723- if !( already_selected && extend_selection) {
724- // let vector_data = document.network_interface.compute_modified_vector(segment.layer());
725-
726- let new_selected = if already_selected { !extend_selection } else { true } ;
727- if new_selected {
728- let retain_existing_selection = extend_selection || already_selected;
729- if !retain_existing_selection {
730- shape_editor. deselect_all_segments ( ) ;
731- }
732-
733- // Add to selected segments
734- if let Some ( selected_shape_state) = shape_editor. selected_shape_state . get_mut ( & layer) {
735- selected_shape_state. select_segment ( segment_id) ;
736- }
737- } else {
738- if let Some ( selected_shape_state) = shape_editor. selected_shape_state . get_mut ( & layer) {
739- selected_shape_state. deselect_segment ( segment_id) ;
740- }
741- }
742- }
743- responses. add ( OverlaysMessage :: Draw ) ;
744- PathToolFsmState :: Dragging ( self . dragging_state )
745- }
746- // We didn't find a segment, so consider selecting the nearest shape instead
747- else if let Some ( layer) = document. click ( input) {
748- shape_editor. deselect_all_points ( ) ;
749- if extend_selection {
750- responses. add ( NodeGraphMessage :: SelectedNodesAdd { nodes : vec ! [ layer. to_node( ) ] } ) ;
751- } else {
752- responses. add ( NodeGraphMessage :: SelectedNodesSet { nodes : vec ! [ layer. to_node( ) ] } ) ;
753- }
754- self . drag_start_pos = input. mouse . position ;
755- self . previous_mouse_position = document. metadata ( ) . document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ;
756-
757- responses. add ( DocumentMessage :: StartTransaction ) ;
758-
759- PathToolFsmState :: Dragging ( self . dragging_state )
760- }
761- // Start drawing
762- else {
763- self . drag_start_pos = input. mouse . position ;
764- self . previous_mouse_position = document. metadata ( ) . document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ;
765-
766- let selection_shape = if _lasso_select { SelectionShapeType :: Lasso } else { SelectionShapeType :: Box } ;
767- responses. add ( OverlaysMessage :: Draw ) ;
768- PathToolFsmState :: Drawing { selection_shape }
769- }
770- }
771-
772704 fn start_dragging_point ( & mut self , selected_points : SelectedPointsInfo , input : & InputPreprocessorMessageHandler , document : & DocumentMessageHandler , shape_editor : & mut ShapeState ) {
773705 let mut manipulators = HashMap :: with_hasher ( NoHashBuilder ) ;
774706 let mut unselected = Vec :: new ( ) ;
@@ -1742,6 +1674,7 @@ impl Fsm for PathToolFsmState {
17421674 ( PathToolFsmState :: Dragging { .. } , PathToolMessage :: Escape | PathToolMessage :: RightClick ) => {
17431675 if tool_data. handle_drag_toggle && tool_data. drag_start_pos . distance ( input. mouse . position ) > DRAG_THRESHOLD {
17441676 shape_editor. deselect_all_points ( ) ;
1677+ shape_editor. deselect_all_segments ( ) ;
17451678 shape_editor. select_points_by_manipulator_id ( & tool_data. saved_points_before_handle_drag ) ;
17461679
17471680 tool_data. saved_points_before_handle_drag . clear ( ) ;
@@ -1815,7 +1748,7 @@ impl Fsm for PathToolFsmState {
18151748 ( _, PathToolMessage :: DragStop { extend_selection, .. } ) => {
18161749 let extend_selection = input. keyboard . get ( extend_selection as usize ) ;
18171750 let drag_occurred = tool_data. drag_start_pos . distance ( input. mouse . position ) > DRAG_THRESHOLD ;
1818- // TODO: Here we want only visible points to be considered
1751+
18191752 let nearest_point = shape_editor. find_nearest_visible_point_indices (
18201753 & document. network_interface ,
18211754 input. mouse . position ,
@@ -1824,40 +1757,78 @@ impl Fsm for PathToolFsmState {
18241757 tool_data. frontier_handles_info . clone ( ) ,
18251758 ) ;
18261759
1760+ let nearest_segment = tool_data. segment . clone ( ) ;
1761+
18271762 if let Some ( segment) = & mut tool_data. segment {
18281763 let segment_mode = tool_options. path_editing_mode . segment_editing_mode ;
18291764 if !drag_occurred && !tool_data. molding_segment && !segment_mode {
18301765 if tool_data. delete_segment_pressed {
18311766 if let Some ( vector_data) = document. network_interface . compute_modified_vector ( segment. layer ( ) ) {
18321767 shape_editor. dissolve_segment ( responses, segment. layer ( ) , & vector_data, segment. segment ( ) , segment. points ( ) ) ;
1833- responses. add ( DocumentMessage :: EndTransaction ) ;
18341768 }
18351769 } else {
18361770 segment. adjusted_insert_and_select ( shape_editor, responses, extend_selection) ;
1837- responses. add ( DocumentMessage :: EndTransaction ) ;
18381771 }
1839- } else {
1840- responses. add ( DocumentMessage :: EndTransaction ) ;
18411772 }
18421773
18431774 tool_data. segment = None ;
18441775 tool_data. molding_info = None ;
18451776 tool_data. molding_segment = false ;
18461777 tool_data. temporary_adjacent_handles_while_molding = None ;
1847-
1848- return PathToolFsmState :: Ready ;
18491778 }
18501779
1780+ let segment_mode = tool_options. path_editing_mode . segment_editing_mode ;
1781+
18511782 if let Some ( ( layer, nearest_point) ) = nearest_point {
1783+ let clicked_selected = shape_editor. selected_points ( ) . any ( |& point| nearest_point == point) ;
18521784 if !drag_occurred && extend_selection {
1853- let clicked_selected = shape_editor . selected_points ( ) . any ( | & point| nearest_point == point ) ;
1785+ log :: info! ( "yes here occured" ) ;
18541786 if clicked_selected && tool_data. last_clicked_point_was_selected {
18551787 shape_editor. selected_shape_state . entry ( layer) . or_default ( ) . deselect_point ( nearest_point) ;
18561788 } else {
18571789 shape_editor. selected_shape_state . entry ( layer) . or_default ( ) . select_point ( nearest_point) ;
18581790 }
18591791 responses. add ( OverlaysMessage :: Draw ) ;
18601792 }
1793+ if !drag_occurred && !extend_selection {
1794+ if clicked_selected {
1795+ if tool_data. saved_points_before_anchor_convert_smooth_sharp . is_empty ( ) {
1796+ tool_data. saved_points_before_anchor_convert_smooth_sharp = shape_editor. selected_points ( ) . copied ( ) . collect :: < HashSet < _ > > ( ) ;
1797+ }
1798+ shape_editor. deselect_all_points ( ) ;
1799+ shape_editor. selected_shape_state . entry ( layer) . or_default ( ) . select_point ( nearest_point) ;
1800+ responses. add ( OverlaysMessage :: Draw ) ;
1801+ }
1802+ }
1803+ }
1804+ // Segment editing mode
1805+ else if let Some ( nearest_segment) = nearest_segment {
1806+ //Condition this upon whether user has selected segment editing mode or not
1807+ if segment_mode {
1808+ let clicked_selected = shape_editor. selected_segments ( ) . any ( |& segment| segment == nearest_segment. segment ( ) ) ;
1809+ if !drag_occurred && extend_selection {
1810+ if clicked_selected && tool_data. last_clicked_segment_was_selected {
1811+ shape_editor
1812+ . selected_shape_state
1813+ . entry ( nearest_segment. layer ( ) )
1814+ . or_default ( )
1815+ . deselect_segment ( nearest_segment. segment ( ) ) ;
1816+ } else {
1817+ shape_editor. selected_shape_state . entry ( nearest_segment. layer ( ) ) . or_default ( ) . select_segment ( nearest_segment. segment ( ) ) ;
1818+ }
1819+ responses. add ( OverlaysMessage :: Draw ) ;
1820+ }
1821+ if !drag_occurred && !extend_selection && clicked_selected {
1822+ shape_editor. deselect_all_segments ( ) ;
1823+ shape_editor. selected_shape_state . entry ( nearest_segment. layer ( ) ) . or_default ( ) . select_segment ( nearest_segment. segment ( ) ) ;
1824+ responses. add ( OverlaysMessage :: Draw ) ;
1825+ }
1826+ }
1827+ }
1828+ // Deselect all points if the user clicks the filled region of the shape
1829+ else if tool_data. drag_start_pos . distance ( input. mouse . position ) <= DRAG_THRESHOLD {
1830+ shape_editor. deselect_all_points ( ) ;
1831+ shape_editor. deselect_all_segments ( ) ;
18611832 }
18621833
18631834 if tool_data. temporary_colinear_handles {
@@ -1883,25 +1854,6 @@ impl Fsm for PathToolFsmState {
18831854 tool_data. select_anchor_toggled = false ;
18841855 }
18851856
1886- if let Some ( ( layer, nearest_point) ) = nearest_point {
1887- if !drag_occurred && !extend_selection {
1888- let clicked_selected = shape_editor. selected_points ( ) . any ( |& point| nearest_point == point) ;
1889- if clicked_selected {
1890- if tool_data. saved_points_before_anchor_convert_smooth_sharp . is_empty ( ) {
1891- tool_data. saved_points_before_anchor_convert_smooth_sharp = shape_editor. selected_points ( ) . copied ( ) . collect :: < HashSet < _ > > ( ) ;
1892- }
1893-
1894- shape_editor. deselect_all_points ( ) ;
1895- shape_editor. selected_shape_state . entry ( layer) . or_default ( ) . select_point ( nearest_point) ;
1896- responses. add ( OverlaysMessage :: Draw ) ;
1897- }
1898- }
1899- }
1900- // Deselect all points if the user clicks the filled region of the shape
1901- else if tool_data. drag_start_pos . distance ( input. mouse . position ) <= DRAG_THRESHOLD {
1902- shape_editor. deselect_all_points ( ) ;
1903- }
1904-
19051857 if tool_data. snapping_axis . is_some ( ) {
19061858 tool_data. snapping_axis = None ;
19071859 }
0 commit comments