From aa9a3e648a9910830807d07771df52242bae7dd2 Mon Sep 17 00:00:00 2001 From: milan-sedivy <59771021+milan-sedivy@users.noreply.github.com> Date: Sun, 10 Mar 2024 02:19:56 +0200 Subject: [PATCH] Fix cancellation of drag actions in all tools where it's missing (#1664) * Change message sent from DocumentMessage::Undo to DocumentMessage::AbortTransaction while aborting select tool * Fix NavigationTool not aborting * Fix NavigationTool tilt * Make gradient tool abortable * Make PathTool drag actions abortable * Make FreeHand Tool abortable * Make BrushTool abortable * Fix filename typo * Make artboards also abortable * Rearrange key bindings for consistency --------- Co-authored-by: Keavon Chambers --- .../messages/input_mapper/default_mapping.rs | 13 ++++++-- .../navigation/navigation_message_handler.rs | 1 + .../messages/tool/common_functionality/mod.rs | 2 +- ...lity_funcitons.rs => utility_functions.rs} | 0 .../tool/tool_messages/artboard_tool.rs | 32 +++++++++++++------ .../messages/tool/tool_messages/brush_tool.rs | 11 ++++--- .../tool/tool_messages/freehand_tool.rs | 13 +++++--- .../tool/tool_messages/gradient_tool.rs | 4 ++- .../messages/tool/tool_messages/path_tool.rs | 11 +++++-- .../messages/tool/tool_messages/pen_tool.rs | 2 +- .../tool/tool_messages/select_tool.rs | 2 +- 11 files changed, 63 insertions(+), 28 deletions(-) rename editor/src/messages/tool/common_functionality/{utility_funcitons.rs => utility_functions.rs} (100%) diff --git a/editor/src/messages/input_mapper/default_mapping.rs b/editor/src/messages/input_mapper/default_mapping.rs index 588a9f83..a349f8ce 100644 --- a/editor/src/messages/input_mapper/default_mapping.rs +++ b/editor/src/messages/input_mapper/default_mapping.rs @@ -61,8 +61,8 @@ pub fn default_mapping() -> Mapping { // TransformLayerMessage entry!(KeyDown(Enter); action_dispatch=TransformLayerMessage::ApplyTransformOperation), entry!(KeyDown(Lmb); action_dispatch=TransformLayerMessage::ApplyTransformOperation), - entry!(KeyDown(Escape); action_dispatch=TransformLayerMessage::CancelTransformOperation), entry!(KeyDown(Rmb); action_dispatch=TransformLayerMessage::CancelTransformOperation), + entry!(KeyDown(Escape); action_dispatch=TransformLayerMessage::CancelTransformOperation), entry!(KeyDown(KeyX); action_dispatch=TransformLayerMessage::ConstrainX), entry!(KeyDown(KeyY); action_dispatch=TransformLayerMessage::ConstrainY), entry!(KeyDown(Backspace); action_dispatch=TransformLayerMessage::TypeBackspace), @@ -110,6 +110,8 @@ pub fn default_mapping() -> Mapping { entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), entry!(KeyDown(ArrowRight); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: 0. }), + entry!(KeyDown(Rmb); action_dispatch=ArtboardToolMessage::Abort), + entry!(KeyDown(Escape); action_dispatch=ArtboardToolMessage::Abort), // // NavigateToolMessage entry!(KeyUp(Lmb); modifiers=[Shift], action_dispatch=NavigateToolMessage::ClickZoom { zoom_in: false }), @@ -142,6 +144,8 @@ pub fn default_mapping() -> Mapping { entry!(DoubleClick(MouseButton::Left); action_dispatch=GradientToolMessage::InsertStop), entry!(KeyDown(Delete); action_dispatch=GradientToolMessage::DeleteStop), entry!(KeyDown(Backspace); action_dispatch=GradientToolMessage::DeleteStop), + entry!(KeyDown(Rmb); action_dispatch=GradientToolMessage::Abort), + entry!(KeyDown(Escape); action_dispatch=GradientToolMessage::Abort), // // RectangleToolMessage entry!(KeyDown(Lmb); action_dispatch=RectangleToolMessage::DragStart), @@ -235,6 +239,8 @@ pub fn default_mapping() -> Mapping { entry!(PointerMove; action_dispatch=FreehandToolMessage::PointerMove), entry!(KeyDown(Lmb); action_dispatch=FreehandToolMessage::DragStart), entry!(KeyUp(Lmb); action_dispatch=FreehandToolMessage::DragStop), + entry!(KeyDown(Rmb); action_dispatch=FreehandToolMessage::Abort), + entry!(KeyDown(Escape); action_dispatch=FreehandToolMessage::Abort), // // SplineToolMessage entry!(PointerMove; action_dispatch=SplineToolMessage::PointerMove), @@ -254,6 +260,8 @@ pub fn default_mapping() -> Mapping { entry!(KeyUp(Lmb); action_dispatch=BrushToolMessage::DragStop), entry!(KeyDown(BracketLeft); action_dispatch=BrushToolMessage::UpdateOptions(BrushToolMessageOptionsUpdate::ChangeDiameter(-BRUSH_SIZE_CHANGE_KEYBOARD))), entry!(KeyDown(BracketRight); action_dispatch=BrushToolMessage::UpdateOptions(BrushToolMessageOptionsUpdate::ChangeDiameter(BRUSH_SIZE_CHANGE_KEYBOARD))), + entry!(KeyDown(Rmb); action_dispatch=BrushToolMessage::Abort), + entry!(KeyDown(Escape); action_dispatch=BrushToolMessage::Abort), // // ToolMessage entry!(KeyDown(KeyV); action_dispatch=ToolMessage::ActivateToolSelect), @@ -346,7 +354,8 @@ pub fn default_mapping() -> Mapping { entry!(KeyUp(Mmb); action_dispatch=NavigationMessage::TransformCanvasEnd { abort_transform: false }), entry!(KeyDown(Lmb); modifiers=[Space], action_dispatch=NavigationMessage::TranslateCanvasBegin), entry!(KeyUp(Lmb); action_dispatch=NavigationMessage::TransformCanvasEnd { abort_transform: false }), - entry!(KeyUp(Rmb); action_dispatch=NavigationMessage::TransformCanvasEnd { abort_transform: true }), + entry!(KeyDown(Rmb); action_dispatch=NavigationMessage::TransformCanvasEnd { abort_transform: true }), + entry!(KeyDown(Escape); action_dispatch=NavigationMessage::TransformCanvasEnd { abort_transform: true }), entry!(KeyDown(NumpadAdd); modifiers=[Accel], action_dispatch=NavigationMessage::IncreaseCanvasZoom { center_on_mouse: false }), entry!(KeyDown(Equal); modifiers=[Accel], action_dispatch=NavigationMessage::IncreaseCanvasZoom { center_on_mouse: false }), entry!(KeyDown(Minus); modifiers=[Accel], action_dispatch=NavigationMessage::DecreaseCanvasZoom { center_on_mouse: false }), diff --git a/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs b/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs index 7a717a25..48de9a8a 100644 --- a/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs +++ b/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs @@ -230,6 +230,7 @@ impl MessageHandler, & match self.transform_operation { TransformOperation::None => {} TransformOperation::Rotate { pre_commit_tilt, .. } => { + ptz.tilt = pre_commit_tilt; responses.add(SetCanvasTilt { angle_radians: pre_commit_tilt }); } TransformOperation::Pan { pre_commit_pan, .. } => { diff --git a/editor/src/messages/tool/common_functionality/mod.rs b/editor/src/messages/tool/common_functionality/mod.rs index c7a29d58..7a67adcf 100644 --- a/editor/src/messages/tool/common_functionality/mod.rs +++ b/editor/src/messages/tool/common_functionality/mod.rs @@ -6,4 +6,4 @@ pub mod resize; pub mod shape_editor; pub mod snapping; pub mod transformation_cage; -pub mod utility_funcitons; +pub mod utility_functions; diff --git a/editor/src/messages/tool/common_functionality/utility_funcitons.rs b/editor/src/messages/tool/common_functionality/utility_functions.rs similarity index 100% rename from editor/src/messages/tool/common_functionality/utility_funcitons.rs rename to editor/src/messages/tool/common_functionality/utility_functions.rs diff --git a/editor/src/messages/tool/tool_messages/artboard_tool.rs b/editor/src/messages/tool/tool_messages/artboard_tool.rs index fe9c9822..83de09e1 100644 --- a/editor/src/messages/tool/tool_messages/artboard_tool.rs +++ b/editor/src/messages/tool/tool_messages/artboard_tool.rs @@ -49,14 +49,23 @@ impl<'a> MessageHandler> for Artboar self.fsm_state.process_event(message, &mut self.data, tool_data, &(), responses, false); } - advertise_actions!(ArtboardToolMessageDiscriminant; - PointerDown, - PointerUp, - PointerMove, - DeleteSelected, - NudgeSelected, - Abort, - ); + fn actions(&self) -> ActionList { + use ArtboardToolFsmState::*; + + let mut common = actions!(ArtboardToolMessageDiscriminant; + DeleteSelected, + NudgeSelected, + PointerMove, + ); + + let additional = match self.fsm_state { + Ready => actions!(ArtboardToolMessageDiscriminant; PointerDown), + _ => actions!(ArtboardToolMessageDiscriminant; PointerUp, Abort), + }; + common.extend(additional); + + common + } } impl LayoutHolder for ArtboardTool { @@ -396,8 +405,13 @@ impl Fsm for ArtboardToolFsmState { ArtboardToolFsmState::Ready } (_, ArtboardToolMessage::Abort) => { - tool_data.snap_manager.cleanup(responses); + responses.add(DocumentMessage::AbortTransaction); + + // ArtboardTool currently doesn't implement snapping + // tool_data.snap_manager.cleanup(responses); + responses.add(OverlaysMessage::Draw); + ArtboardToolFsmState::Ready } _ => self, diff --git a/editor/src/messages/tool/tool_messages/brush_tool.rs b/editor/src/messages/tool/tool_messages/brush_tool.rs index 47995caf..f9f0a649 100644 --- a/editor/src/messages/tool/tool_messages/brush_tool.rs +++ b/editor/src/messages/tool/tool_messages/brush_tool.rs @@ -228,7 +228,6 @@ impl<'a> MessageHandler> for BrushTo Ready => actions!(BrushToolMessageDiscriminant; DragStart, DragStop, - Abort, UpdateOptions, ), Drawing => actions!(BrushToolMessageDiscriminant; @@ -370,18 +369,20 @@ impl Fsm for BrushToolFsmState { BrushToolFsmState::Drawing } - (BrushToolFsmState::Drawing, BrushToolMessage::DragStop) | (BrushToolFsmState::Drawing, BrushToolMessage::Abort) => { + (BrushToolFsmState::Drawing, BrushToolMessage::DragStop) => { if !tool_data.strokes.is_empty() { responses.add(DocumentMessage::CommitTransaction); - } else { - responses.add(DocumentMessage::AbortTransaction); } - tool_data.strokes.clear(); BrushToolFsmState::Ready } + (BrushToolFsmState::Drawing, BrushToolMessage::Abort) => { + responses.add(DocumentMessage::AbortTransaction); + tool_data.strokes.clear(); + BrushToolFsmState::Ready + } (_, BrushToolMessage::WorkingColorChanged) => { responses.add(BrushToolMessage::UpdateOptions(BrushToolMessageOptionsUpdate::WorkingColors( Some(global_tool_data.primary_color), diff --git a/editor/src/messages/tool/tool_messages/freehand_tool.rs b/editor/src/messages/tool/tool_messages/freehand_tool.rs index 56ffb746..2d81dff6 100644 --- a/editor/src/messages/tool/tool_messages/freehand_tool.rs +++ b/editor/src/messages/tool/tool_messages/freehand_tool.rs @@ -5,7 +5,7 @@ use crate::messages::portfolio::document::overlays::utility_types::OverlayContex use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; use crate::messages::tool::common_functionality::graph_modification_utils; -use crate::messages::tool::common_functionality::utility_funcitons::should_extend; +use crate::messages::tool::common_functionality::utility_functions::should_extend; use graph_craft::document::NodeId; use graphene_core::uuid::generate_uuid; @@ -155,7 +155,6 @@ impl<'a> MessageHandler> for Freehan Ready => actions!(FreehandToolMessageDiscriminant; DragStart, DragStop, - Abort, ), Drawing => actions!(FreehandToolMessageDiscriminant; DragStop, @@ -277,17 +276,21 @@ impl Fsm for FreehandToolFsmState { FreehandToolFsmState::Drawing } - (FreehandToolFsmState::Drawing, FreehandToolMessage::DragStop | FreehandToolMessage::Abort) => { + (FreehandToolFsmState::Drawing, FreehandToolMessage::DragStop) => { if tool_data.dragged { responses.add(DocumentMessage::CommitTransaction); - } else { - responses.add(DocumentMessage::AbortTransaction); } tool_data.layer = None; FreehandToolFsmState::Ready } + (FreehandToolFsmState::Drawing, FreehandToolMessage::Abort) => { + responses.add(DocumentMessage::AbortTransaction); + tool_data.layer = None; + + FreehandToolFsmState::Ready + } (_, FreehandToolMessage::WorkingColorChanged) => { responses.add(FreehandToolMessage::UpdateOptions(FreehandOptionsUpdate::WorkingColors( Some(global_tool_data.primary_color), diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index da99618a..92b95b9e 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -441,12 +441,14 @@ impl Fsm for GradientToolFsmState { GradientToolFsmState::Ready } - (_, GradientToolMessage::Abort) => { + (GradientToolFsmState::Drawing, GradientToolMessage::Abort) => { + responses.add(DocumentMessage::AbortTransaction); tool_data.snap_manager.cleanup(responses); responses.add(OverlaysMessage::Draw); GradientToolFsmState::Ready } + (_, GradientToolMessage::Abort) => GradientToolFsmState::Ready, _ => self, } } diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 28085edf..f6a65f7f 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -168,6 +168,8 @@ impl<'a> MessageHandler> for PathToo DeleteAndBreakPath, ), Dragging => actions!(PathToolMessageDiscriminant; + Escape, + RightClick, FlipSharp, DragStop, PointerMove, @@ -459,7 +461,6 @@ impl Fsm for PathToolFsmState { } tool_data.end_insertion(shape_editor, responses, InsertEndKind::Abort) } - // Mouse down (_, PathToolMessage::MouseDown { ctrl, shift }) => { let add_to_selection = input.keyboard.get(shift as usize); @@ -492,7 +493,12 @@ impl Fsm for PathToolFsmState { PathToolFsmState::Ready } - + (PathToolFsmState::Dragging, PathToolMessage::Escape | PathToolMessage::RightClick) => { + responses.add(DocumentMessage::AbortTransaction); + shape_editor.deselect_all(); + tool_data.snap_manager.cleanup(responses); + PathToolFsmState::Ready + } // Mouse up (PathToolFsmState::DrawingBox, PathToolMessage::DragStop { shift_mirror_distance }) => { let shift_pressed = input.keyboard.get(shift_mirror_distance as usize); @@ -507,7 +513,6 @@ impl Fsm for PathToolFsmState { PathToolFsmState::Ready } - (_, PathToolMessage::DragStop { shift_mirror_distance }) => { let shift_pressed = input.keyboard.get(shift_mirror_distance as usize); diff --git a/editor/src/messages/tool/tool_messages/pen_tool.rs b/editor/src/messages/tool/tool_messages/pen_tool.rs index 5072cdc8..bdc28a0f 100644 --- a/editor/src/messages/tool/tool_messages/pen_tool.rs +++ b/editor/src/messages/tool/tool_messages/pen_tool.rs @@ -8,7 +8,7 @@ use crate::messages::tool::common_functionality::color_selector::{ToolColorOptio use crate::messages::tool::common_functionality::graph_modification_utils; use crate::messages::tool::common_functionality::graph_modification_utils::get_subpaths; use crate::messages::tool::common_functionality::snapping::{SnapCandidatePoint, SnapConstraint, SnapData, SnapManager}; -use crate::messages::tool::common_functionality::utility_funcitons::should_extend; +use crate::messages::tool::common_functionality::utility_functions::should_extend; use graph_craft::document::NodeId; use graphene_core::uuid::{generate_uuid, ManipulatorGroupId}; diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 389b2ac9..4ccef921 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -950,7 +950,7 @@ impl Fsm for SelectToolFsmState { } (SelectToolFsmState::Dragging, SelectToolMessage::Abort) => { tool_data.snap_manager.cleanup(responses); - responses.add(DocumentMessage::Undo); + responses.add(DocumentMessage::AbortTransaction); responses.add(OverlaysMessage::Draw); SelectToolFsmState::Ready