From b73a6af6c78158f1cb869a3c65e48ef1ac6fd1f0 Mon Sep 17 00:00:00 2001 From: thermalPasteMilkshake Date: Tue, 21 Jul 2026 21:02:10 +0530 Subject: [PATCH 1/6] altered select tool --- .../messages/tool/tool_messages/select_tool.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index d559a595b2..fa4ac936f7 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -751,11 +751,12 @@ impl Fsm for SelectToolFsmState { { draw_layer_outline(&mut overlay_context, document, layer, None); - if document.metadata().is_text_layer(layer) { - let layer_to_viewport = document.metadata().transform_to_viewport(layer); - let transformed_quad = layer_to_viewport * text_bounding_box(layer, document, fonts, responses); - overlay_context.dashed_quad(transformed_quad, None, None, Some(7.), Some(5.), None); - } + // if document.metadata().is_text_layer(layer) { + // debug!("This got called"); + // let layer_to_viewport = document.metadata().transform_to_viewport(layer); + // let transformed_quad = layer_to_viewport * text_bounding_box(layer, document, fonts, responses); + // overlay_context.dashed_quad(transformed_quad, None, None, Some(7.), Some(5.), None); + // } } } @@ -1125,7 +1126,7 @@ impl Fsm for SelectToolFsmState { if let Some(intersect) = document.click(input, viewport) { match tool_data.nested_selection_behavior { NestedSelectionBehavior::Shallowest => edit_layer_shallowest_manipulation(document, intersect, responses), - NestedSelectionBehavior::Deepest => edit_layer_deepest_manipulation(intersect, &document.network_interface, responses), + NestedSelectionBehavior::Deepest => {} } } self @@ -1710,9 +1711,11 @@ impl Fsm for SelectToolFsmState { let selected_nodes = document.network_interface.selected_nodes(); let mut selected_layers = selected_nodes.selected_layers(document.metadata()); + // this doesnt seem to get called anywhere. if let Some(layer) = selected_layers.next() { // Check that only one layer is selected if selected_layers.next().is_none() && document.metadata().is_text_layer(layer) { + debug!("THIS GOT CALLED"); responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Text }); responses.add(TextToolMessage::EditSelected); } From f7fa891f89856047dc839316c69cb4d59649e6e6 Mon Sep 17 00:00:00 2001 From: thermalPasteMilkshake Date: Tue, 21 Jul 2026 21:15:10 +0530 Subject: [PATCH 2/6] Fix deep select double click on text --- .../messages/tool/tool_messages/select_tool.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index d559a595b2..fa4ac936f7 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -751,11 +751,12 @@ impl Fsm for SelectToolFsmState { { draw_layer_outline(&mut overlay_context, document, layer, None); - if document.metadata().is_text_layer(layer) { - let layer_to_viewport = document.metadata().transform_to_viewport(layer); - let transformed_quad = layer_to_viewport * text_bounding_box(layer, document, fonts, responses); - overlay_context.dashed_quad(transformed_quad, None, None, Some(7.), Some(5.), None); - } + // if document.metadata().is_text_layer(layer) { + // debug!("This got called"); + // let layer_to_viewport = document.metadata().transform_to_viewport(layer); + // let transformed_quad = layer_to_viewport * text_bounding_box(layer, document, fonts, responses); + // overlay_context.dashed_quad(transformed_quad, None, None, Some(7.), Some(5.), None); + // } } } @@ -1125,7 +1126,7 @@ impl Fsm for SelectToolFsmState { if let Some(intersect) = document.click(input, viewport) { match tool_data.nested_selection_behavior { NestedSelectionBehavior::Shallowest => edit_layer_shallowest_manipulation(document, intersect, responses), - NestedSelectionBehavior::Deepest => edit_layer_deepest_manipulation(intersect, &document.network_interface, responses), + NestedSelectionBehavior::Deepest => {} } } self @@ -1710,9 +1711,11 @@ impl Fsm for SelectToolFsmState { let selected_nodes = document.network_interface.selected_nodes(); let mut selected_layers = selected_nodes.selected_layers(document.metadata()); + // this doesnt seem to get called anywhere. if let Some(layer) = selected_layers.next() { // Check that only one layer is selected if selected_layers.next().is_none() && document.metadata().is_text_layer(layer) { + debug!("THIS GOT CALLED"); responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Text }); responses.add(TextToolMessage::EditSelected); } From 0a1c200d1d59b59853bcef5f23ed86df891bcb41 Mon Sep 17 00:00:00 2001 From: thermalPasteMilkshake Date: Thu, 23 Jul 2026 23:39:26 +0530 Subject: [PATCH 3/6] fixed text tool spawning --- desktop/ui/src/input.rs | 1 + .../messages/tool/tool_messages/text_tool.rs | 67 +++++++++++++++++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/desktop/ui/src/input.rs b/desktop/ui/src/input.rs index a98b72cc48..555b2c12ec 100644 --- a/desktop/ui/src/input.rs +++ b/desktop/ui/src/input.rs @@ -20,6 +20,7 @@ pub(crate) enum InputEvent { Key(KeyData), } + #[derive(Clone, Copy, Debug, serde::Serialize, serde::Deserialize)] pub(crate) struct MouseData { pub(crate) x: i32, diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index d88c8c29fc..1d64235616 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -471,6 +471,27 @@ struct TextToolData { } impl TextToolData { + + // thingy to check if clicked outside textbox + // another one is set_editing 2 functions below + fn clicked_outside_textbox( + &self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + fonts: &FontsMessageHandler, + responses: &mut VecDeque, + ) -> bool { + let mouse = input.mouse.position; + + let quad = + document.metadata().transform_to_viewport(self.layer) + * text_bounding_box(self.layer, document, fonts, responses); + + !quad.contains(mouse) + } + + + fn delete_empty_layer(&mut self, fonts: &FontsMessageHandler, responses: &mut VecDeque) -> TextToolFsmState { // Remove the editable textbox UI first self.set_editing(false, fonts, responses); @@ -726,6 +747,8 @@ impl Fsm for TextToolFsmState { self } (state, TextToolMessage::EditSelected) => { + debug!("Editing selected on 750"); + eprintln!("Editing selected on 750"); if let Some(layer) = can_edit_selected(document) { tool_data.start_editing_layer(layer, state, document, fonts, responses); return TextToolFsmState::Editing; @@ -734,6 +757,8 @@ impl Fsm for TextToolFsmState { state } (TextToolFsmState::Ready, TextToolMessage::DragStart) => { + debug!("Ready and drag start on 758"); + eprintln!("Read and drag start on 758"); tool_data.resize.start(document, input, viewport); tool_data.cached_resize_bounds = [tool_data.resize.viewport_drag_start(document); 2]; tool_data.drag_start = input.mouse.position; @@ -789,6 +814,9 @@ impl Fsm for TextToolFsmState { TextToolFsmState::Placing } (TextToolFsmState::Ready, TextToolMessage::PointerMove { .. }) => { + + debug!("Ready and pointer move on line 814"); + eprintln!("Ready and pointer move on line 814"); // This ensures the cursor only changes if a layer is selected let selected = document.network_interface.selected_nodes(); let mut all_selected = selected.selected_visible_and_unlocked_layers(&document.network_interface); @@ -822,6 +850,7 @@ impl Fsm for TextToolFsmState { TextToolFsmState::Placing } (TextToolFsmState::Dragging, TextToolMessage::PointerMove { center, lock_ratio }) => { + debug!("Dragging and pointer Move on 853"); if let Some(dragging_layer) = &tool_data.layer_dragging { let delta = input.mouse.position - tool_data.drag_current; tool_data.drag_current = input.mouse.position; @@ -846,6 +875,7 @@ impl Fsm for TextToolFsmState { TextToolFsmState::Dragging } (TextToolFsmState::ResizingBounds, TextToolMessage::PointerMove { center, lock_ratio }) => { + debug!("Resizing bounds and pointer move on 878"); if let Some(bounds) = &mut tool_data.bounding_box_manager && let Some(movement) = &mut bounds.selected_edges { @@ -866,6 +896,9 @@ impl Fsm for TextToolFsmState { snap_data: SnapData::ignore(document, input, viewport, &selected), }); + + // This seems to be the part of code im concerned with btw + let (position, size) = movement.new_size(input.mouse.position, bounds.original_bound_transform, center_position, constrain, snap); // Normalize so the size is always positive let (position, size) = (position.min(position + size), size.abs()); @@ -963,19 +996,34 @@ impl Fsm for TextToolFsmState { } (TextToolFsmState::Placing, TextToolMessage::DragStop) => { let [start, end] = tool_data.cached_resize_bounds; + + let top_left = start.min(end); + let bottom_right = start.max(end); + + debug!("start = {:?}", start); + debug!("end = {:?}", end); let has_dragged = (start - end).length_squared() > DRAG_THRESHOLD * DRAG_THRESHOLD; // Check if the user has clicked (no dragging) on some existing text - if !has_dragged && let Some(clicked_text_layer_path) = TextToolData::check_click(document, input, fonts, responses) { + if !has_dragged && let Some(clicked_text_layer_path) = + TextToolData::check_click(document, input, fonts, responses) { + debug!("Editing mode on"); + eprintln!("Editing mode on"); tool_data.start_editing_layer(clicked_text_layer_path, self, document, fonts, responses); return TextToolFsmState::Editing; } - + // Otherwise create some new text. The window-aligned transform is in viewport space, so the editing overlay (a screen-space CSS matrix) carries the zoom. - let constraint_size = has_dragged.then_some((start - end).abs() / viewport_zoom(document)); + debug!("otherwise mode on"); + eprintln!("otherwise mode on"); + + // this "constraint" is the bounding box, this is what im concerned with + // let constraint_size = has_dragged.then_some((start - end).abs() / viewport_zoom(document)); + let constraint_size = + has_dragged.then_some((bottom_right - top_left) / viewport_zoom(document)); let editing_text = EditingText { text: String::new(), - transform: window_aligned_transform(document, start, DVec2::ONE), + transform: window_aligned_transform(document, top_left, DVec2::ONE), typesetting: TypesettingConfig { font_size: tool_options.font_size, letter_spacing: tool_options.letter_spacing, @@ -1019,6 +1067,15 @@ impl Fsm for TextToolFsmState { TextToolFsmState::Editing } + + (TextToolFsmState::Editing, TextToolMessage::DragStart) => { + if tool_data.clicked_outside_textbox(document, input, fonts, responses) { + responses.add(FrontendMessage::TriggerTextCommit); + debug!("clicked outside text box"); + } + + TextToolFsmState::Ready + } (TextToolFsmState::Editing, TextToolMessage::TextChange { new_text, is_left_or_right_click }) => { tool_data.new_text = new_text; @@ -1042,6 +1099,8 @@ impl Fsm for TextToolFsmState { TextToolFsmState::Editing } } + + // why does something called "updateBounds" change text instead of changing borders (TextToolFsmState::Editing, TextToolMessage::UpdateBounds { new_text }) => { tool_data.new_text = new_text; responses.add(OverlaysMessage::Draw); From 8a83df97a2b3a965dfbe9cd1ac1d5772df6bd890 Mon Sep 17 00:00:00 2001 From: thermalPasteMilkshake Date: Thu, 23 Jul 2026 23:41:29 +0530 Subject: [PATCH 4/6] removed debug statements -_- --- .../messages/tool/tool_messages/text_tool.rs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index 1d64235616..2fdaa0b8cc 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -747,8 +747,6 @@ impl Fsm for TextToolFsmState { self } (state, TextToolMessage::EditSelected) => { - debug!("Editing selected on 750"); - eprintln!("Editing selected on 750"); if let Some(layer) = can_edit_selected(document) { tool_data.start_editing_layer(layer, state, document, fonts, responses); return TextToolFsmState::Editing; @@ -757,8 +755,6 @@ impl Fsm for TextToolFsmState { state } (TextToolFsmState::Ready, TextToolMessage::DragStart) => { - debug!("Ready and drag start on 758"); - eprintln!("Read and drag start on 758"); tool_data.resize.start(document, input, viewport); tool_data.cached_resize_bounds = [tool_data.resize.viewport_drag_start(document); 2]; tool_data.drag_start = input.mouse.position; @@ -815,8 +811,6 @@ impl Fsm for TextToolFsmState { } (TextToolFsmState::Ready, TextToolMessage::PointerMove { .. }) => { - debug!("Ready and pointer move on line 814"); - eprintln!("Ready and pointer move on line 814"); // This ensures the cursor only changes if a layer is selected let selected = document.network_interface.selected_nodes(); let mut all_selected = selected.selected_visible_and_unlocked_layers(&document.network_interface); @@ -850,7 +844,6 @@ impl Fsm for TextToolFsmState { TextToolFsmState::Placing } (TextToolFsmState::Dragging, TextToolMessage::PointerMove { center, lock_ratio }) => { - debug!("Dragging and pointer Move on 853"); if let Some(dragging_layer) = &tool_data.layer_dragging { let delta = input.mouse.position - tool_data.drag_current; tool_data.drag_current = input.mouse.position; @@ -875,7 +868,6 @@ impl Fsm for TextToolFsmState { TextToolFsmState::Dragging } (TextToolFsmState::ResizingBounds, TextToolMessage::PointerMove { center, lock_ratio }) => { - debug!("Resizing bounds and pointer move on 878"); if let Some(bounds) = &mut tool_data.bounding_box_manager && let Some(movement) = &mut bounds.selected_edges { @@ -1000,24 +992,18 @@ impl Fsm for TextToolFsmState { let top_left = start.min(end); let bottom_right = start.max(end); - debug!("start = {:?}", start); - debug!("end = {:?}", end); let has_dragged = (start - end).length_squared() > DRAG_THRESHOLD * DRAG_THRESHOLD; // Check if the user has clicked (no dragging) on some existing text if !has_dragged && let Some(clicked_text_layer_path) = TextToolData::check_click(document, input, fonts, responses) { - debug!("Editing mode on"); - eprintln!("Editing mode on"); tool_data.start_editing_layer(clicked_text_layer_path, self, document, fonts, responses); return TextToolFsmState::Editing; } // Otherwise create some new text. The window-aligned transform is in viewport space, so the editing overlay (a screen-space CSS matrix) carries the zoom. - debug!("otherwise mode on"); - eprintln!("otherwise mode on"); - // this "constraint" is the bounding box, this is what im concerned with + // this "constraint" is the bounding box, this is what im concerned with FOUND // let constraint_size = has_dragged.then_some((start - end).abs() / viewport_zoom(document)); let constraint_size = has_dragged.then_some((bottom_right - top_left) / viewport_zoom(document)); @@ -1071,7 +1057,6 @@ impl Fsm for TextToolFsmState { (TextToolFsmState::Editing, TextToolMessage::DragStart) => { if tool_data.clicked_outside_textbox(document, input, fonts, responses) { responses.add(FrontendMessage::TriggerTextCommit); - debug!("clicked outside text box"); } TextToolFsmState::Ready From a83b51c2de5a98d017ee86690bfd46084932d531 Mon Sep 17 00:00:00 2001 From: thermalPasteMilkshake Date: Thu, 23 Jul 2026 23:52:53 +0530 Subject: [PATCH 5/6] made the function empty instead of using {} --- editor/src/messages/tool/tool_messages/select_tool.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index fa4ac936f7..597e32ee56 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -1126,7 +1126,7 @@ impl Fsm for SelectToolFsmState { if let Some(intersect) = document.click(input, viewport) { match tool_data.nested_selection_behavior { NestedSelectionBehavior::Shallowest => edit_layer_shallowest_manipulation(document, intersect, responses), - NestedSelectionBehavior::Deepest => {} + NestedSelectionBehavior::Deepest => {edit_layer_deepest_manipulation(intersect, &document.network_interface, responses)} } } self @@ -1715,7 +1715,6 @@ impl Fsm for SelectToolFsmState { if let Some(layer) = selected_layers.next() { // Check that only one layer is selected if selected_layers.next().is_none() && document.metadata().is_text_layer(layer) { - debug!("THIS GOT CALLED"); responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Text }); responses.add(TextToolMessage::EditSelected); } @@ -2075,10 +2074,7 @@ fn edit_layer_shallowest_manipulation(document: &DocumentMessageHandler, layer: /// Called when a double click on a layer in deep select mode. /// If the layer is text, the text tool is selected. fn edit_layer_deepest_manipulation(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface, responses: &mut VecDeque) { - if network_interface.document_metadata().is_text_layer(layer) { - responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Text }); - responses.add(TextToolMessage::EditSelected); - } + unimplemented!(); } pub fn extend_lasso(lasso_polygon: &mut Vec, point: DVec2) { From 5c6d7c299275e7f4583446376784076dbc5e60b9 Mon Sep 17 00:00:00 2001 From: thermalPasteMilkshake Date: Fri, 24 Jul 2026 00:07:40 +0530 Subject: [PATCH 6/6] removed unnecessary code --- .../messages/tool/tool_messages/text_tool.rs | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index 2fdaa0b8cc..1c8fa66896 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -472,26 +472,6 @@ struct TextToolData { impl TextToolData { - // thingy to check if clicked outside textbox - // another one is set_editing 2 functions below - fn clicked_outside_textbox( - &self, - document: &DocumentMessageHandler, - input: &InputPreprocessorMessageHandler, - fonts: &FontsMessageHandler, - responses: &mut VecDeque, - ) -> bool { - let mouse = input.mouse.position; - - let quad = - document.metadata().transform_to_viewport(self.layer) - * text_bounding_box(self.layer, document, fonts, responses); - - !quad.contains(mouse) - } - - - fn delete_empty_layer(&mut self, fonts: &FontsMessageHandler, responses: &mut VecDeque) -> TextToolFsmState { // Remove the editable textbox UI first self.set_editing(false, fonts, responses); @@ -1053,14 +1033,6 @@ impl Fsm for TextToolFsmState { TextToolFsmState::Editing } - - (TextToolFsmState::Editing, TextToolMessage::DragStart) => { - if tool_data.clicked_outside_textbox(document, input, fonts, responses) { - responses.add(FrontendMessage::TriggerTextCommit); - } - - TextToolFsmState::Ready - } (TextToolFsmState::Editing, TextToolMessage::TextChange { new_text, is_left_or_right_click }) => { tool_data.new_text = new_text;