From 0004bbb14b442fdd8860e7bf3fa75a4435df9817 Mon Sep 17 00:00:00 2001 From: mTvare Date: Fri, 21 Feb 2025 05:02:40 +0530 Subject: [PATCH] Fix transform cage bug where aborted resize/rotate after drag is used for next resize/rotate (#2308) * Fix the said issues * Replace numbers with consts --------- Co-authored-by: Keavon Chambers --- editor/src/consts.rs | 1 + .../tool/common_functionality/transformation_cage.rs | 5 +++-- editor/src/messages/tool/tool_messages/select_tool.rs | 11 ++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/editor/src/consts.rs b/editor/src/consts.rs index c10a8d86..7a3cf64c 100644 --- a/editor/src/consts.rs +++ b/editor/src/consts.rs @@ -73,6 +73,7 @@ pub const ANGLE_MEASURE_RADIUS_FACTOR: f64 = 0.04; pub const ARC_MEASURE_RADIUS_FACTOR_RANGE: (f64, f64) = (0.05, 0.15); // TRANSFORM CAGE +pub const RESIZE_HANDLE_SIZE: f64 = 6.; pub const BOUNDS_SELECT_THRESHOLD: f64 = 10.; pub const BOUNDS_ROTATE_THRESHOLD: f64 = 20.; pub const MIN_LENGTH_FOR_MIDPOINT_VISIBILITY: f64 = 20.; diff --git a/editor/src/messages/tool/common_functionality/transformation_cage.rs b/editor/src/messages/tool/common_functionality/transformation_cage.rs index 4c9f2985..5bf5ef8a 100644 --- a/editor/src/messages/tool/common_functionality/transformation_cage.rs +++ b/editor/src/messages/tool/common_functionality/transformation_cage.rs @@ -1,6 +1,6 @@ use crate::consts::{ BOUNDS_ROTATE_THRESHOLD, BOUNDS_SELECT_THRESHOLD, COLOR_OVERLAY_WHITE, MAXIMUM_ALT_SCALE_FACTOR, MIN_LENGTH_FOR_CORNERS_VISIBILITY, MIN_LENGTH_FOR_MIDPOINT_VISIBILITY, - MIN_LENGTH_FOR_RESIZE_TO_INCLUDE_INTERIOR, SELECTION_DRAG_ANGLE, + MIN_LENGTH_FOR_RESIZE_TO_INCLUDE_INTERIOR, RESIZE_HANDLE_SIZE, SELECTION_DRAG_ANGLE, }; use crate::messages::frontend::utility_types::MouseCursorIcon; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; @@ -389,7 +389,8 @@ impl BoundingBoxManager { overlay_context.quad(quad, None); let mut draw_handle = |point: DVec2| { - let quad = DAffine2::from_angle_translation((quad.top_left() - quad.top_right()).to_angle(), point) * Quad::from_box([DVec2::splat(-3.), DVec2::splat(3.)]); + let quad = DAffine2::from_angle_translation((quad.top_left() - quad.top_right()).to_angle(), point) + * Quad::from_box([DVec2::splat(-RESIZE_HANDLE_SIZE / 2.), DVec2::splat(RESIZE_HANDLE_SIZE / 2.)]); overlay_context.quad(quad, Some(COLOR_OVERLAY_WHITE)); }; diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 7d315a3d..83fc2987 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -2,8 +2,8 @@ use super::tool_prelude::*; use crate::consts::{ - COLOR_OVERLAY_BLUE, COLOR_OVERLAY_GREEN, COLOR_OVERLAY_RED, COMPASS_ROSE_HOVER_RING_DIAMETER, DRAG_DIRECTION_MODE_DETERMINATION_THRESHOLD, ROTATE_INCREMENT, SELECTION_DRAG_ANGLE, - SELECTION_TOLERANCE, + COLOR_OVERLAY_BLUE, COLOR_OVERLAY_GREEN, COLOR_OVERLAY_RED, COMPASS_ROSE_HOVER_RING_DIAMETER, DRAG_DIRECTION_MODE_DETERMINATION_THRESHOLD, RESIZE_HANDLE_SIZE, ROTATE_INCREMENT, + SELECTION_DRAG_ANGLE, SELECTION_TOLERANCE, }; use crate::messages::input_mapper::utility_types::input_mouse::ViewportPosition; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; @@ -583,7 +583,8 @@ impl Fsm for SelectToolFsmState { let show_compass = !(can_get_into_other_states || is_resizing_or_rotating); let show_compass_with_ring = bounds.map(|bounds| transform * Quad::from_box(bounds)).and_then(|quad| { - (show_compass && quad.all_sides_at_least_width(COMPASS_ROSE_HOVER_RING_DIAMETER)) + const MIN_ARROWS_TO_RESIZE_HANDLE_DISTANCE: f64 = 4.; + (show_compass && quad.all_sides_at_least_width(COMPASS_ROSE_HOVER_RING_DIAMETER + RESIZE_HANDLE_SIZE + MIN_ARROWS_TO_RESIZE_HANDLE_DISTANCE)) .then_some( matches!(self, SelectToolFsmState::Dragging { .. }) .then_some(show_hover_ring) @@ -1412,6 +1413,10 @@ impl Fsm for SelectToolFsmState { } }); + if let Some(bounds) = &mut tool_data.bounding_box_manager { + bounds.original_transforms.clear(); + } + responses.add(DocumentMessage::AbortTransaction); tool_data.snap_manager.cleanup(responses); responses.add(OverlaysMessage::Draw);