From e33bbbf8029656d60b1abedaff4875b94ad0a51b Mon Sep 17 00:00:00 2001 From: otdavies Date: Wed, 5 Jan 2022 00:36:33 -0800 Subject: [PATCH] Made snapping / overlays not render extra times, made snapping distance larger --- editor/src/consts.rs | 2 +- editor/src/tool/mod.rs | 2 +- editor/src/tool/snapping.rs | 10 +--------- editor/src/tool/tools/line.rs | 2 +- editor/src/tool/tools/pen.rs | 2 +- editor/src/tool/tools/resize.rs | 2 +- editor/src/tool/tools/select.rs | 13 ++++--------- 7 files changed, 10 insertions(+), 23 deletions(-) diff --git a/editor/src/consts.rs b/editor/src/consts.rs index 2a76e1ccfe..4b07bb9635 100644 --- a/editor/src/consts.rs +++ b/editor/src/consts.rs @@ -15,7 +15,7 @@ pub const VIEWPORT_SCROLL_RATE: f64 = 0.6; pub const VIEWPORT_ROTATE_SNAP_INTERVAL: f64 = 15.; -pub const SNAP_TOLERANCE: f64 = 3.; +pub const SNAP_TOLERANCE: f64 = 6.; // TRANSFORMING LAYER pub const ROTATE_SNAP_ANGLE: f64 = 15.; diff --git a/editor/src/tool/mod.rs b/editor/src/tool/mod.rs index bdea681706..aed0fad206 100644 --- a/editor/src/tool/mod.rs +++ b/editor/src/tool/mod.rs @@ -1,4 +1,4 @@ -mod snapping; +pub mod snapping; pub mod tool_message_handler; pub mod tool_options; pub mod tools; diff --git a/editor/src/tool/snapping.rs b/editor/src/tool/snapping.rs index 61c6512445..e5579302d9 100644 --- a/editor/src/tool/snapping.rs +++ b/editor/src/tool/snapping.rs @@ -58,20 +58,12 @@ impl SnapHandler { /// Gets a list of snap targets for the X and Y axes in Viewport coords for the target layers (usually all layers or all non-selected layers.) /// This should be called at the start of a drag. - pub fn start_snap( - &mut self, - responses: &mut VecDeque, - viewport_bounds: DVec2, - document_message_handler: &DocumentMessageHandler, - target_layers: Vec>, - ignore_layers: &[Vec], - ) { + pub fn start_snap(&mut self, responses: &mut VecDeque, viewport_bounds: DVec2, document_message_handler: &DocumentMessageHandler, target_layers: Vec>) { if document_message_handler.snapping_enabled { // Could be made into sorted Vec or a HashSet for more performant lookups. self.snap_targets = Some( target_layers .iter() - .filter(|path| !ignore_layers.contains(path)) .filter_map(|path| document_message_handler.graphene_document.viewport_bounding_box(path).ok()?) .flat_map(|[bound1, bound2]| [bound1, bound2, ((bound1 + bound2) / 2.)]) .map(|vec| vec.into()) diff --git a/editor/src/tool/tools/line.rs b/editor/src/tool/tools/line.rs index 8acb9922ec..666bec381d 100644 --- a/editor/src/tool/tools/line.rs +++ b/editor/src/tool/tools/line.rs @@ -86,7 +86,7 @@ impl Fsm for LineToolFsmState { if let ToolMessage::Line(event) = event { match (self, event) { (Ready, DragStart) => { - data.snap_handler.start_snap(responses, input.viewport_bounds.size(), document, document.all_layers_sorted(), &[]); + data.snap_handler.start_snap(responses, input.viewport_bounds.size(), document, document.all_layers_sorted()); data.drag_start = data.snap_handler.snap_position(document, input.mouse.position); responses.push_back(DocumentMessage::StartTransaction.into()); diff --git a/editor/src/tool/tools/pen.rs b/editor/src/tool/tools/pen.rs index b70d192f44..20d042199c 100644 --- a/editor/src/tool/tools/pen.rs +++ b/editor/src/tool/tools/pen.rs @@ -94,7 +94,7 @@ impl Fsm for PenToolFsmState { data.path = Some(vec![generate_uuid()]); data.layer_exists = false; - data.snap_handler.start_snap(responses, input.viewport_bounds.size(), document, document.all_layers_sorted(), &[]); + data.snap_handler.start_snap(responses, input.viewport_bounds.size(), document, document.all_layers_sorted()); let snapped_position = data.snap_handler.snap_position(document, input.mouse.position); let pos = transform.inverse() * DAffine2::from_translation(snapped_position); diff --git a/editor/src/tool/tools/resize.rs b/editor/src/tool/tools/resize.rs index 090b33b173..998ea4ae4c 100644 --- a/editor/src/tool/tools/resize.rs +++ b/editor/src/tool/tools/resize.rs @@ -16,7 +16,7 @@ impl Resize { /// Starts a resize, assigning the snap targets and snapping the starting position. pub fn start(&mut self, responses: &mut VecDeque, viewport_bounds: DVec2, document: &DocumentMessageHandler, mouse_position: DVec2) { let layers = document.all_layers_sorted(); - self.snap_handler.start_snap(responses, viewport_bounds, document, layers, &[]); + self.snap_handler.start_snap(responses, viewport_bounds, document, layers); self.drag_start = self.snap_handler.snap_position(document, mouse_position); } diff --git a/editor/src/tool/tools/select.rs b/editor/src/tool/tools/select.rs index 761a488a1d..ec78dea10b 100644 --- a/editor/src/tool/tools/select.rs +++ b/editor/src/tool/tools/select.rs @@ -174,6 +174,8 @@ impl Fsm for SelectToolFsmState { let state = if selected.iter().any(|path| intersection.contains(path)) { buffer.push(DocumentMessage::StartTransaction.into()); data.layers_dragging = selected; + data.snap_handler.start_snap(responses, input.viewport_bounds.size(), document, document.non_selected_layers_sorted()); + Dragging } else { if !input.keyboard.get(add_to_selection as usize) { @@ -186,6 +188,7 @@ impl Fsm for SelectToolFsmState { buffer.push(DocumentMessage::AddSelectedLayers(selected.clone()).into()); buffer.push(DocumentMessage::StartTransaction.into()); data.layers_dragging.append(&mut selected); + data.snap_handler.start_snap(responses, input.viewport_bounds.size(), document, document.non_selected_layers_sorted()); Dragging } else { data.drag_box_overlay_layer = Some(add_bounding_box(&mut buffer)); @@ -193,15 +196,6 @@ impl Fsm for SelectToolFsmState { } }; buffer.into_iter().rev().for_each(|message| responses.push_front(message)); - - // TODO: Probably delete this now that the overlay system has moved to a separate Graphene document? (@0hypercube) - let ignore_layers = if let Some(bounding_box) = &data.bounding_box_overlay_layer { - vec![bounding_box.clone()] - } else { - Vec::new() - }; - data.snap_handler - .start_snap(responses, input.viewport_bounds.size(), document, document.non_selected_layers_sorted(), &ignore_layers); state } (Dragging, MouseMove { snap_angle }) => { @@ -278,6 +272,7 @@ impl Fsm for SelectToolFsmState { let mut delete = |path: &mut Option>| path.take().map(|path| responses.push_front(DocumentMessage::Overlay(Operation::DeleteLayer { path }.into()).into())); delete(&mut data.drag_box_overlay_layer); delete(&mut data.bounding_box_overlay_layer); + data.snap_handler.cleanup(responses); Ready } (_, Align(axis, aggregate)) => {