diff --git a/editor/src/messages/tool/common_functionality/pivot.rs b/editor/src/messages/tool/common_functionality/pivot.rs index c56f12127e..5995408a80 100644 --- a/editor/src/messages/tool/common_functionality/pivot.rs +++ b/editor/src/messages/tool/common_functionality/pivot.rs @@ -83,6 +83,16 @@ impl Pivot { } } + pub fn update_box_pivot(&mut self, normalized_pivot: DVec2, layer_transform: DAffine2, bounds_transform: DAffine2, overlay_context: &mut OverlayContext) { + self.normalized_pivot = normalized_pivot; + self.transform_from_normalized = layer_transform * bounds_transform; + + self.pivot = Some(self.transform_from_normalized.transform_point2(normalized_pivot)); + if let Some(pivot) = self.pivot { + overlay_context.pivot(pivot); + } + } + pub fn update_pivot(&mut self, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { self.recalculate_pivot(document); if let Some(pivot) = self.pivot { diff --git a/editor/src/messages/tool/common_functionality/utility_functions.rs b/editor/src/messages/tool/common_functionality/utility_functions.rs index 750a2876b0..2e3dd1b4ec 100644 --- a/editor/src/messages/tool/common_functionality/utility_functions.rs +++ b/editor/src/messages/tool/common_functionality/utility_functions.rs @@ -38,7 +38,6 @@ pub fn text_bounding_box(layer: LayerNodeIdentifier, document: &DocumentMessageH let buzz_face = font_cache.get(font).map(|data| load_face(data)); let far = graphene_core::text::bounding_box(text, buzz_face, typesetting); let quad = Quad::from_box([DVec2::ZERO, far]); - let transformed_quad = document.metadata().transform_to_viewport(layer) * quad; - transformed_quad + quad } diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index ef75eae020..c965aaf7d7 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -425,8 +425,8 @@ impl Fsm for SelectToolFsmState { overlay_context.outline(document.metadata().layer_outline(layer), document.metadata().transform_to_viewport(layer)); if is_layer_fed_by_node_of_name(layer, &document.network_interface, "Text") { - let quad = text_bounding_box(layer, document, font_cache); - overlay_context.dashed_quad(quad, None, Some(7.), Some(5.), None); + let transformed_quad = document.metadata().transform_to_viewport(layer) * text_bounding_box(layer, document, font_cache); + overlay_context.dashed_quad(transformed_quad, None, Some(7.), Some(5.), None); } } diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index 2c9f5957c5..67f1cf5431 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -400,10 +400,10 @@ impl TextToolData { .all_layers() .filter(|&layer| is_layer_fed_by_node_of_name(layer, &document.network_interface, "Text")) .find(|&layer| { - let quad = text_bounding_box(layer, document, font_cache); + let transformed_quad = document.metadata().transform_to_viewport(layer) * text_bounding_box(layer, document, font_cache); let mouse = DVec2::new(input.mouse.position.x, input.mouse.position.y); - quad.contains(mouse) + transformed_quad.contains(mouse) }) } @@ -495,8 +495,8 @@ impl Fsm for TextToolFsmState { .selected_visible_and_unlocked_layers(&document.network_interface) { if is_layer_fed_by_node_of_name(layer, &document.network_interface, "Text") { - let quad = text_bounding_box(layer, document, font_cache); - overlay_context.quad(quad, None); + let transformed_quad = document.metadata().transform_to_viewport(layer) * text_bounding_box(layer, document, font_cache); + overlay_context.quad(transformed_quad, None); } } } @@ -519,14 +519,17 @@ impl Fsm for TextToolFsmState { if let Some(bounds) = bounds { let bounding_box_manager = tool_data.bounding_box_manager.get_or_insert(BoundingBoxManager::default()); bounding_box_manager.bounds = [bounds.0[0], bounds.0[2]]; - bounding_box_manager.transform = transform * transform.inverse(); + bounding_box_manager.transform = transform; bounding_box_manager.render_overlays(&mut overlay_context); } else { tool_data.bounding_box_manager.take(); } // Update pivot - tool_data.pivot.update_pivot(document, &mut overlay_context); + let (min, max) = bounds.map(|quad| (quad.0[0], quad.0[2])).unwrap(); + let bounds_transform = DAffine2::from_translation(min) * DAffine2::from_scale(max - min); + let layer_transform = document.metadata().transform_to_viewport(layer.unwrap()); + tool_data.pivot.update_box_pivot(DVec2::new(0.5, 0.5), layer_transform, bounds_transform, &mut overlay_context); tool_data.resize.snap_manager.draw_overlays(SnapData::new(document, input), &mut overlay_context); @@ -615,7 +618,10 @@ impl Fsm for TextToolFsmState { return state; } (TextToolFsmState::Ready, TextToolMessage::PointerMove { .. }) => { - let mut cursor = tool_data.bounding_box_manager.as_ref().map_or(MouseCursorIcon::Default, |bounds| bounds.get_cursor(input, false)); + let mut cursor = tool_data.bounding_box_manager.as_ref().map_or(MouseCursorIcon::Text, |bounds| bounds.get_cursor(input, false)); + if cursor == MouseCursorIcon::Default { + cursor = MouseCursorIcon::Text; + } // Dragging the pivot overrules the other operations if tool_data.pivot.is_over(input.mouse.position) { @@ -843,6 +849,7 @@ impl Fsm for TextToolFsmState { self } (TextToolFsmState::Editing, TextToolMessage::Abort) => { + tool_data.bounding_box_manager.take(); if tool_data.new_text.is_empty() { return tool_data.delete_empty_layer(font_cache, responses); }