@@ -47,7 +47,7 @@ pub enum FreehandToolMessage {
4747 WorkingColorChanged ,
4848
4949 // Tool-specific messages
50- DragStart ,
50+ DragStart { append_to_selected : Key } ,
5151 DragStop ,
5252 PointerMove ,
5353 UpdateOptions ( FreehandOptionsUpdate ) ,
@@ -203,7 +203,7 @@ impl Fsm for FreehandToolFsmState {
203203
204204 self
205205 }
206- ( FreehandToolFsmState :: Ready , FreehandToolMessage :: DragStart ) => {
206+ ( FreehandToolFsmState :: Ready , FreehandToolMessage :: DragStart { append_to_selected } ) => {
207207 responses. add ( DocumentMessage :: StartTransaction ) ;
208208
209209 tool_data. dragged = false ;
@@ -216,11 +216,26 @@ impl Fsm for FreehandToolFsmState {
216216 tool_data. layer = Some ( layer) ;
217217 tool_data. end_point = Some ( ( position, point) ) ;
218218
219- extend_path_with_next_segment ( tool_data, position, responses) ;
219+ extend_path_with_next_segment ( tool_data, position, true , responses) ;
220220
221221 return FreehandToolFsmState :: Drawing ;
222222 }
223223
224+ if input. keyboard . key ( append_to_selected) {
225+ let mut selected_layers_except_artboards = selected_nodes. selected_layers_except_artboards ( & document. network_interface ) ;
226+ let existing_layer = selected_layers_except_artboards. next ( ) . filter ( |_| selected_layers_except_artboards. next ( ) . is_none ( ) ) ;
227+ if let Some ( layer) = existing_layer {
228+ tool_data. layer = Some ( layer) ;
229+
230+ let transform = document. metadata ( ) . transform_to_viewport ( layer) ;
231+ let position = transform. inverse ( ) . transform_point2 ( input. mouse . position ) ;
232+
233+ extend_path_with_next_segment ( tool_data, position, false , responses) ;
234+
235+ return FreehandToolFsmState :: Drawing ;
236+ }
237+ }
238+
224239 responses. add ( DocumentMessage :: DeselectAllLayers ) ;
225240
226241 let parent = document. new_layer_parent ( true ) ;
@@ -242,7 +257,7 @@ impl Fsm for FreehandToolFsmState {
242257 let transform = document. metadata ( ) . transform_to_viewport ( layer) ;
243258 let position = transform. inverse ( ) . transform_point2 ( input. mouse . position ) ;
244259
245- extend_path_with_next_segment ( tool_data, position, responses) ;
260+ extend_path_with_next_segment ( tool_data, position, true , responses) ;
246261 }
247262
248263 FreehandToolFsmState :: Drawing
@@ -279,7 +294,11 @@ impl Fsm for FreehandToolFsmState {
279294
280295 fn update_hints ( & self , responses : & mut VecDeque < Message > ) {
281296 let hint_data = match self {
282- FreehandToolFsmState :: Ready => HintData ( vec ! [ HintGroup ( vec![ HintInfo :: mouse( MouseMotion :: LmbDrag , "Draw Polyline" ) ] ) ] ) ,
297+ FreehandToolFsmState :: Ready => HintData ( vec ! [ HintGroup ( vec![
298+ HintInfo :: mouse( MouseMotion :: LmbDrag , "Draw Polyline" ) ,
299+ // TODO: Only show this if a single layer is selected and it's of a valid type (e.g. a vector path but not raster or artboard)
300+ HintInfo :: keys( [ Key :: Shift ] , "Append to Selected Layer" ) . prepend_plus( ) ,
301+ ] ) ] ) ,
283302 FreehandToolFsmState :: Drawing => HintData ( vec ! [ HintGroup ( vec![ HintInfo :: mouse( MouseMotion :: Rmb , "" ) , HintInfo :: keys( [ Key :: Escape ] , "Cancel" ) . prepend_slash( ) ] ) ] ) ,
284303 } ;
285304
@@ -291,7 +310,7 @@ impl Fsm for FreehandToolFsmState {
291310 }
292311}
293312
294- fn extend_path_with_next_segment ( tool_data : & mut FreehandToolData , position : DVec2 , responses : & mut VecDeque < Message > ) {
313+ fn extend_path_with_next_segment ( tool_data : & mut FreehandToolData , position : DVec2 , extend : bool , responses : & mut VecDeque < Message > ) {
295314 if !tool_data. end_point . map_or ( true , |( last_pos, _) | position != last_pos) || !position. is_finite ( ) {
296315 return ;
297316 }
@@ -304,18 +323,20 @@ fn extend_path_with_next_segment(tool_data: &mut FreehandToolData, position: DVe
304323 modification_type : VectorModificationType :: InsertPoint { id, position } ,
305324 } ) ;
306325
307- if let Some ( ( _, previous_position) ) = tool_data. end_point {
308- let next_id = SegmentId :: generate ( ) ;
309- let points = [ previous_position, id] ;
310-
311- responses. add ( GraphOperationMessage :: Vector {
312- layer,
313- modification_type : VectorModificationType :: InsertSegment {
314- id : next_id,
315- points,
316- handles : [ None , None ] ,
317- } ,
318- } ) ;
326+ if extend {
327+ if let Some ( ( _, previous_position) ) = tool_data. end_point {
328+ let next_id = SegmentId :: generate ( ) ;
329+ let points = [ previous_position, id] ;
330+
331+ responses. add ( GraphOperationMessage :: Vector {
332+ layer,
333+ modification_type : VectorModificationType :: InsertSegment {
334+ id : next_id,
335+ points,
336+ handles : [ None , None ] ,
337+ } ,
338+ } ) ;
339+ }
319340 }
320341
321342 tool_data. dragged = true ;
0 commit comments