From 0f03762cff3b5bb02789fbf676c38c18d1cf7fa7 Mon Sep 17 00:00:00 2001 From: Utsav Singh Date: Wed, 5 Feb 2025 10:15:57 +0530 Subject: [PATCH] Make the Select tool avoid updating hints just when clicking but not dragging (#2248) * make Fsm update_hints function borrow tool_data and update individual tool implementations accordingly, use tool_data in select_tool update_hints function as well as add a UpdateHints response when the pointer moves after the change from DragStart to Dragging state * Also add for selection box drawing * Code review --------- Co-authored-by: Keavon Chambers --- .../messages/tool/tool_messages/artboard_tool.rs | 2 +- .../src/messages/tool/tool_messages/brush_tool.rs | 2 +- .../messages/tool/tool_messages/ellipse_tool.rs | 2 +- .../messages/tool/tool_messages/eyedropper_tool.rs | 2 +- .../src/messages/tool/tool_messages/fill_tool.rs | 2 +- .../messages/tool/tool_messages/freehand_tool.rs | 2 +- .../messages/tool/tool_messages/gradient_tool.rs | 2 +- .../messages/tool/tool_messages/imaginate_tool.rs | 2 +- .../src/messages/tool/tool_messages/line_tool.rs | 2 +- .../messages/tool/tool_messages/navigate_tool.rs | 2 +- .../src/messages/tool/tool_messages/path_tool.rs | 2 +- editor/src/messages/tool/tool_messages/pen_tool.rs | 2 +- .../messages/tool/tool_messages/polygon_tool.rs | 2 +- .../messages/tool/tool_messages/rectangle_tool.rs | 2 +- .../src/messages/tool/tool_messages/select_tool.rs | 14 +++++++++----- .../src/messages/tool/tool_messages/spline_tool.rs | 2 +- .../src/messages/tool/tool_messages/text_tool.rs | 2 +- editor/src/messages/tool/utility_types.rs | 8 ++++---- 18 files changed, 29 insertions(+), 25 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/artboard_tool.rs b/editor/src/messages/tool/tool_messages/artboard_tool.rs index 4776ba1c..3bbe23ab 100644 --- a/editor/src/messages/tool/tool_messages/artboard_tool.rs +++ b/editor/src/messages/tool/tool_messages/artboard_tool.rs @@ -559,7 +559,7 @@ impl Fsm for ArtboardToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { ArtboardToolFsmState::Ready { .. } => HintData(vec![ HintGroup(vec![HintInfo::mouse(MouseMotion::LmbDrag, "Draw Artboard")]), diff --git a/editor/src/messages/tool/tool_messages/brush_tool.rs b/editor/src/messages/tool/tool_messages/brush_tool.rs index 3bc6d909..4cacebe3 100644 --- a/editor/src/messages/tool/tool_messages/brush_tool.rs +++ b/editor/src/messages/tool/tool_messages/brush_tool.rs @@ -425,7 +425,7 @@ impl Fsm for BrushToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { BrushToolFsmState::Ready => HintData(vec![ HintGroup(vec![HintInfo::mouse(MouseMotion::LmbDrag, "Draw")]), diff --git a/editor/src/messages/tool/tool_messages/ellipse_tool.rs b/editor/src/messages/tool/tool_messages/ellipse_tool.rs index d694941d..b38fe917 100644 --- a/editor/src/messages/tool/tool_messages/ellipse_tool.rs +++ b/editor/src/messages/tool/tool_messages/ellipse_tool.rs @@ -282,7 +282,7 @@ impl Fsm for EllipseToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { EllipseToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::LmbDrag, "Draw Ellipse"), diff --git a/editor/src/messages/tool/tool_messages/eyedropper_tool.rs b/editor/src/messages/tool/tool_messages/eyedropper_tool.rs index 1f815e8b..0c7aaf46 100644 --- a/editor/src/messages/tool/tool_messages/eyedropper_tool.rs +++ b/editor/src/messages/tool/tool_messages/eyedropper_tool.rs @@ -123,7 +123,7 @@ impl Fsm for EyedropperToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { EyedropperToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::Lmb, "Sample to Primary"), diff --git a/editor/src/messages/tool/tool_messages/fill_tool.rs b/editor/src/messages/tool/tool_messages/fill_tool.rs index 9600883d..250e2ee7 100644 --- a/editor/src/messages/tool/tool_messages/fill_tool.rs +++ b/editor/src/messages/tool/tool_messages/fill_tool.rs @@ -108,7 +108,7 @@ impl Fsm for FillToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { FillToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::Lmb, "Fill with Primary"), diff --git a/editor/src/messages/tool/tool_messages/freehand_tool.rs b/editor/src/messages/tool/tool_messages/freehand_tool.rs index ce7f4dfb..c75092a8 100644 --- a/editor/src/messages/tool/tool_messages/freehand_tool.rs +++ b/editor/src/messages/tool/tool_messages/freehand_tool.rs @@ -292,7 +292,7 @@ impl Fsm for FreehandToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { FreehandToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::LmbDrag, "Draw Polyline"), diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index a6676fb7..7e822e8c 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -492,7 +492,7 @@ impl Fsm for GradientToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { GradientToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::LmbDrag, "Draw Gradient"), diff --git a/editor/src/messages/tool/tool_messages/imaginate_tool.rs b/editor/src/messages/tool/tool_messages/imaginate_tool.rs index 79a95286..dcdfbe17 100644 --- a/editor/src/messages/tool/tool_messages/imaginate_tool.rs +++ b/editor/src/messages/tool/tool_messages/imaginate_tool.rs @@ -165,7 +165,7 @@ impl Fsm for ImaginateToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { ImaginateToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::LmbDrag, "Draw Repaint Frame"), diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs index b7528395..e61eee38 100644 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ b/editor/src/messages/tool/tool_messages/line_tool.rs @@ -261,7 +261,7 @@ impl Fsm for LineToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { LineToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::LmbDrag, "Draw Line"), diff --git a/editor/src/messages/tool/tool_messages/navigate_tool.rs b/editor/src/messages/tool/tool_messages/navigate_tool.rs index daf4c146..c703b5b5 100644 --- a/editor/src/messages/tool/tool_messages/navigate_tool.rs +++ b/editor/src/messages/tool/tool_messages/navigate_tool.rs @@ -144,7 +144,7 @@ impl Fsm for NavigateToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { NavigateToolFsmState::Ready | NavigateToolFsmState::ZoomOrClickZooming => HintData(vec![ HintGroup(vec![ diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 275c7e6c..940d667f 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -1158,7 +1158,7 @@ impl Fsm for PathToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { PathToolFsmState::Ready => HintData(vec![ HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Select Point"), HintInfo::keys([Key::Shift], "Extend Selection").prepend_plus()]), diff --git a/editor/src/messages/tool/tool_messages/pen_tool.rs b/editor/src/messages/tool/tool_messages/pen_tool.rs index 960f9804..616f6212 100644 --- a/editor/src/messages/tool/tool_messages/pen_tool.rs +++ b/editor/src/messages/tool/tool_messages/pen_tool.rs @@ -1126,7 +1126,7 @@ impl Fsm for PenToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { PenToolFsmState::Ready | PenToolFsmState::GRSHandle => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::Lmb, "Draw Path"), diff --git a/editor/src/messages/tool/tool_messages/polygon_tool.rs b/editor/src/messages/tool/tool_messages/polygon_tool.rs index 90fc61a8..cb3ba2d6 100644 --- a/editor/src/messages/tool/tool_messages/polygon_tool.rs +++ b/editor/src/messages/tool/tool_messages/polygon_tool.rs @@ -345,7 +345,7 @@ impl Fsm for PolygonToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { PolygonToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::LmbDrag, "Draw Polygon"), diff --git a/editor/src/messages/tool/tool_messages/rectangle_tool.rs b/editor/src/messages/tool/tool_messages/rectangle_tool.rs index 80e167b4..89b2c41c 100644 --- a/editor/src/messages/tool/tool_messages/rectangle_tool.rs +++ b/editor/src/messages/tool/tool_messages/rectangle_tool.rs @@ -288,7 +288,7 @@ impl Fsm for RectangleToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { RectangleToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::LmbDrag, "Draw Rectangle"), diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 2c098423..7c9fcf59 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -227,6 +227,10 @@ impl<'a> MessageHandler> for SelectT responses.add(ToolMessage::UpdateHints); } + if matches!(message, ToolMessage::Select(SelectToolMessage::PointerMove(_))) && !self.tool_data.has_dragged { + responses.add(ToolMessage::UpdateHints); + } + self.fsm_state.process_event(message, &mut self.tool_data, tool_data, &(), responses, false); if self.tool_data.pivot.should_refresh_pivot_position() || self.tool_data.selected_layers_changed { @@ -1234,11 +1238,11 @@ impl Fsm for SelectToolFsmState { } } - fn standard_tool_messages(&self, message: &ToolMessage, responses: &mut VecDeque, _tool_data: &mut Self::ToolData) -> bool { + fn standard_tool_messages(&self, message: &ToolMessage, responses: &mut VecDeque, tool_data: &mut Self::ToolData) -> bool { // Check for standard hits or cursor events match message { ToolMessage::UpdateHints => { - self.update_hints(responses); + self.update_hints(responses, tool_data); true } ToolMessage::UpdateCursor => { @@ -1249,7 +1253,7 @@ impl Fsm for SelectToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, tool_data: &Self::ToolData) { match self { SelectToolFsmState::Ready { selection } => { let hint_data = HintData(vec![ @@ -1281,7 +1285,7 @@ impl Fsm for SelectToolFsmState { ]); responses.add(FrontendMessage::UpdateInputHints { hint_data }); } - SelectToolFsmState::Dragging => { + SelectToolFsmState::Dragging if tool_data.has_dragged => { let hint_data = HintData(vec![ HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain to Axis")]), @@ -1292,7 +1296,7 @@ impl Fsm for SelectToolFsmState { ]); responses.add(FrontendMessage::UpdateInputHints { hint_data }); } - SelectToolFsmState::Drawing { .. } => { + SelectToolFsmState::Drawing { .. } if tool_data.drag_start != tool_data.drag_current => { let hint_data = HintData(vec![ HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), HintGroup(vec![HintInfo::keys([Key::Shift], "Extend"), HintInfo::keys([Key::Alt], "Subtract")]), diff --git a/editor/src/messages/tool/tool_messages/spline_tool.rs b/editor/src/messages/tool/tool_messages/spline_tool.rs index 7a9708b8..7f1ab31f 100644 --- a/editor/src/messages/tool/tool_messages/spline_tool.rs +++ b/editor/src/messages/tool/tool_messages/spline_tool.rs @@ -381,7 +381,7 @@ impl Fsm for SplineToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { SplineToolFsmState::Ready => HintData(vec![HintGroup(vec![ HintInfo::mouse(MouseMotion::Lmb, "Draw Spline"), diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index 11509d69..14da9427 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -615,7 +615,7 @@ impl Fsm for TextToolFsmState { } } - fn update_hints(&self, responses: &mut VecDeque) { + fn update_hints(&self, responses: &mut VecDeque, _tool_data: &Self::ToolData) { let hint_data = match self { TextToolFsmState::Ready => HintData(vec![ HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Place Text")]), diff --git a/editor/src/messages/tool/utility_types.rs b/editor/src/messages/tool/utility_types.rs index 7d4567d7..16cf1f04 100644 --- a/editor/src/messages/tool/utility_types.rs +++ b/editor/src/messages/tool/utility_types.rs @@ -56,16 +56,16 @@ pub trait Fsm { fn transition(self, message: ToolMessage, tool_data: &mut Self::ToolData, transition_data: &mut ToolActionHandlerData, options: &Self::ToolOptions, responses: &mut VecDeque) -> Self; /// Implementing this trait function lets a specific tool provide a list of hints (user input actions presently available) to draw in the footer bar. - fn update_hints(&self, responses: &mut VecDeque); + fn update_hints(&self, responses: &mut VecDeque, tool_data: &Self::ToolData); /// Implementing this trait function lets a specific tool set the current mouse cursor icon. fn update_cursor(&self, responses: &mut VecDeque); /// If this message is a standard tool message, process it and return true. Standard tool messages are those which are common across every tool. - fn standard_tool_messages(&self, message: &ToolMessage, responses: &mut VecDeque, _tool_data: &mut Self::ToolData) -> bool { + fn standard_tool_messages(&self, message: &ToolMessage, responses: &mut VecDeque, tool_data: &mut Self::ToolData) -> bool { // Check for standard hits or cursor events match message { ToolMessage::UpdateHints => { - self.update_hints(responses); + self.update_hints(responses, tool_data); true } ToolMessage::UpdateCursor => { @@ -100,7 +100,7 @@ pub trait Fsm { // Update state if *self != new_state { *self = new_state; - self.update_hints(responses); + self.update_hints(responses, tool_data); if update_cursor_on_transition { self.update_cursor(responses); }