From 902fb45258f1382941a157b3aa5019d88aa44a9b Mon Sep 17 00:00:00 2001 From: mtvare6 Date: Thu, 17 Apr 2025 16:44:24 +0530 Subject: [PATCH 1/2] Fix axis colors not being consistent and pivot not being draggable with zero width boxes Fixes #2311 --- .../utility_types/document_metadata.rs | 9 ++++--- .../tool/common_functionality/pivot.rs | 2 +- .../tool/tool_messages/select_tool.rs | 25 ++++++++++--------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/editor/src/messages/portfolio/document/utility_types/document_metadata.rs b/editor/src/messages/portfolio/document/utility_types/document_metadata.rs index 2c17a4315c..73b4348c38 100644 --- a/editor/src/messages/portfolio/document/utility_types/document_metadata.rs +++ b/editor/src/messages/portfolio/document/utility_types/document_metadata.rs @@ -146,13 +146,14 @@ impl DocumentMetadata { let bounds_size = bounds_max - bounds_min; let bounds_midpoint = bounds_min.midpoint(bounds_max); + const BOX_NUDGE: f64 = 5e-9; if bounds_size.x < 1e-10 { - bounds_max.x = bounds_midpoint.x + 0.5; - bounds_min.x = bounds_midpoint.x - 0.5; + bounds_max.x = bounds_midpoint.x + BOX_NUDGE; + bounds_min.x = bounds_midpoint.x - BOX_NUDGE; } if bounds_size.y < 1e-10 { - bounds_max.y = bounds_midpoint.y + 0.5; - bounds_min.y = bounds_midpoint.y - 0.5; + bounds_max.y = bounds_midpoint.y + BOX_NUDGE; + bounds_min.y = bounds_midpoint.y - BOX_NUDGE; } [bounds_min, bounds_max] diff --git a/editor/src/messages/tool/common_functionality/pivot.rs b/editor/src/messages/tool/common_functionality/pivot.rs index f9efcf84c5..1185658945 100644 --- a/editor/src/messages/tool/common_functionality/pivot.rs +++ b/editor/src/messages/tool/common_functionality/pivot.rs @@ -35,7 +35,7 @@ impl Default for Pivot { impl Pivot { /// Calculates the transform that gets from normalized pivot to viewspace. fn get_layer_pivot_transform(layer: LayerNodeIdentifier, document: &DocumentMessageHandler) -> DAffine2 { - let [min, max] = document.metadata().bounding_box_with_transform(layer, DAffine2::IDENTITY).unwrap_or_default(); + let [min, max] = document.metadata().nonzero_bounding_box(layer); let bounds_transform = DAffine2::from_translation(min) * DAffine2::from_scale(max - min); let layer_transform = document.metadata().transform_to_viewport(layer); diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index fc897a9a7a..191c9c03ef 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, RESIZE_HANDLE_SIZE, ROTATE_INCREMENT, - SELECTION_DRAG_ANGLE, SELECTION_TOLERANCE, + 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; @@ -707,22 +707,23 @@ impl Fsm for SelectToolFsmState { let angle = -mouse_position.angle_to(DVec2::X); let snapped_angle = (angle / snap_resolution).round() * snap_resolution; - let mut other = graphene_std::Color::from_rgb_str(COLOR_OVERLAY_BLUE.strip_prefix('#').unwrap()) - .unwrap() - .with_alpha(0.25) - .to_rgba_hex_srgb(); - other.insert(0, '#'); - let other = other.as_str(); - let extension = tool_data.drag_current - tool_data.drag_start; let origin = compass_center - extension; let viewport_diagonal = input.viewport_bounds.size().length(); - let edge = DVec2::from_angle(snapped_angle) * viewport_diagonal; + let edge = DVec2::from_angle(snapped_angle).normalize_or(DVec2::X) * viewport_diagonal; let perp = edge.perp(); - overlay_context.line(origin - edge * viewport_diagonal, origin + edge * viewport_diagonal, Some(COLOR_OVERLAY_BLUE), None); - overlay_context.line(origin - perp * viewport_diagonal, origin + perp * viewport_diagonal, Some(other), None); + let (edge_color, perp_color) = if edge.x.abs() > edge.y.abs() { + (COLOR_OVERLAY_RED, COLOR_OVERLAY_GREEN) + } else { + (COLOR_OVERLAY_GREEN, COLOR_OVERLAY_RED) + }; + let mut perp_color = graphene_std::Color::from_rgb_str(perp_color.strip_prefix('#').unwrap()).unwrap().with_alpha(0.25).to_rgba_hex_srgb(); + perp_color.insert(0, '#'); + let perp_color = perp_color.as_str(); + overlay_context.line(origin - edge * viewport_diagonal, origin + edge * viewport_diagonal, Some(edge_color), None); + overlay_context.line(origin - perp * viewport_diagonal, origin + perp * viewport_diagonal, Some(perp_color), None); } // Check if the tool is in selection mode From 1e08067cb052c3ff6caf0a544897e8fe9cfb22ed Mon Sep 17 00:00:00 2001 From: mtvare6 Date: Thu, 17 Apr 2025 22:39:05 +0530 Subject: [PATCH 2/2] Even for path --- .../messages/tool/tool_messages/path_tool.rs | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index c31855fae8..858366ec94 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -1,7 +1,8 @@ use super::select_tool::extend_lasso; use super::tool_prelude::*; use crate::consts::{ - COLOR_OVERLAY_BLUE, DRAG_DIRECTION_MODE_DETERMINATION_THRESHOLD, DRAG_THRESHOLD, HANDLE_ROTATE_SNAP_ANGLE, INSERT_POINT_ON_SEGMENT_TOO_FAR_DISTANCE, SELECTION_THRESHOLD, SELECTION_TOLERANCE, + COLOR_OVERLAY_BLUE, COLOR_OVERLAY_GREEN, COLOR_OVERLAY_RED, DRAG_DIRECTION_MODE_DETERMINATION_THRESHOLD, DRAG_THRESHOLD, HANDLE_ROTATE_SNAP_ANGLE, INSERT_POINT_ON_SEGMENT_TOO_FAR_DISTANCE, + SELECTION_THRESHOLD, SELECTION_TOLERANCE, }; use crate::messages::portfolio::document::overlays::utility_functions::{path_overlays, selected_segments}; use crate::messages::portfolio::document::overlays::utility_types::{DrawHandles, OverlayContext}; @@ -961,21 +962,19 @@ impl Fsm for PathToolFsmState { let origin = tool_data.drag_start_pos; let viewport_diagonal = input.viewport_bounds.size().length(); - let mut faded_blue = graphene_std::Color::from_rgb_str(COLOR_OVERLAY_BLUE.strip_prefix('#').unwrap()) - .unwrap() - .with_alpha(0.25) - .to_rgba_hex_srgb(); - faded_blue.insert(0, '#'); - let other = faded_blue.as_str(); - + let faded = |color: &str| { + let mut color = graphene_std::Color::from_rgb_str(color.strip_prefix('#').unwrap()).unwrap().with_alpha(0.25).to_rgba_hex_srgb(); + color.insert(0, '#'); + color + }; match axis { Axis::Y => { - overlay_context.line(origin - DVec2::Y * viewport_diagonal, origin + DVec2::Y * viewport_diagonal, Some(COLOR_OVERLAY_BLUE), None); - overlay_context.line(origin - DVec2::X * viewport_diagonal, origin + DVec2::X * viewport_diagonal, Some(other), None); + overlay_context.line(origin - DVec2::Y * viewport_diagonal, origin + DVec2::Y * viewport_diagonal, Some(COLOR_OVERLAY_GREEN), None); + overlay_context.line(origin - DVec2::X * viewport_diagonal, origin + DVec2::X * viewport_diagonal, Some(&faded(COLOR_OVERLAY_RED)), None); } Axis::X | Axis::Both => { - overlay_context.line(origin - DVec2::X * viewport_diagonal, origin + DVec2::X * viewport_diagonal, Some(COLOR_OVERLAY_BLUE), None); - overlay_context.line(origin - DVec2::Y * viewport_diagonal, origin + DVec2::Y * viewport_diagonal, Some(other), None); + overlay_context.line(origin - DVec2::X * viewport_diagonal, origin + DVec2::X * viewport_diagonal, Some(COLOR_OVERLAY_RED), None); + overlay_context.line(origin - DVec2::Y * viewport_diagonal, origin + DVec2::Y * viewport_diagonal, Some(&faded(COLOR_OVERLAY_GREEN)), None); } } }