Skip to content

Commit ed119ad

Browse files
committed
Add Freehand tool drawing new subpaths on an existing layer with Shift held
1 parent 3423c8e commit ed119ad

3 files changed

Lines changed: 42 additions & 21 deletions

File tree

editor/src/messages/input_mapper/input_mappings.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ pub fn input_mappings() -> Mapping {
258258
//
259259
// FreehandToolMessage
260260
entry!(PointerMove; action_dispatch=FreehandToolMessage::PointerMove),
261-
entry!(KeyDown(MouseLeft); action_dispatch=FreehandToolMessage::DragStart),
261+
entry!(KeyDown(MouseLeft); action_dispatch=FreehandToolMessage::DragStart { append_to_selected: Shift }),
262262
entry!(KeyUp(MouseLeft); action_dispatch=FreehandToolMessage::DragStop),
263263
entry!(KeyDown(MouseRight); action_dispatch=FreehandToolMessage::Abort),
264264
entry!(KeyDown(Escape); action_dispatch=FreehandToolMessage::Abort),

editor/src/messages/tool/tool_messages/freehand_tool.rs

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

editor/src/messages/tool/tool_messages/pen_tool.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub enum PenToolMessage {
5151

5252
// Tool-specific messages
5353

54-
// It is necessary to defer this until the transform of the layer can be accuratly computed (quite hacky)
54+
// It is necessary to defer this until the transform of the layer can be accurately computed (quite hacky)
5555
AddPointLayerPosition { layer: LayerNodeIdentifier, viewport: DVec2 },
5656
Confirm,
5757
DragStart { append_to_selected: Key },
@@ -500,7 +500,7 @@ impl PenToolData {
500500

501501
// This causes the following message to be run only after the next graph evaluation runs and the transforms are updated
502502
responses.add(Message::StartBuffer);
503-
// It is necessary to defer this until the transform of the layer can be accuratly computed (quite hacky)
503+
// It is necessary to defer this until the transform of the layer can be accurately computed (quite hacky)
504504
responses.add(PenToolMessage::AddPointLayerPosition { layer, viewport });
505505
}
506506

0 commit comments

Comments
 (0)