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 <keavon@keavon.com>
This commit is contained in:
milan-sedivy
2024-03-09 16:19:56 -08:00
committed by GitHub
co-authored by Keavon Chambers
parent 218e9675fd
commit aa9a3e648a
11 changed files with 63 additions and 28 deletions
@@ -61,8 +61,8 @@ pub fn default_mapping() -> Mapping {
// TransformLayerMessage // TransformLayerMessage
entry!(KeyDown(Enter); action_dispatch=TransformLayerMessage::ApplyTransformOperation), entry!(KeyDown(Enter); action_dispatch=TransformLayerMessage::ApplyTransformOperation),
entry!(KeyDown(Lmb); 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(Rmb); action_dispatch=TransformLayerMessage::CancelTransformOperation),
entry!(KeyDown(Escape); action_dispatch=TransformLayerMessage::CancelTransformOperation),
entry!(KeyDown(KeyX); action_dispatch=TransformLayerMessage::ConstrainX), entry!(KeyDown(KeyX); action_dispatch=TransformLayerMessage::ConstrainX),
entry!(KeyDown(KeyY); action_dispatch=TransformLayerMessage::ConstrainY), entry!(KeyDown(KeyY); action_dispatch=TransformLayerMessage::ConstrainY),
entry!(KeyDown(Backspace); action_dispatch=TransformLayerMessage::TypeBackspace), 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=[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); 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(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 // NavigateToolMessage
entry!(KeyUp(Lmb); modifiers=[Shift], action_dispatch=NavigateToolMessage::ClickZoom { zoom_in: false }), 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!(DoubleClick(MouseButton::Left); action_dispatch=GradientToolMessage::InsertStop),
entry!(KeyDown(Delete); action_dispatch=GradientToolMessage::DeleteStop), entry!(KeyDown(Delete); action_dispatch=GradientToolMessage::DeleteStop),
entry!(KeyDown(Backspace); 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 // RectangleToolMessage
entry!(KeyDown(Lmb); action_dispatch=RectangleToolMessage::DragStart), entry!(KeyDown(Lmb); action_dispatch=RectangleToolMessage::DragStart),
@@ -235,6 +239,8 @@ pub fn default_mapping() -> Mapping {
entry!(PointerMove; action_dispatch=FreehandToolMessage::PointerMove), entry!(PointerMove; action_dispatch=FreehandToolMessage::PointerMove),
entry!(KeyDown(Lmb); action_dispatch=FreehandToolMessage::DragStart), entry!(KeyDown(Lmb); action_dispatch=FreehandToolMessage::DragStart),
entry!(KeyUp(Lmb); action_dispatch=FreehandToolMessage::DragStop), entry!(KeyUp(Lmb); action_dispatch=FreehandToolMessage::DragStop),
entry!(KeyDown(Rmb); action_dispatch=FreehandToolMessage::Abort),
entry!(KeyDown(Escape); action_dispatch=FreehandToolMessage::Abort),
// //
// SplineToolMessage // SplineToolMessage
entry!(PointerMove; action_dispatch=SplineToolMessage::PointerMove), entry!(PointerMove; action_dispatch=SplineToolMessage::PointerMove),
@@ -254,6 +260,8 @@ pub fn default_mapping() -> Mapping {
entry!(KeyUp(Lmb); action_dispatch=BrushToolMessage::DragStop), entry!(KeyUp(Lmb); action_dispatch=BrushToolMessage::DragStop),
entry!(KeyDown(BracketLeft); action_dispatch=BrushToolMessage::UpdateOptions(BrushToolMessageOptionsUpdate::ChangeDiameter(-BRUSH_SIZE_CHANGE_KEYBOARD))), 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(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 // ToolMessage
entry!(KeyDown(KeyV); action_dispatch=ToolMessage::ActivateToolSelect), 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!(KeyUp(Mmb); action_dispatch=NavigationMessage::TransformCanvasEnd { abort_transform: false }),
entry!(KeyDown(Lmb); modifiers=[Space], action_dispatch=NavigationMessage::TranslateCanvasBegin), entry!(KeyDown(Lmb); modifiers=[Space], action_dispatch=NavigationMessage::TranslateCanvasBegin),
entry!(KeyUp(Lmb); action_dispatch=NavigationMessage::TransformCanvasEnd { abort_transform: false }), 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(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(Equal); modifiers=[Accel], action_dispatch=NavigationMessage::IncreaseCanvasZoom { center_on_mouse: false }),
entry!(KeyDown(Minus); modifiers=[Accel], action_dispatch=NavigationMessage::DecreaseCanvasZoom { center_on_mouse: false }), entry!(KeyDown(Minus); modifiers=[Accel], action_dispatch=NavigationMessage::DecreaseCanvasZoom { center_on_mouse: false }),
@@ -230,6 +230,7 @@ impl MessageHandler<NavigationMessage, (&DocumentMetadata, Option<[DVec2; 2]>, &
match self.transform_operation { match self.transform_operation {
TransformOperation::None => {} TransformOperation::None => {}
TransformOperation::Rotate { pre_commit_tilt, .. } => { TransformOperation::Rotate { pre_commit_tilt, .. } => {
ptz.tilt = pre_commit_tilt;
responses.add(SetCanvasTilt { angle_radians: pre_commit_tilt }); responses.add(SetCanvasTilt { angle_radians: pre_commit_tilt });
} }
TransformOperation::Pan { pre_commit_pan, .. } => { TransformOperation::Pan { pre_commit_pan, .. } => {
@@ -6,4 +6,4 @@ pub mod resize;
pub mod shape_editor; pub mod shape_editor;
pub mod snapping; pub mod snapping;
pub mod transformation_cage; pub mod transformation_cage;
pub mod utility_funcitons; pub mod utility_functions;
@@ -49,14 +49,23 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for Artboar
self.fsm_state.process_event(message, &mut self.data, tool_data, &(), responses, false); self.fsm_state.process_event(message, &mut self.data, tool_data, &(), responses, false);
} }
advertise_actions!(ArtboardToolMessageDiscriminant; fn actions(&self) -> ActionList {
PointerDown, use ArtboardToolFsmState::*;
PointerUp,
PointerMove, let mut common = actions!(ArtboardToolMessageDiscriminant;
DeleteSelected, DeleteSelected,
NudgeSelected, NudgeSelected,
Abort, PointerMove,
); );
let additional = match self.fsm_state {
Ready => actions!(ArtboardToolMessageDiscriminant; PointerDown),
_ => actions!(ArtboardToolMessageDiscriminant; PointerUp, Abort),
};
common.extend(additional);
common
}
} }
impl LayoutHolder for ArtboardTool { impl LayoutHolder for ArtboardTool {
@@ -396,8 +405,13 @@ impl Fsm for ArtboardToolFsmState {
ArtboardToolFsmState::Ready ArtboardToolFsmState::Ready
} }
(_, ArtboardToolMessage::Abort) => { (_, 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); responses.add(OverlaysMessage::Draw);
ArtboardToolFsmState::Ready ArtboardToolFsmState::Ready
} }
_ => self, _ => self,
@@ -228,7 +228,6 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for BrushTo
Ready => actions!(BrushToolMessageDiscriminant; Ready => actions!(BrushToolMessageDiscriminant;
DragStart, DragStart,
DragStop, DragStop,
Abort,
UpdateOptions, UpdateOptions,
), ),
Drawing => actions!(BrushToolMessageDiscriminant; Drawing => actions!(BrushToolMessageDiscriminant;
@@ -370,18 +369,20 @@ impl Fsm for BrushToolFsmState {
BrushToolFsmState::Drawing BrushToolFsmState::Drawing
} }
(BrushToolFsmState::Drawing, BrushToolMessage::DragStop) | (BrushToolFsmState::Drawing, BrushToolMessage::Abort) => { (BrushToolFsmState::Drawing, BrushToolMessage::DragStop) => {
if !tool_data.strokes.is_empty() { if !tool_data.strokes.is_empty() {
responses.add(DocumentMessage::CommitTransaction); responses.add(DocumentMessage::CommitTransaction);
} else {
responses.add(DocumentMessage::AbortTransaction);
} }
tool_data.strokes.clear(); tool_data.strokes.clear();
BrushToolFsmState::Ready BrushToolFsmState::Ready
} }
(BrushToolFsmState::Drawing, BrushToolMessage::Abort) => {
responses.add(DocumentMessage::AbortTransaction);
tool_data.strokes.clear();
BrushToolFsmState::Ready
}
(_, BrushToolMessage::WorkingColorChanged) => { (_, BrushToolMessage::WorkingColorChanged) => {
responses.add(BrushToolMessage::UpdateOptions(BrushToolMessageOptionsUpdate::WorkingColors( responses.add(BrushToolMessage::UpdateOptions(BrushToolMessageOptionsUpdate::WorkingColors(
Some(global_tool_data.primary_color), Some(global_tool_data.primary_color),
@@ -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::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; 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::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 graph_craft::document::NodeId;
use graphene_core::uuid::generate_uuid; use graphene_core::uuid::generate_uuid;
@@ -155,7 +155,6 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for Freehan
Ready => actions!(FreehandToolMessageDiscriminant; Ready => actions!(FreehandToolMessageDiscriminant;
DragStart, DragStart,
DragStop, DragStop,
Abort,
), ),
Drawing => actions!(FreehandToolMessageDiscriminant; Drawing => actions!(FreehandToolMessageDiscriminant;
DragStop, DragStop,
@@ -277,17 +276,21 @@ impl Fsm for FreehandToolFsmState {
FreehandToolFsmState::Drawing FreehandToolFsmState::Drawing
} }
(FreehandToolFsmState::Drawing, FreehandToolMessage::DragStop | FreehandToolMessage::Abort) => { (FreehandToolFsmState::Drawing, FreehandToolMessage::DragStop) => {
if tool_data.dragged { if tool_data.dragged {
responses.add(DocumentMessage::CommitTransaction); responses.add(DocumentMessage::CommitTransaction);
} else {
responses.add(DocumentMessage::AbortTransaction);
} }
tool_data.layer = None; tool_data.layer = None;
FreehandToolFsmState::Ready FreehandToolFsmState::Ready
} }
(FreehandToolFsmState::Drawing, FreehandToolMessage::Abort) => {
responses.add(DocumentMessage::AbortTransaction);
tool_data.layer = None;
FreehandToolFsmState::Ready
}
(_, FreehandToolMessage::WorkingColorChanged) => { (_, FreehandToolMessage::WorkingColorChanged) => {
responses.add(FreehandToolMessage::UpdateOptions(FreehandOptionsUpdate::WorkingColors( responses.add(FreehandToolMessage::UpdateOptions(FreehandOptionsUpdate::WorkingColors(
Some(global_tool_data.primary_color), Some(global_tool_data.primary_color),
@@ -441,12 +441,14 @@ impl Fsm for GradientToolFsmState {
GradientToolFsmState::Ready GradientToolFsmState::Ready
} }
(_, GradientToolMessage::Abort) => { (GradientToolFsmState::Drawing, GradientToolMessage::Abort) => {
responses.add(DocumentMessage::AbortTransaction);
tool_data.snap_manager.cleanup(responses); tool_data.snap_manager.cleanup(responses);
responses.add(OverlaysMessage::Draw); responses.add(OverlaysMessage::Draw);
GradientToolFsmState::Ready GradientToolFsmState::Ready
} }
(_, GradientToolMessage::Abort) => GradientToolFsmState::Ready,
_ => self, _ => self,
} }
} }
@@ -168,6 +168,8 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
DeleteAndBreakPath, DeleteAndBreakPath,
), ),
Dragging => actions!(PathToolMessageDiscriminant; Dragging => actions!(PathToolMessageDiscriminant;
Escape,
RightClick,
FlipSharp, FlipSharp,
DragStop, DragStop,
PointerMove, PointerMove,
@@ -459,7 +461,6 @@ impl Fsm for PathToolFsmState {
} }
tool_data.end_insertion(shape_editor, responses, InsertEndKind::Abort) tool_data.end_insertion(shape_editor, responses, InsertEndKind::Abort)
} }
// Mouse down // Mouse down
(_, PathToolMessage::MouseDown { ctrl, shift }) => { (_, PathToolMessage::MouseDown { ctrl, shift }) => {
let add_to_selection = input.keyboard.get(shift as usize); let add_to_selection = input.keyboard.get(shift as usize);
@@ -492,7 +493,12 @@ impl Fsm for PathToolFsmState {
PathToolFsmState::Ready 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 // Mouse up
(PathToolFsmState::DrawingBox, PathToolMessage::DragStop { shift_mirror_distance }) => { (PathToolFsmState::DrawingBox, PathToolMessage::DragStop { shift_mirror_distance }) => {
let shift_pressed = input.keyboard.get(shift_mirror_distance as usize); let shift_pressed = input.keyboard.get(shift_mirror_distance as usize);
@@ -507,7 +513,6 @@ impl Fsm for PathToolFsmState {
PathToolFsmState::Ready PathToolFsmState::Ready
} }
(_, PathToolMessage::DragStop { shift_mirror_distance }) => { (_, PathToolMessage::DragStop { shift_mirror_distance }) => {
let shift_pressed = input.keyboard.get(shift_mirror_distance as usize); let shift_pressed = input.keyboard.get(shift_mirror_distance as usize);
@@ -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;
use crate::messages::tool::common_functionality::graph_modification_utils::get_subpaths; 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::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 graph_craft::document::NodeId;
use graphene_core::uuid::{generate_uuid, ManipulatorGroupId}; use graphene_core::uuid::{generate_uuid, ManipulatorGroupId};
@@ -950,7 +950,7 @@ impl Fsm for SelectToolFsmState {
} }
(SelectToolFsmState::Dragging, SelectToolMessage::Abort) => { (SelectToolFsmState::Dragging, SelectToolMessage::Abort) => {
tool_data.snap_manager.cleanup(responses); tool_data.snap_manager.cleanup(responses);
responses.add(DocumentMessage::Undo); responses.add(DocumentMessage::AbortTransaction);
responses.add(OverlaysMessage::Draw); responses.add(OverlaysMessage::Draw);
SelectToolFsmState::Ready SelectToolFsmState::Ready