From c2234ce3fe4a3763d8b88eda15e9608c8e1ba075 Mon Sep 17 00:00:00 2001 From: Angel Kozlev Date: Fri, 24 Feb 2023 00:47:21 +0000 Subject: [PATCH] Select Tool: Deselect selected layer when clicked while holding shift (#1030) * Change tauri build directory back to `../dist` (#1033) * Select Tool: Deselect selected layer when clicked while holding shift * Fix formatting * Change deselecting to happen on mouse up * Clean up debug and rustfmt --------- Co-authored-by: Dennis Kobert Co-authored-by: Keavon Chambers --- .../messages/input_mapper/default_mapping.rs | 2 +- .../tool/tool_messages/select_tool.rs | 41 ++++++++++++++++--- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/editor/src/messages/input_mapper/default_mapping.rs b/editor/src/messages/input_mapper/default_mapping.rs index 0c81b33a..47f1994d 100644 --- a/editor/src/messages/input_mapper/default_mapping.rs +++ b/editor/src/messages/input_mapper/default_mapping.rs @@ -51,7 +51,7 @@ pub fn default_mapping() -> Mapping { // SelectToolMessage entry!(PointerMove; refresh_keys=[Control, Shift, Alt], action_dispatch=SelectToolMessage::PointerMove { axis_align: Shift, snap_angle: Control, center: Alt, duplicate: Alt }), entry!(KeyDown(Lmb); action_dispatch=SelectToolMessage::DragStart { add_to_selection: Shift }), - entry!(KeyUp(Lmb); action_dispatch=SelectToolMessage::DragStop), + entry!(KeyUp(Lmb); action_dispatch=SelectToolMessage::DragStop { remove_from_selection: Shift }), entry!(KeyDown(Enter); action_dispatch=SelectToolMessage::Enter), entry!(DoubleClick; action_dispatch=SelectToolMessage::EditLayer), entry!(KeyDown(Rmb); action_dispatch=SelectToolMessage::Abort), diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index b0d5cab1..cb556a4c 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -54,7 +54,9 @@ pub enum SelectToolMessage { DragStart { add_to_selection: Key, }, - DragStop, + DragStop { + remove_from_selection: Key, + }, EditLayer, Enter, FlipHorizontal, @@ -255,6 +257,8 @@ struct SelectToolData { drag_start: ViewportPosition, drag_current: ViewportPosition, layers_dragging: Vec>, + layer_selected_on_start: Option>, + is_dragging: bool, not_duplicated_layers: Option>>, drag_box_overlay_layer: Option>, path_outlines: PathOutline, @@ -446,6 +450,7 @@ impl Fsm for SelectToolFsmState { } if let Some(intersection) = intersection.pop() { + tool_data.layer_selected_on_start = Some(intersection.clone()); selected = vec![intersection]; responses.push_back(DocumentMessage::AddSelectedLayers { additional_layers: selected.clone() }.into()); responses.push_back(DocumentMessage::StartTransaction.into()); @@ -465,6 +470,7 @@ impl Fsm for SelectToolFsmState { state } (Dragging, PointerMove { axis_align, duplicate, .. }) => { + tool_data.is_dragging = true; // TODO: This is a cheat. Break out the relevant functionality from the handler above and call it from there and here. responses.push_front(SelectToolMessage::DocumentIsDirty.into()); @@ -590,7 +596,7 @@ impl Fsm for SelectToolFsmState { Ready } - (Dragging, DragStop | Enter) => { + (Dragging, Enter) => { let response = match input.mouse.position.distance(tool_data.drag_start) < 10. * f64::EPSILON { true => DocumentMessage::Undo, false => DocumentMessage::CommitTransaction, @@ -599,7 +605,30 @@ impl Fsm for SelectToolFsmState { responses.push_front(response.into()); Ready } - (ResizingBounds, DragStop | Enter) => { + (Dragging, DragStop { remove_from_selection }) => { + // Deselect layer if not snap dragging + if !tool_data.is_dragging && input.keyboard.get(remove_from_selection as usize) && tool_data.layer_selected_on_start.is_none() { + let quad = tool_data.selection_quad(); + let intersection = document.document_legacy.intersects_quad_root(quad, render_data); + if let Some(intersect_layer_path) = intersection.last() { + let replacement_selected_layers = document.selected_layers().filter(|&layer| layer != intersect_layer_path).map(|path| path.to_vec()).collect(); + responses.push_back(DocumentMessage::SetSelectedLayers { replacement_selected_layers }.into()); + } + } + + tool_data.is_dragging = false; + tool_data.layer_selected_on_start = None; + + let response = match input.mouse.position.distance(tool_data.drag_start) < 10. * f64::EPSILON { + true => DocumentMessage::Undo, + false => DocumentMessage::CommitTransaction, + }; + tool_data.snap_manager.cleanup(responses); + responses.push_front(response.into()); + + Ready + } + (ResizingBounds, DragStop { .. } | Enter) => { let response = match input.mouse.position.distance(tool_data.drag_start) < 10. * f64::EPSILON { true => DocumentMessage::Undo, false => DocumentMessage::CommitTransaction, @@ -614,7 +643,7 @@ impl Fsm for SelectToolFsmState { Ready } - (RotatingBounds, DragStop | Enter) => { + (RotatingBounds, DragStop { .. } | Enter) => { let response = match input.mouse.position.distance(tool_data.drag_start) < 10. * f64::EPSILON { true => DocumentMessage::Undo, false => DocumentMessage::CommitTransaction, @@ -627,7 +656,7 @@ impl Fsm for SelectToolFsmState { Ready } - (DraggingPivot, DragStop | Enter) => { + (DraggingPivot, DragStop { .. } | Enter) => { let response = match input.mouse.position.distance(tool_data.drag_start) < 10. * f64::EPSILON { true => DocumentMessage::Undo, false => DocumentMessage::CommitTransaction, @@ -638,7 +667,7 @@ impl Fsm for SelectToolFsmState { Ready } - (DrawingBox, DragStop | Enter) => { + (DrawingBox, DragStop { .. } | Enter) => { let quad = tool_data.selection_quad(); responses.push_front( DocumentMessage::AddSelectedLayers {