From cf6bbcfd300295bd23f06ec7fb381f9f229a7028 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Thu, 11 Aug 2022 02:53:46 -0700 Subject: [PATCH] Revamp key/code input processing which fixes Option key on Mac and other locales Closes #742 Closes #746 --- .../messages/input_mapper/default_mapping.rs | 296 ++++++----- .../input_mapper_message_handler.rs | 2 +- .../utility_types/input_keyboard.rs | 244 +++++++-- .../input_preprocessor_message_handler.rs | 36 +- .../document/document_message_handler.rs | 3 + .../movement/movement_message_handler.rs | 4 +- .../menu_bar/menu_bar_message_handler.rs | 1 + .../tool/tool_messages/artboard_tool.rs | 8 +- .../tool/tool_messages/ellipse_tool.rs | 8 +- .../tool/tool_messages/gradient_tool.rs | 4 +- .../messages/tool/tool_messages/line_tool.rs | 12 +- .../tool/tool_messages/navigate_tool.rs | 10 +- .../messages/tool/tool_messages/path_tool.rs | 16 +- .../messages/tool/tool_messages/pen_tool.rs | 6 +- .../tool/tool_messages/rectangle_tool.rs | 8 +- .../tool/tool_messages/select_tool.rs | 30 +- .../messages/tool/tool_messages/shape_tool.rs | 8 +- .../tool/tool_messages/spline_tool.rs | 2 +- .../messages/tool/tool_messages/text_tool.rs | 6 +- .../components/floating-menus/MenuList.vue | 2 +- frontend/src/components/panels/LayerTree.vue | 6 +- .../components/widgets/inputs/FieldInput.vue | 4 +- .../widgets/inputs/MenuBarInput.vue | 24 +- .../widgets/labels/UserInputLabel.vue | 151 +++--- .../window/status-bar/StatusBar.vue | 6 +- .../src/components/window/workspace/Panel.vue | 19 +- frontend/src/io-managers/input.ts | 50 +- .../src/utility-functions/keyboard-entry.ts | 475 ++++++++++++++++-- frontend/src/utility-functions/platform.ts | 2 +- .../src/utility-functions/strip-indents.ts | 2 +- frontend/src/wasm-communication/messages.ts | 35 +- frontend/wasm/src/helpers.rs | 211 +++++--- 32 files changed, 1143 insertions(+), 548 deletions(-) diff --git a/editor/src/messages/input_mapper/default_mapping.rs b/editor/src/messages/input_mapper/default_mapping.rs index bf30ab03..1d6cbf00 100644 --- a/editor/src/messages/input_mapper/default_mapping.rs +++ b/editor/src/messages/input_mapper/default_mapping.rs @@ -23,44 +23,44 @@ pub fn default_mapping() -> Mapping { // MovementMessage entry!( PointerMove; - refresh_keys=[KeyControl], - action_dispatch=MovementMessage::PointerMove { snap_angle: KeyControl, wait_for_snap_angle_release: true, snap_zoom: KeyControl, zoom_from_viewport: None }, + refresh_keys=[Control], + action_dispatch=MovementMessage::PointerMove { snap_angle: Control, wait_for_snap_angle_release: true, snap_zoom: Control, zoom_from_viewport: None }, ), // NORMAL PRIORITY: // // TransformLayerMessage - entry!(KeyDown(KeyEnter); action_dispatch=TransformLayerMessage::ApplyTransformOperation), + entry!(KeyDown(Enter); action_dispatch=TransformLayerMessage::ApplyTransformOperation), entry!(KeyDown(Lmb); action_dispatch=TransformLayerMessage::ApplyTransformOperation), - entry!(KeyDown(KeyEscape); action_dispatch=TransformLayerMessage::CancelTransformOperation), + entry!(KeyDown(Escape); action_dispatch=TransformLayerMessage::CancelTransformOperation), entry!(KeyDown(Rmb); action_dispatch=TransformLayerMessage::CancelTransformOperation), entry!(KeyDown(KeyX); action_dispatch=TransformLayerMessage::ConstrainX), entry!(KeyDown(KeyY); action_dispatch=TransformLayerMessage::ConstrainY), - entry!(KeyDown(KeyBackspace); action_dispatch=TransformLayerMessage::TypeBackspace), - entry!(KeyDown(KeyMinus); action_dispatch=TransformLayerMessage::TypeNegate), - entry!(KeyDown(KeyComma); action_dispatch=TransformLayerMessage::TypeDecimalPoint), - entry!(KeyDown(KeyPeriod); action_dispatch=TransformLayerMessage::TypeDecimalPoint), - entry!(PointerMove; refresh_keys=[KeyShift, KeyControl], action_dispatch=TransformLayerMessage::PointerMove { slow_key: KeyShift, snap_key: KeyControl }), + entry!(KeyDown(Backspace); action_dispatch=TransformLayerMessage::TypeBackspace), + entry!(KeyDown(Minus); action_dispatch=TransformLayerMessage::TypeNegate), + entry!(KeyDown(Comma); action_dispatch=TransformLayerMessage::TypeDecimalPoint), + entry!(KeyDown(Period); action_dispatch=TransformLayerMessage::TypeDecimalPoint), + entry!(PointerMove; refresh_keys=[Shift, Control], action_dispatch=TransformLayerMessage::PointerMove { slow_key: Shift, snap_key: Control }), // // SelectToolMessage - entry!(PointerMove; refresh_keys=[KeyControl, KeyShift, KeyAlt], action_dispatch=SelectToolMessage::PointerMove { axis_align: KeyShift, snap_angle: KeyControl, center: KeyAlt }), - entry!(KeyDown(Lmb); action_dispatch=SelectToolMessage::DragStart { add_to_selection: KeyShift }), + entry!(PointerMove; refresh_keys=[Control, Shift, Alt], action_dispatch=SelectToolMessage::PointerMove { axis_align: Shift, snap_angle: Control, center: Alt }), + entry!(KeyDown(Lmb); action_dispatch=SelectToolMessage::DragStart { add_to_selection: Shift }), entry!(KeyUp(Lmb); action_dispatch=SelectToolMessage::DragStop), - entry!(KeyDown(KeyEnter); action_dispatch=SelectToolMessage::DragStop), + entry!(KeyDown(Enter); action_dispatch=SelectToolMessage::DragStop), entry!(DoubleClick; action_dispatch=SelectToolMessage::EditLayer), entry!(KeyDown(Rmb); action_dispatch=SelectToolMessage::Abort), - entry!(KeyDown(KeyEscape); action_dispatch=SelectToolMessage::Abort), + entry!(KeyDown(Escape); action_dispatch=SelectToolMessage::Abort), // // ArtboardToolMessage entry!(KeyDown(Lmb); action_dispatch=ArtboardToolMessage::PointerDown), - entry!(PointerMove; refresh_keys=[KeyShift, KeyAlt], action_dispatch=ArtboardToolMessage::PointerMove { constrain_axis_or_aspect: KeyShift, center: KeyAlt }), + entry!(PointerMove; refresh_keys=[Shift, Alt], action_dispatch=ArtboardToolMessage::PointerMove { constrain_axis_or_aspect: Shift, center: Alt }), entry!(KeyUp(Lmb); action_dispatch=ArtboardToolMessage::PointerUp), - entry!(KeyDown(KeyDelete); action_dispatch=ArtboardToolMessage::DeleteSelected), - entry!(KeyDown(KeyBackspace); action_dispatch=ArtboardToolMessage::DeleteSelected), + entry!(KeyDown(Delete); action_dispatch=ArtboardToolMessage::DeleteSelected), + entry!(KeyDown(Backspace); action_dispatch=ArtboardToolMessage::DeleteSelected), // // NavigateToolMessage - entry!(KeyUp(Lmb); modifiers=[KeyShift], action_dispatch=NavigateToolMessage::ClickZoom { zoom_in: false }), + entry!(KeyUp(Lmb); modifiers=[Shift], action_dispatch=NavigateToolMessage::ClickZoom { zoom_in: false }), entry!(KeyUp(Lmb); action_dispatch=NavigateToolMessage::ClickZoom { zoom_in: true }), - entry!(PointerMove; refresh_keys=[KeyControl], action_dispatch=NavigateToolMessage::PointerMove { snap_angle: KeyControl, snap_zoom: KeyControl }), + entry!(PointerMove; refresh_keys=[Control], action_dispatch=NavigateToolMessage::PointerMove { snap_angle: Control, snap_zoom: Control }), entry!(KeyDown(Mmb); action_dispatch=NavigateToolMessage::TranslateCanvasBegin), entry!(KeyDown(Rmb); action_dispatch=NavigateToolMessage::RotateCanvasBegin), entry!(KeyDown(Lmb); action_dispatch=NavigateToolMessage::ZoomCanvasBegin), @@ -74,59 +74,59 @@ pub fn default_mapping() -> Mapping { // // TextToolMessage entry!(KeyUp(Lmb); action_dispatch=TextToolMessage::Interact), - entry!(KeyDown(KeyEscape); action_dispatch=TextToolMessage::Abort), + entry!(KeyDown(Escape); action_dispatch=TextToolMessage::Abort), entry_multiplatform!( - standard!(KeyDown(KeyEnter); modifiers=[KeyControl], action_dispatch=TextToolMessage::CommitText), - mac_only!(KeyDown(KeyEnter); modifiers=[KeyCommand], action_dispatch=TextToolMessage::CommitText), + standard!(KeyDown(Enter); modifiers=[Control], action_dispatch=TextToolMessage::CommitText), + mac_only!(KeyDown(Enter); modifiers=[Command], action_dispatch=TextToolMessage::CommitText), ), // // GradientToolMessage entry!(KeyDown(Lmb); action_dispatch=GradientToolMessage::PointerDown), - entry!(PointerMove; refresh_keys=[KeyShift], action_dispatch=GradientToolMessage::PointerMove { constrain_axis: KeyShift }), + entry!(PointerMove; refresh_keys=[Shift], action_dispatch=GradientToolMessage::PointerMove { constrain_axis: Shift }), entry!(KeyUp(Lmb); action_dispatch=GradientToolMessage::PointerUp), // // RectangleToolMessage entry!(KeyDown(Lmb); action_dispatch=RectangleToolMessage::DragStart), entry!(KeyUp(Lmb); action_dispatch=RectangleToolMessage::DragStop), entry!(KeyDown(Rmb); action_dispatch=RectangleToolMessage::Abort), - entry!(KeyDown(KeyEscape); action_dispatch=RectangleToolMessage::Abort), - entry!(PointerMove; refresh_keys=[KeyAlt, KeyShift], action_dispatch=RectangleToolMessage::Resize { center: KeyAlt, lock_ratio: KeyShift }), + entry!(KeyDown(Escape); action_dispatch=RectangleToolMessage::Abort), + entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=RectangleToolMessage::Resize { center: Alt, lock_ratio: Shift }), // // EllipseToolMessage entry!(KeyDown(Lmb); action_dispatch=EllipseToolMessage::DragStart), entry!(KeyUp(Lmb); action_dispatch=EllipseToolMessage::DragStop), entry!(KeyDown(Rmb); action_dispatch=EllipseToolMessage::Abort), - entry!(KeyDown(KeyEscape); action_dispatch=EllipseToolMessage::Abort), - entry!(PointerMove; refresh_keys=[KeyAlt, KeyShift], action_dispatch=EllipseToolMessage::Resize { center: KeyAlt, lock_ratio: KeyShift }), + entry!(KeyDown(Escape); action_dispatch=EllipseToolMessage::Abort), + entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=EllipseToolMessage::Resize { center: Alt, lock_ratio: Shift }), // // ShapeToolMessage entry!(KeyDown(Lmb); action_dispatch=ShapeToolMessage::DragStart), entry!(KeyUp(Lmb); action_dispatch=ShapeToolMessage::DragStop), entry!(KeyDown(Rmb); action_dispatch=ShapeToolMessage::Abort), - entry!(KeyDown(KeyEscape); action_dispatch=ShapeToolMessage::Abort), - entry!(PointerMove; refresh_keys=[KeyAlt, KeyShift], action_dispatch=ShapeToolMessage::Resize { center: KeyAlt, lock_ratio: KeyShift }), + entry!(KeyDown(Escape); action_dispatch=ShapeToolMessage::Abort), + entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=ShapeToolMessage::Resize { center: Alt, lock_ratio: Shift }), // // LineToolMessage entry!(KeyDown(Lmb); action_dispatch=LineToolMessage::DragStart), entry!(KeyUp(Lmb); action_dispatch=LineToolMessage::DragStop), entry!(KeyDown(Rmb); action_dispatch=LineToolMessage::Abort), - entry!(KeyDown(KeyEscape); action_dispatch=LineToolMessage::Abort), - entry!(PointerMove; refresh_keys=[KeyAlt, KeyShift, KeyControl], action_dispatch=LineToolMessage::Redraw { center: KeyAlt, lock_angle: KeyControl, snap_angle: KeyShift }), + entry!(KeyDown(Escape); action_dispatch=LineToolMessage::Abort), + entry!(PointerMove; refresh_keys=[Alt, Shift, Control], action_dispatch=LineToolMessage::Redraw { center: Alt, lock_angle: Control, snap_angle: Shift }), // // PathToolMessage - entry!(KeyDown(Lmb); action_dispatch=PathToolMessage::DragStart { add_to_selection: KeyShift }), - entry!(PointerMove; refresh_keys=[KeyAlt, KeyShift], action_dispatch=PathToolMessage::PointerMove { alt_mirror_angle: KeyAlt, shift_mirror_distance: KeyShift }), - entry!(KeyDown(KeyDelete); action_dispatch=PathToolMessage::Delete), - entry!(KeyDown(KeyBackspace); action_dispatch=PathToolMessage::Delete), + entry!(KeyDown(Lmb); action_dispatch=PathToolMessage::DragStart { add_to_selection: Shift }), + entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=PathToolMessage::PointerMove { alt_mirror_angle: Alt, shift_mirror_distance: Shift }), + entry!(KeyDown(Delete); action_dispatch=PathToolMessage::Delete), + entry!(KeyDown(Backspace); action_dispatch=PathToolMessage::Delete), entry!(KeyUp(Lmb); action_dispatch=PathToolMessage::DragStop), // // PenToolMessage - entry!(PointerMove; refresh_keys=[KeyShift, KeyControl], action_dispatch=PenToolMessage::PointerMove { snap_angle: KeyControl, break_handle: KeyShift }), + entry!(PointerMove; refresh_keys=[Shift, Control], action_dispatch=PenToolMessage::PointerMove { snap_angle: Control, break_handle: Shift }), entry!(KeyDown(Lmb); action_dispatch=PenToolMessage::DragStart), entry!(KeyUp(Lmb); action_dispatch=PenToolMessage::DragStop), entry!(KeyDown(Rmb); action_dispatch=PenToolMessage::Confirm), - entry!(KeyDown(KeyEscape); action_dispatch=PenToolMessage::Confirm), - entry!(KeyDown(KeyEnter); action_dispatch=PenToolMessage::Confirm), + entry!(KeyDown(Escape); action_dispatch=PenToolMessage::Confirm), + entry!(KeyDown(Enter); action_dispatch=PenToolMessage::Confirm), // // FreehandToolMessage entry!(PointerMove; action_dispatch=FreehandToolMessage::PointerMove), @@ -138,8 +138,8 @@ pub fn default_mapping() -> Mapping { entry!(KeyDown(Lmb); action_dispatch=SplineToolMessage::DragStart), entry!(KeyUp(Lmb); action_dispatch=SplineToolMessage::DragStop), entry!(KeyDown(Rmb); action_dispatch=SplineToolMessage::Confirm), - entry!(KeyDown(KeyEscape); action_dispatch=SplineToolMessage::Confirm), - entry!(KeyDown(KeyEnter); action_dispatch=SplineToolMessage::Confirm), + entry!(KeyDown(Escape); action_dispatch=SplineToolMessage::Confirm), + entry!(KeyDown(Enter); action_dispatch=SplineToolMessage::Confirm), // // FillToolMessage entry!(KeyDown(Lmb); action_dispatch=FillToolMessage::LeftMouseDown), @@ -160,114 +160,104 @@ pub fn default_mapping() -> Mapping { entry!(KeyDown(KeyE); action_dispatch=ToolMessage::ActivateToolEllipse), entry!(KeyDown(KeyY); action_dispatch=ToolMessage::ActivateToolShape), entry_multiplatform!( - standard!(KeyDown(KeyX); modifiers=[KeyShift, KeyControl], action_dispatch=ToolMessage::ResetColors), - mac_only!(KeyDown(KeyX); modifiers=[KeyShift, KeyCommand], action_dispatch=ToolMessage::ResetColors), + standard!(KeyDown(KeyX); modifiers=[Shift, Control], action_dispatch=ToolMessage::ResetColors), + mac_only!(KeyDown(KeyX); modifiers=[Shift, Command], action_dispatch=ToolMessage::ResetColors), ), - entry!(KeyDown(KeyX); modifiers=[KeyShift], action_dispatch=ToolMessage::SwapColors), - entry!(KeyDown(KeyC); modifiers=[KeyAlt], action_dispatch=ToolMessage::SelectRandomPrimaryColor), + entry!(KeyDown(KeyX); modifiers=[Shift], action_dispatch=ToolMessage::SwapColors), + entry!(KeyDown(KeyC); modifiers=[Alt], action_dispatch=ToolMessage::SelectRandomPrimaryColor), // // DocumentMessage - entry!(KeyDown(KeyDelete); action_dispatch=DocumentMessage::DeleteSelectedLayers), - entry!(KeyDown(KeyBackspace); action_dispatch=DocumentMessage::DeleteSelectedLayers), - entry!(KeyDown(KeyP); modifiers=[KeyAlt], action_dispatch=DocumentMessage::DebugPrintDocument), + entry!(KeyDown(Delete); action_dispatch=DocumentMessage::DeleteSelectedLayers), + entry!(KeyDown(Backspace); action_dispatch=DocumentMessage::DeleteSelectedLayers), + entry!(KeyDown(KeyP); modifiers=[Alt], action_dispatch=DocumentMessage::DebugPrintDocument), entry_multiplatform!( - standard!(KeyDown(KeyZ); modifiers=[KeyControl, KeyShift], action_dispatch=DocumentMessage::Redo), - mac_only!(KeyDown(KeyZ); modifiers=[KeyCommand, KeyShift], action_dispatch=DocumentMessage::Redo), + standard!(KeyDown(KeyZ); modifiers=[Control, Shift], action_dispatch=DocumentMessage::Redo), + mac_only!(KeyDown(KeyZ); modifiers=[Command, Shift], action_dispatch=DocumentMessage::Redo), ), entry_multiplatform!( - standard!(KeyDown(KeyZ); modifiers=[KeyControl], action_dispatch=DocumentMessage::Undo), - mac_only!(KeyDown(KeyZ); modifiers=[KeyCommand], action_dispatch=DocumentMessage::Undo), + standard!(KeyDown(KeyZ); modifiers=[Control], action_dispatch=DocumentMessage::Undo), + mac_only!(KeyDown(KeyZ); modifiers=[Command], action_dispatch=DocumentMessage::Undo), ), entry_multiplatform!( - standard!(KeyDown(KeyA); modifiers=[KeyControl, KeyAlt], action_dispatch=DocumentMessage::DeselectAllLayers), - mac_only!(KeyDown(KeyA); modifiers=[KeyCommand, KeyAlt], action_dispatch=DocumentMessage::DeselectAllLayers), + standard!(KeyDown(KeyA); modifiers=[Control, Alt], action_dispatch=DocumentMessage::DeselectAllLayers), + mac_only!(KeyDown(KeyA); modifiers=[Command, Alt], action_dispatch=DocumentMessage::DeselectAllLayers), ), entry_multiplatform!( - standard!(KeyDown(KeyA); modifiers=[KeyControl], action_dispatch=DocumentMessage::SelectAllLayers), - mac_only!(KeyDown(KeyA); modifiers=[KeyCommand], action_dispatch=DocumentMessage::SelectAllLayers), + standard!(KeyDown(KeyA); modifiers=[Control], action_dispatch=DocumentMessage::SelectAllLayers), + mac_only!(KeyDown(KeyA); modifiers=[Command], action_dispatch=DocumentMessage::SelectAllLayers), ), entry_multiplatform!( - standard!(KeyDown(KeyS); modifiers=[KeyControl], action_dispatch=DocumentMessage::SaveDocument), - mac_only!(KeyDown(KeyS); modifiers=[KeyCommand], action_dispatch=DocumentMessage::SaveDocument), + standard!(KeyDown(KeyS); modifiers=[Control], action_dispatch=DocumentMessage::SaveDocument), + mac_only!(KeyDown(KeyS); modifiers=[Command], action_dispatch=DocumentMessage::SaveDocument), ), entry_multiplatform!( - standard!(KeyDown(KeyD); modifiers=[KeyControl], action_dispatch=DocumentMessage::DuplicateSelectedLayers), - mac_only!(KeyDown(KeyD); modifiers=[KeyCommand], action_dispatch=DocumentMessage::DuplicateSelectedLayers), + standard!(KeyDown(KeyD); modifiers=[Control], action_dispatch=DocumentMessage::DuplicateSelectedLayers), + mac_only!(KeyDown(KeyD); modifiers=[Command], action_dispatch=DocumentMessage::DuplicateSelectedLayers), ), entry_multiplatform!( - standard!(KeyDown(KeyG); modifiers=[KeyControl], action_dispatch=DocumentMessage::GroupSelectedLayers), - mac_only!(KeyDown(KeyG); modifiers=[KeyCommand], action_dispatch=DocumentMessage::GroupSelectedLayers), + standard!(KeyDown(KeyG); modifiers=[Control], action_dispatch=DocumentMessage::GroupSelectedLayers), + mac_only!(KeyDown(KeyG); modifiers=[Command], action_dispatch=DocumentMessage::GroupSelectedLayers), ), entry_multiplatform!( - standard!(KeyDown(KeyG); modifiers=[KeyControl, KeyShift], action_dispatch=DocumentMessage::UngroupSelectedLayers), - mac_only!(KeyDown(KeyG); modifiers=[KeyCommand, KeyShift], action_dispatch=DocumentMessage::UngroupSelectedLayers), + standard!(KeyDown(KeyG); modifiers=[Control, Shift], action_dispatch=DocumentMessage::UngroupSelectedLayers), + mac_only!(KeyDown(KeyG); modifiers=[Command, Shift], action_dispatch=DocumentMessage::UngroupSelectedLayers), ), entry_multiplatform!( - standard!(KeyDown(KeyN); modifiers=[KeyControl, KeyShift], action_dispatch=DocumentMessage::CreateEmptyFolder { container_path: vec![] }), - mac_only!(KeyDown(KeyN); modifiers=[KeyCommand, KeyShift], action_dispatch=DocumentMessage::CreateEmptyFolder { container_path: vec![] }), + standard!(KeyDown(KeyN); modifiers=[Control, Shift], action_dispatch=DocumentMessage::CreateEmptyFolder { container_path: vec![] }), + mac_only!(KeyDown(KeyN); modifiers=[Command, Shift], action_dispatch=DocumentMessage::CreateEmptyFolder { container_path: vec![] }), ), entry_multiplatform!( - standard!(KeyDown(Key0); modifiers=[KeyControl], action_dispatch=DocumentMessage::ZoomCanvasToFitAll), - mac_only!(KeyDown(Key0); modifiers=[KeyCommand], action_dispatch=DocumentMessage::ZoomCanvasToFitAll), + standard!(KeyDown(Digit0); modifiers=[Control], action_dispatch=DocumentMessage::ZoomCanvasToFitAll), + mac_only!(KeyDown(Digit0); modifiers=[Command], action_dispatch=DocumentMessage::ZoomCanvasToFitAll), ), entry_multiplatform!( - standard!(KeyDown(Key1); modifiers=[KeyControl], action_dispatch=DocumentMessage::ZoomCanvasTo100Percent), - mac_only!(KeyDown(Key1); modifiers=[KeyCommand], action_dispatch=DocumentMessage::ZoomCanvasTo100Percent), + standard!(KeyDown(Digit1); modifiers=[Control], action_dispatch=DocumentMessage::ZoomCanvasTo100Percent), + mac_only!(KeyDown(Digit1); modifiers=[Command], action_dispatch=DocumentMessage::ZoomCanvasTo100Percent), ), entry_multiplatform!( - standard!(KeyDown(Key2); modifiers=[KeyControl], action_dispatch=DocumentMessage::ZoomCanvasTo200Percent), - mac_only!(KeyDown(Key2); modifiers=[KeyCommand], action_dispatch=DocumentMessage::ZoomCanvasTo200Percent), + standard!(KeyDown(Digit2); modifiers=[Control], action_dispatch=DocumentMessage::ZoomCanvasTo200Percent), + mac_only!(KeyDown(Digit2); modifiers=[Command], action_dispatch=DocumentMessage::ZoomCanvasTo200Percent), ), entry_multiplatform!( - standard!(KeyDown(KeyLeftBracket); modifiers=[KeyControl, KeyShift], action_dispatch=DocumentMessage::SelectedLayersLowerToBack), - mac_only!(KeyDown(KeyLeftBracket); modifiers=[KeyCommand, KeyShift], action_dispatch=DocumentMessage::SelectedLayersLowerToBack), + standard!(KeyDown(BracketLeft); modifiers=[Control, Shift], action_dispatch=DocumentMessage::SelectedLayersLowerToBack), + mac_only!(KeyDown(BracketLeft); modifiers=[Command, Shift], action_dispatch=DocumentMessage::SelectedLayersLowerToBack), ), entry_multiplatform!( - // TODO: Delete this in favor of the KeyLeftBracket (non-shifted version of this key) mapping above once the input system can distinguish between the non-shifted and shifted keys (important for other language keyboards) - standard!(KeyDown(KeyLeftCurlyBracket); modifiers=[KeyControl, KeyShift], action_dispatch=DocumentMessage::SelectedLayersLowerToBack), - mac_only!(KeyDown(KeyLeftCurlyBracket); modifiers=[KeyCommand, KeyShift], action_dispatch=DocumentMessage::SelectedLayersLowerToBack), + standard!(KeyDown(BracketRight); modifiers=[Control, Shift], action_dispatch=DocumentMessage::SelectedLayersRaiseToFront), + mac_only!(KeyDown(BracketRight); modifiers=[Command, Shift], action_dispatch=DocumentMessage::SelectedLayersRaiseToFront), ), entry_multiplatform!( - standard!(KeyDown(KeyRightBracket); modifiers=[KeyControl, KeyShift], action_dispatch=DocumentMessage::SelectedLayersRaiseToFront), - mac_only!(KeyDown(KeyRightBracket); modifiers=[KeyCommand, KeyShift], action_dispatch=DocumentMessage::SelectedLayersRaiseToFront), + standard!(KeyDown(BracketLeft); modifiers=[Control], action_dispatch=DocumentMessage::SelectedLayersLower), + mac_only!(KeyDown(BracketLeft); modifiers=[Command], action_dispatch=DocumentMessage::SelectedLayersLower), ), entry_multiplatform!( - // TODO: Delete this in favor of the KeyRightBracket (non-shifted version of this key) mapping above once the input system can distinguish between the non-shifted and shifted keys (important for other language keyboards) - standard!(KeyDown(KeyRightCurlyBracket); modifiers=[KeyControl, KeyShift], action_dispatch=DocumentMessage::SelectedLayersRaiseToFront), - mac_only!(KeyDown(KeyRightCurlyBracket); modifiers=[KeyCommand, KeyShift], action_dispatch=DocumentMessage::SelectedLayersRaiseToFront), + standard!(KeyDown(BracketRight); modifiers=[Control], action_dispatch=DocumentMessage::SelectedLayersRaise), + mac_only!(KeyDown(BracketRight); modifiers=[Command], action_dispatch=DocumentMessage::SelectedLayersRaise), ), - entry_multiplatform!( - standard!(KeyDown(KeyLeftBracket); modifiers=[KeyControl], action_dispatch=DocumentMessage::SelectedLayersLower), - mac_only!(KeyDown(KeyLeftBracket); modifiers=[KeyCommand], action_dispatch=DocumentMessage::SelectedLayersLower), - ), - entry_multiplatform!( - standard!(KeyDown(KeyRightBracket); modifiers=[KeyControl], action_dispatch=DocumentMessage::SelectedLayersRaise), - mac_only!(KeyDown(KeyRightBracket); modifiers=[KeyCommand], action_dispatch=DocumentMessage::SelectedLayersRaise), - ), - entry!(KeyDown(KeyArrowUp); modifiers=[KeyShift, KeyArrowLeft], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowUp); modifiers=[KeyShift, KeyArrowRight], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowUp); modifiers=[KeyShift], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowDown); modifiers=[KeyShift, KeyArrowLeft], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowDown); modifiers=[KeyShift, KeyArrowRight], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowDown); modifiers=[KeyShift], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowLeft); modifiers=[KeyShift, KeyArrowUp], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowLeft); modifiers=[KeyShift, KeyArrowDown], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowLeft); modifiers=[KeyShift], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0. }), - entry!(KeyDown(KeyArrowRight); modifiers=[KeyShift, KeyArrowUp], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowRight); modifiers=[KeyShift, KeyArrowDown], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowRight); modifiers=[KeyShift], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0. }), - entry!(KeyDown(KeyArrowUp); modifiers=[KeyArrowLeft], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowUp); modifiers=[KeyArrowRight], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowUp); action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: 0., delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowDown); modifiers=[KeyArrowLeft], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowDown); modifiers=[KeyArrowRight], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowDown); action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: 0., delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowLeft); modifiers=[KeyArrowUp], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowLeft); modifiers=[KeyArrowDown], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowLeft); action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: 0. }), - entry!(KeyDown(KeyArrowRight); modifiers=[KeyArrowUp], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowRight); modifiers=[KeyArrowDown], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), - entry!(KeyDown(KeyArrowRight); action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: 0. }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0. }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }), + entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0. }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), + entry!(KeyDown(ArrowUp); action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: 0., delta_y: -NUDGE_AMOUNT }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), + entry!(KeyDown(ArrowDown); action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: 0., delta_y: NUDGE_AMOUNT }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), + entry!(KeyDown(ArrowLeft); action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: 0. }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }), + entry!(KeyDown(ArrowRight); action_dispatch=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: 0. }), // // TransformLayerMessage entry!(KeyDown(KeyG); action_dispatch=TransformLayerMessage::BeginGrab), @@ -275,85 +265,85 @@ pub fn default_mapping() -> Mapping { entry!(KeyDown(KeyS); action_dispatch=TransformLayerMessage::BeginScale), // // MovementMessage - entry!(KeyDown(Mmb); modifiers=[KeyControl], action_dispatch=MovementMessage::RotateCanvasBegin), - entry!(KeyDown(Mmb); modifiers=[KeyShift], action_dispatch=MovementMessage::ZoomCanvasBegin), + entry!(KeyDown(Mmb); modifiers=[Control], action_dispatch=MovementMessage::RotateCanvasBegin), + entry!(KeyDown(Mmb); modifiers=[Shift], action_dispatch=MovementMessage::ZoomCanvasBegin), entry!(KeyDown(Mmb); action_dispatch=MovementMessage::TranslateCanvasBegin), entry!(KeyUp(Mmb); action_dispatch=MovementMessage::TransformCanvasEnd), - entry!(KeyDown(Lmb); modifiers=[KeySpace], action_dispatch=MovementMessage::TranslateCanvasBegin), - entry!(KeyUp(Lmb); modifiers=[KeySpace], action_dispatch=MovementMessage::TransformCanvasEnd), + entry!(KeyDown(Lmb); modifiers=[Space], action_dispatch=MovementMessage::TranslateCanvasBegin), + entry!(KeyUp(Lmb); modifiers=[Space], action_dispatch=MovementMessage::TransformCanvasEnd), entry_multiplatform!( - standard!(KeyDown(KeyPlus); modifiers=[KeyControl], action_dispatch=MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }), - mac_only!(KeyDown(KeyPlus); modifiers=[KeyCommand], action_dispatch=MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }), + standard!(KeyDown(NumpadAdd); modifiers=[Control], action_dispatch=MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }), + mac_only!(KeyDown(NumpadAdd); modifiers=[Command], action_dispatch=MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }), ), entry_multiplatform!( - standard!(KeyDown(KeyEquals); modifiers=[KeyControl], action_dispatch=MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }), - mac_only!(KeyDown(KeyEquals); modifiers=[KeyCommand], action_dispatch=MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }), + standard!(KeyDown(Equal); modifiers=[Control], action_dispatch=MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }), + mac_only!(KeyDown(Equal); modifiers=[Command], action_dispatch=MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }), ), entry_multiplatform!( - standard!(KeyDown(KeyMinus); modifiers=[KeyControl], action_dispatch=MovementMessage::DecreaseCanvasZoom { center_on_mouse: false }), - mac_only!(KeyDown(KeyMinus); modifiers=[KeyCommand], action_dispatch=MovementMessage::DecreaseCanvasZoom { center_on_mouse: false }), + standard!(KeyDown(Minus); modifiers=[Control], action_dispatch=MovementMessage::DecreaseCanvasZoom { center_on_mouse: false }), + mac_only!(KeyDown(Minus); modifiers=[Command], action_dispatch=MovementMessage::DecreaseCanvasZoom { center_on_mouse: false }), ), - entry!(WheelScroll; modifiers=[KeyControl], action_dispatch=MovementMessage::WheelCanvasZoom), - entry!(WheelScroll; modifiers=[KeyShift], action_dispatch=MovementMessage::WheelCanvasTranslate { use_y_as_x: true }), + entry!(WheelScroll; modifiers=[Control], action_dispatch=MovementMessage::WheelCanvasZoom), + entry!(WheelScroll; modifiers=[Shift], action_dispatch=MovementMessage::WheelCanvasTranslate { use_y_as_x: true }), entry!(WheelScroll; action_dispatch=MovementMessage::WheelCanvasTranslate { use_y_as_x: false }), - entry!(KeyDown(KeyPageUp); modifiers=[KeyShift], action_dispatch=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(1., 0.) }), - entry!(KeyDown(KeyPageDown); modifiers=[KeyShift], action_dispatch=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(-1., 0.) }), - entry!(KeyDown(KeyPageUp); action_dispatch=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(0., 1.) }), - entry!(KeyDown(KeyPageDown); action_dispatch=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(0., -1.) }), + entry!(KeyDown(PageUp); modifiers=[Shift], action_dispatch=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(1., 0.) }), + entry!(KeyDown(PageDown); modifiers=[Shift], action_dispatch=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(-1., 0.) }), + entry!(KeyDown(PageUp); action_dispatch=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(0., 1.) }), + entry!(KeyDown(PageDown); action_dispatch=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(0., -1.) }), // // PortfolioMessage entry_multiplatform!( - standard!(KeyDown(KeyO); modifiers=[KeyControl], action_dispatch=PortfolioMessage::OpenDocument), - mac_only!(KeyDown(KeyO); modifiers=[KeyCommand], action_dispatch=PortfolioMessage::OpenDocument), + standard!(KeyDown(KeyO); modifiers=[Control], action_dispatch=PortfolioMessage::OpenDocument), + mac_only!(KeyDown(KeyO); modifiers=[Command], action_dispatch=PortfolioMessage::OpenDocument), ), entry_multiplatform!( - standard!(KeyDown(KeyI); modifiers=[KeyControl], action_dispatch=PortfolioMessage::Import), - mac_only!(KeyDown(KeyI); modifiers=[KeyCommand], action_dispatch=PortfolioMessage::Import), + standard!(KeyDown(KeyI); modifiers=[Control], action_dispatch=PortfolioMessage::Import), + mac_only!(KeyDown(KeyI); modifiers=[Command], action_dispatch=PortfolioMessage::Import), ), - entry!(KeyDown(KeyTab); modifiers=[KeyControl], action_dispatch=PortfolioMessage::NextDocument), - entry!(KeyDown(KeyTab); modifiers=[KeyControl, KeyShift], action_dispatch=PortfolioMessage::PrevDocument), + entry!(KeyDown(Tab); modifiers=[Control], action_dispatch=PortfolioMessage::NextDocument), + entry!(KeyDown(Tab); modifiers=[Control, Shift], action_dispatch=PortfolioMessage::PrevDocument), entry_multiplatform!( - standard!(KeyDown(KeyW); modifiers=[KeyControl], action_dispatch=PortfolioMessage::CloseActiveDocumentWithConfirmation), - mac_only!(KeyDown(KeyW); modifiers=[KeyCommand], action_dispatch=PortfolioMessage::CloseActiveDocumentWithConfirmation), + standard!(KeyDown(KeyW); modifiers=[Control], action_dispatch=PortfolioMessage::CloseActiveDocumentWithConfirmation), + mac_only!(KeyDown(KeyW); modifiers=[Command], action_dispatch=PortfolioMessage::CloseActiveDocumentWithConfirmation), ), entry_multiplatform!( - standard!(KeyDown(KeyX); modifiers=[KeyControl], action_dispatch=PortfolioMessage::Cut { clipboard: Clipboard::Device }), - mac_only!(KeyDown(KeyX); modifiers=[KeyCommand], action_dispatch=PortfolioMessage::Cut { clipboard: Clipboard::Device }), + standard!(KeyDown(KeyX); modifiers=[Control], action_dispatch=PortfolioMessage::Cut { clipboard: Clipboard::Device }), + mac_only!(KeyDown(KeyX); modifiers=[Command], action_dispatch=PortfolioMessage::Cut { clipboard: Clipboard::Device }), ), entry_multiplatform!( - standard!(KeyDown(KeyC); modifiers=[KeyControl], action_dispatch=PortfolioMessage::Copy { clipboard: Clipboard::Device }), - mac_only!(KeyDown(KeyC); modifiers=[KeyCommand], action_dispatch=PortfolioMessage::Copy { clipboard: Clipboard::Device }), + standard!(KeyDown(KeyC); modifiers=[Control], action_dispatch=PortfolioMessage::Copy { clipboard: Clipboard::Device }), + mac_only!(KeyDown(KeyC); modifiers=[Command], action_dispatch=PortfolioMessage::Copy { clipboard: Clipboard::Device }), ), entry_multiplatform!( // This shortcut is intercepted in the frontend; it exists here only as a shortcut mapping source - standard!(KeyDown(KeyV); modifiers=[KeyControl], action_dispatch=FrontendMessage::TriggerPaste), - mac_only!(KeyDown(KeyV); modifiers=[KeyCommand], action_dispatch=FrontendMessage::TriggerPaste), + standard!(KeyDown(KeyV); modifiers=[Control], action_dispatch=FrontendMessage::TriggerPaste), + mac_only!(KeyDown(KeyV); modifiers=[Command], action_dispatch=FrontendMessage::TriggerPaste), ), // // DialogMessage entry_multiplatform!( - standard!(KeyDown(KeyN); modifiers=[KeyControl], action_dispatch=DialogMessage::RequestNewDocumentDialog), - mac_only!(KeyDown(KeyN); modifiers=[KeyCommand], action_dispatch=DialogMessage::RequestNewDocumentDialog), + standard!(KeyDown(KeyN); modifiers=[Control], action_dispatch=DialogMessage::RequestNewDocumentDialog), + mac_only!(KeyDown(KeyN); modifiers=[Command], action_dispatch=DialogMessage::RequestNewDocumentDialog), ), entry_multiplatform!( - standard!(KeyDown(KeyW); modifiers=[KeyControl, KeyAlt], action_dispatch=DialogMessage::CloseAllDocumentsWithConfirmation), - mac_only!(KeyDown(KeyW); modifiers=[KeyCommand, KeyAlt], action_dispatch=DialogMessage::CloseAllDocumentsWithConfirmation), + standard!(KeyDown(KeyW); modifiers=[Control, Alt], action_dispatch=DialogMessage::CloseAllDocumentsWithConfirmation), + mac_only!(KeyDown(KeyW); modifiers=[Command, Alt], action_dispatch=DialogMessage::CloseAllDocumentsWithConfirmation), ), entry_multiplatform!( - standard!(KeyDown(KeyE); modifiers=[KeyControl], action_dispatch=DialogMessage::RequestExportDialog), - mac_only!(KeyDown(KeyE); modifiers=[KeyCommand], action_dispatch=DialogMessage::RequestExportDialog), + standard!(KeyDown(KeyE); modifiers=[Control], action_dispatch=DialogMessage::RequestExportDialog), + mac_only!(KeyDown(KeyE); modifiers=[Command], action_dispatch=DialogMessage::RequestExportDialog), ), // // DebugMessage - entry!(KeyDown(KeyT); modifiers=[KeyAlt], action_dispatch=DebugMessage::ToggleTraceLogs), - entry!(KeyDown(Key0); modifiers=[KeyAlt], action_dispatch=DebugMessage::MessageOff), - entry!(KeyDown(Key1); modifiers=[KeyAlt], action_dispatch=DebugMessage::MessageNames), - entry!(KeyDown(Key2); modifiers=[KeyAlt], action_dispatch=DebugMessage::MessageContents), + entry!(KeyDown(KeyT); modifiers=[Alt], action_dispatch=DebugMessage::ToggleTraceLogs), + entry!(KeyDown(Digit0); modifiers=[Alt], action_dispatch=DebugMessage::MessageOff), + entry!(KeyDown(Digit1); modifiers=[Alt], action_dispatch=DebugMessage::MessageNames), + entry!(KeyDown(Digit2); modifiers=[Alt], action_dispatch=DebugMessage::MessageContents), ]; let (mut key_up, mut key_down, mut double_click, mut wheel_scroll, mut pointer_move) = mappings; // TODO: Hardcode these 10 lines into 10 lines of declarations, or make this use a macro to do all 10 in one line - const NUMBER_KEYS: [Key; 10] = [Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9]; + const NUMBER_KEYS: [Key; 10] = [Digit0, Digit1, Digit2, Digit3, Digit4, Digit5, Digit6, Digit7, Digit8, Digit9]; for (i, key) in NUMBER_KEYS.iter().enumerate() { key_down[*key as usize].0.insert( 0, diff --git a/editor/src/messages/input_mapper/input_mapper_message_handler.rs b/editor/src/messages/input_mapper/input_mapper_message_handler.rs index c6e3eb3a..f77be40f 100644 --- a/editor/src/messages/input_mapper/input_mapper_message_handler.rs +++ b/editor/src/messages/input_mapper/input_mapper_message_handler.rs @@ -82,7 +82,7 @@ impl InputMapperMessageHandler { keys.sort_by(|a, b| { // Order according to platform guidelines mentioned at https://ux.stackexchange.com/questions/58185/normative-ordering-for-modifier-key-combinations - const ORDER: [Key; 4] = [Key::KeyControl, Key::KeyAlt, Key::KeyShift, Key::KeyCommand]; + const ORDER: [Key; 4] = [Key::Control, Key::Alt, Key::Shift, Key::Command]; match (ORDER.contains(a), ORDER.contains(b)) { (true, true) => ORDER.iter().position(|key| key == a).unwrap().cmp(&ORDER.iter().position(|key| key == b).unwrap()), diff --git a/editor/src/messages/input_mapper/utility_types/input_keyboard.rs b/editor/src/messages/input_mapper/utility_types/input_keyboard.rs index 9d78435d..8a138003 100644 --- a/editor/src/messages/input_mapper/utility_types/input_keyboard.rs +++ b/editor/src/messages/input_mapper/utility_types/input_keyboard.rs @@ -3,6 +3,7 @@ use crate::messages::prelude::*; pub use graphene::DocumentResponse; use bitflags::bitflags; +use serde::ser::SerializeStruct; use serde::{Deserialize, Serialize}; use std::fmt::{self, Display, Formatter}; use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign}; @@ -34,18 +35,27 @@ bitflags! { } } -// TODO: Consider renaming to `KeyMessage` for consistency with other messages that implement `#[impl_message(..)]` +// Currently this is mostly based on the JS `KeyboardEvent.code` list: +// But in the future, especially once users can customize keyboard mappings, we should deviate more from this so we have actual symbols +// like `+` (which doesn't exist because it's the shifted version of `=` on the US keyboard, after which these scan codes are named). +// We'd ideally like to bind shortcuts to symbols, not scan codes, so the shortcut for "zoom in" is `Ctrl +` which the user can press +// (although we ignore the shift key, so the user doesn't have to press `Ctrl Shift +` on a US keyboard), even if the keyboard layout +// is for a different locale where the `+` key is somewhere entirely different, shifted or not. This would then also work for numpad `+`. #[impl_message(Message, InputMapperMessage, KeyDown)] -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)] pub enum Key { - UnknownKey, - - // Mouse keys - Lmb, - Rmb, - Mmb, - - // Keyboard keys + // Writing system keys + Digit0, + Digit1, + Digit2, + Digit3, + Digit4, + Digit5, + Digit6, + Digit7, + Digit8, + Digit9, + // KeyA, KeyB, KeyC, @@ -72,52 +82,192 @@ pub enum Key { KeyX, KeyY, KeyZ, - Key0, - Key1, - Key2, - Key3, - Key4, - Key5, - Key6, - Key7, - Key8, - Key9, - KeyEnter, - KeyEquals, - KeyMinus, - KeyPlus, - KeyShift, - KeySpace, - KeyControl, - KeyCommand, - KeyMeta, - KeyDelete, - KeyBackspace, - KeyAlt, - KeyEscape, - KeyTab, - KeyArrowUp, - KeyArrowDown, - KeyArrowLeft, - KeyArrowRight, - KeyLeftBracket, - KeyRightBracket, - KeyLeftCurlyBracket, - KeyRightCurlyBracket, - KeyPageUp, - KeyPageDown, - KeyComma, - KeyPeriod, + // + Backquote, + Backslash, + BracketLeft, + BracketRight, + Comma, + Equal, + Minus, + Period, + Quote, + Semicolon, + Slash, + + // Functional keys + Alt, + Meta, + Shift, + Control, + Backspace, + CapsLock, + ContextMenu, + Enter, + Space, + Tab, + + // Control pad keys + Delete, + End, + Help, + Home, + Insert, + PageDown, + PageUp, + + // Arrow pad keys + ArrowDown, + ArrowLeft, + ArrowRight, + ArrowUp, + + // Numpad keys + // Numpad0, + // Numpad1, + // Numpad2, + // Numpad3, + // Numpad4, + // Numpad5, + // Numpad6, + // Numpad7, + // Numpad8, + // Numpad9, + NumLock, + NumpadAdd, + // NumpadBackspace, + // NumpadClear, + // NumpadClearEntry, + // NumpadComma, + // NumpadDecimal, + // NumpadDivide, + // NumpadEnter, + // NumpadEqual, + NumpadHash, + // NumpadMemoryAdd, + // NumpadMemoryClear, + // NumpadMemoryRecall, + // NumpadMemoryStore, + // NumpadMemorySubtract, + NumpadMultiply, + NumpadParenLeft, + NumpadParenRight, + // NumpadStar, + // NumpadSubtract, + + // Function keys + Escape, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + F13, + F14, + F15, + F16, + F17, + F18, + F19, + F20, + F21, + F22, + F23, + F24, + Fn, + FnLock, + PrintScreen, + ScrollLock, + Pause, + + // Unidentified keys + Unidentified, + + // Other keys that aren't part of the W3C spec + Command, + Lmb, + Rmb, + Mmb, // This has to be the last element in the enum NumKeys, } +impl Serialize for Key { + fn serialize(&self, serializer: S) -> Result { + let key = format!("{:?}", self); + let label = self.to_string(); + + let mut state = serializer.serialize_struct("KeyWithLabel", 2)?; + state.serialize_field("key", &key)?; + state.serialize_field("label", &label)?; + state.end() + } +} + impl fmt::Display for Key { + // TODO: Relevant key labels should be localized when we get around to implementing localization/internationalization fn fmt(&self, f: &mut fmt::Formatter) -> std::fmt::Result { let key_name = format!("{:?}", self); - let name = if &key_name[0..3] == "Key" { key_name.chars().skip(3).collect::() } else { key_name }; + // Writing system keys + const DIGIT_PREFIX: &str = "Digit"; + if key_name.len() == DIGIT_PREFIX.len() + 1 && &key_name[0..DIGIT_PREFIX.len()] == "Digit" { + return write!(f, "{}", key_name.chars().skip(DIGIT_PREFIX.len()).collect::()); + } + const KEY_PREFIX: &str = "Key"; + if key_name.len() == KEY_PREFIX.len() + 1 && &key_name[0..KEY_PREFIX.len()] == "Key" { + return write!(f, "{}", key_name.chars().skip(KEY_PREFIX.len()).collect::()); + } + + let name = match self { + // Writing system keys + Self::Backquote => "`", + Self::Backslash => "\\", + Self::BracketLeft => "[", + Self::BracketRight => "]", + Self::Comma => ",", + Self::Equal => "=", + Self::Minus => "-", + Self::Period => ".", + Self::Quote => "'", + Self::Semicolon => ";", + Self::Slash => "/", + + // Functional keys + Self::Control => "Ctrl", + + // Control pad keys + Self::Delete => "Del", + Self::PageDown => "PgDn", + Self::PageUp => "PgUp", + + // Arrow pad keys + Self::ArrowDown => "↓", + Self::ArrowLeft => "←", + Self::ArrowRight => "→", + Self::ArrowUp => "↑", + + // Numpad keys + Self::NumpadAdd => "Numpad +", + Self::NumpadHash => "Numpad #", + Self::NumpadMultiply => "Numpad *", + Self::NumpadParenLeft => "Numpad (", + Self::NumpadParenRight => "Numpad )", + + // Function keys + Self::Escape => "Esc", + Self::PrintScreen => "PrtScr", + + _ => key_name.as_str(), + }; write!(f, "{}", name) } diff --git a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs index aaf2aae8..c5d94d6e 100644 --- a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs +++ b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs @@ -139,12 +139,12 @@ impl InputPreprocessorMessageHandler { } fn handle_modifier_keys(&mut self, modifier_keys: ModifierKeys, keyboard_platform: KeyboardPlatformLayout, responses: &mut VecDeque) { - self.handle_modifier_key(Key::KeyShift, modifier_keys.contains(ModifierKeys::SHIFT), responses); - self.handle_modifier_key(Key::KeyAlt, modifier_keys.contains(ModifierKeys::ALT), responses); - self.handle_modifier_key(Key::KeyControl, modifier_keys.contains(ModifierKeys::CONTROL), responses); + self.handle_modifier_key(Key::Shift, modifier_keys.contains(ModifierKeys::SHIFT), responses); + self.handle_modifier_key(Key::Alt, modifier_keys.contains(ModifierKeys::ALT), responses); + self.handle_modifier_key(Key::Control, modifier_keys.contains(ModifierKeys::CONTROL), responses); let meta_or_command = match keyboard_platform { - KeyboardPlatformLayout::Mac => Key::KeyCommand, - KeyboardPlatformLayout::Standard => Key::KeyMeta, + KeyboardPlatformLayout::Mac => Key::Command, + KeyboardPlatformLayout::Standard => Key::Meta, }; self.handle_modifier_key(meta_or_command, modifier_keys.contains(ModifierKeys::META_OR_COMMAND), responses); } @@ -186,8 +186,8 @@ mod test { input_preprocessor.process_message(message, KeyboardPlatformLayout::Standard, &mut responses); - assert!(input_preprocessor.keyboard.get(Key::KeyAlt as usize)); - assert_eq!(responses.pop_front(), Some(InputMapperMessage::KeyDown(Key::KeyAlt).into())); + assert!(input_preprocessor.keyboard.get(Key::Alt as usize)); + assert_eq!(responses.pop_front(), Some(InputMapperMessage::KeyDown(Key::Alt).into())); } #[test] @@ -202,8 +202,8 @@ mod test { input_preprocessor.process_message(message, KeyboardPlatformLayout::Standard, &mut responses); - assert!(input_preprocessor.keyboard.get(Key::KeyControl as usize)); - assert_eq!(responses.pop_front(), Some(InputMapperMessage::KeyDown(Key::KeyControl).into())); + assert!(input_preprocessor.keyboard.get(Key::Control as usize)); + assert_eq!(responses.pop_front(), Some(InputMapperMessage::KeyDown(Key::Control).into())); } #[test] @@ -218,14 +218,14 @@ mod test { input_preprocessor.process_message(message, KeyboardPlatformLayout::Standard, &mut responses); - assert!(input_preprocessor.keyboard.get(Key::KeyShift as usize)); - assert_eq!(responses.pop_front(), Some(InputMapperMessage::KeyDown(Key::KeyShift).into())); + assert!(input_preprocessor.keyboard.get(Key::Shift as usize)); + assert_eq!(responses.pop_front(), Some(InputMapperMessage::KeyDown(Key::Shift).into())); } #[test] fn process_action_key_down_handle_modifier_keys() { let mut input_preprocessor = InputPreprocessorMessageHandler::default(); - input_preprocessor.keyboard.set(Key::KeyControl as usize); + input_preprocessor.keyboard.set(Key::Control as usize); let key = Key::KeyA; let modifier_keys = ModifierKeys::empty(); @@ -235,8 +235,8 @@ mod test { input_preprocessor.process_message(message, KeyboardPlatformLayout::Standard, &mut responses); - assert!(!input_preprocessor.keyboard.get(Key::KeyControl as usize)); - assert_eq!(responses.pop_front(), Some(InputMapperMessage::KeyUp(Key::KeyControl).into())); + assert!(!input_preprocessor.keyboard.get(Key::Control as usize)); + assert_eq!(responses.pop_front(), Some(InputMapperMessage::KeyUp(Key::Control).into())); } #[test] @@ -251,9 +251,9 @@ mod test { input_preprocessor.process_message(message, KeyboardPlatformLayout::Standard, &mut responses); - assert!(input_preprocessor.keyboard.get(Key::KeyControl as usize)); - assert!(input_preprocessor.keyboard.get(Key::KeyShift as usize)); - assert!(responses.contains(&InputMapperMessage::KeyDown(Key::KeyControl).into())); - assert!(responses.contains(&InputMapperMessage::KeyDown(Key::KeyControl).into())); + assert!(input_preprocessor.keyboard.get(Key::Control as usize)); + assert!(input_preprocessor.keyboard.get(Key::Shift as usize)); + assert!(responses.contains(&InputMapperMessage::KeyDown(Key::Control).into())); + assert!(responses.contains(&InputMapperMessage::KeyDown(Key::Control).into())); } } diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index a3d40639..523b29ba 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -1358,6 +1358,7 @@ impl DocumentMessageHandler { size: 24, icon: "ZoomIn".into(), tooltip: "Zoom In".into(), + tooltip_shortcut: action_keys!(MovementMessageDiscriminant::IncreaseCanvasZoom), on_update: WidgetCallback::new(|_| MovementMessage::IncreaseCanvasZoom { center_on_mouse: false }.into()), ..IconButton::default() })), @@ -1365,6 +1366,7 @@ impl DocumentMessageHandler { size: 24, icon: "ZoomOut".into(), tooltip: "Zoom Out".into(), + tooltip_shortcut: action_keys!(MovementMessageDiscriminant::DecreaseCanvasZoom), on_update: WidgetCallback::new(|_| MovementMessage::DecreaseCanvasZoom { center_on_mouse: false }.into()), ..IconButton::default() })), @@ -1372,6 +1374,7 @@ impl DocumentMessageHandler { size: 24, icon: "ZoomReset".into(), tooltip: "Zoom to 100%".into(), + tooltip_shortcut: action_keys!(DocumentMessageDiscriminant::ZoomCanvasTo100Percent), on_update: WidgetCallback::new(|_| MovementMessage::SetCanvasZoom { zoom_factor: 1. }.into()), ..IconButton::default() })), diff --git a/editor/src/messages/portfolio/document/movement/movement_message_handler.rs b/editor/src/messages/portfolio/document/movement/movement_message_handler.rs index b32e3750..bae7c704 100644 --- a/editor/src/messages/portfolio/document/movement/movement_message_handler.rs +++ b/editor/src/messages/portfolio/document/movement/movement_message_handler.rs @@ -164,7 +164,7 @@ impl MessageHandler HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain to Axis"), @@ -440,14 +440,14 @@ impl Fsm for ArtboardToolFsmState { }])]), ArtboardToolFsmState::Drawing | ArtboardToolFsmState::ResizingBounds => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/ellipse_tool.rs b/editor/src/messages/tool/tool_messages/ellipse_tool.rs index f06a385c..56e03f05 100644 --- a/editor/src/messages/tool/tool_messages/ellipse_tool.rs +++ b/editor/src/messages/tool/tool_messages/ellipse_tool.rs @@ -191,14 +191,14 @@ impl Fsm for EllipseToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain Circular"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), @@ -207,14 +207,14 @@ impl Fsm for EllipseToolFsmState { ])]), EllipseToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain Circular"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index 7e6cffa9..663ae52f 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -469,7 +469,7 @@ impl Fsm for GradientToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), @@ -477,7 +477,7 @@ impl Fsm for GradientToolFsmState { }, ])]), GradientToolFsmState::Drawing => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs index f8805b42..d79b5028 100644 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ b/editor/src/messages/tool/tool_messages/line_tool.rs @@ -247,21 +247,21 @@ impl Fsm for LineToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Lock Angle"), @@ -270,21 +270,21 @@ impl Fsm for LineToolFsmState { ])]), LineToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Lock Angle"), diff --git a/editor/src/messages/tool/tool_messages/navigate_tool.rs b/editor/src/messages/tool/tool_messages/navigate_tool.rs index b6937602..4421e6bb 100644 --- a/editor/src/messages/tool/tool_messages/navigate_tool.rs +++ b/editor/src/messages/tool/tool_messages/navigate_tool.rs @@ -201,7 +201,7 @@ impl Fsm for NavigateToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Zoom Out"), @@ -217,7 +217,7 @@ impl Fsm for NavigateToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Snap Increments"), @@ -240,7 +240,7 @@ impl Fsm for NavigateToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), @@ -249,14 +249,14 @@ impl Fsm for NavigateToolFsmState { ]), ]), NavigateToolFsmState::Tilting => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), plus: false, }])]), NavigateToolFsmState::Zooming => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Snap Increments"), diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index b91465f3..bfcfdd6e 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -312,7 +312,7 @@ impl Fsm for PathToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Grow/Shrink Selection"), @@ -329,10 +329,10 @@ impl Fsm for PathToolFsmState { HintGroup(vec![ HintInfo { key_groups: vec![ - KeysGroup(vec![Key::KeyArrowUp]), - KeysGroup(vec![Key::KeyArrowRight]), - KeysGroup(vec![Key::KeyArrowDown]), - KeysGroup(vec![Key::KeyArrowLeft]), + KeysGroup(vec![Key::ArrowUp]), + KeysGroup(vec![Key::ArrowRight]), + KeysGroup(vec![Key::ArrowDown]), + KeysGroup(vec![Key::ArrowLeft]), ], key_groups_mac: None, mouse: None, @@ -340,7 +340,7 @@ impl Fsm for PathToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Big Increment Nudge"), @@ -373,14 +373,14 @@ impl Fsm for PathToolFsmState { ]), PathToolFsmState::Dragging => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("Split/Align Handles (Toggle)"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Share Lengths of Aligned Handles"), diff --git a/editor/src/messages/tool/tool_messages/pen_tool.rs b/editor/src/messages/tool/tool_messages/pen_tool.rs index a9b7345f..b933fcb9 100644 --- a/editor/src/messages/tool/tool_messages/pen_tool.rs +++ b/editor/src/messages/tool/tool_messages/pen_tool.rs @@ -395,21 +395,21 @@ impl Fsm for PenToolFsmState { plus: false, }]), HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), plus: false, }]), HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Break Handle"), plus: false, }]), HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyEnter])], + key_groups: vec![KeysGroup(vec![Key::Enter])], key_groups_mac: None, mouse: None, label: String::from("End Path"), diff --git a/editor/src/messages/tool/tool_messages/rectangle_tool.rs b/editor/src/messages/tool/tool_messages/rectangle_tool.rs index c370433c..a23fa57e 100644 --- a/editor/src/messages/tool/tool_messages/rectangle_tool.rs +++ b/editor/src/messages/tool/tool_messages/rectangle_tool.rs @@ -192,14 +192,14 @@ impl Fsm for RectangleToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), @@ -208,14 +208,14 @@ impl Fsm for RectangleToolFsmState { ])]), RectangleToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 255a6a62..745da40a 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -742,14 +742,14 @@ impl Fsm for SelectToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], - key_groups_mac: Some(vec![KeysGroup(vec![Key::KeyCommand])]), + key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups_mac: Some(vec![KeysGroup(vec![Key::Command])]), mouse: None, label: String::from("Innermost"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Grow/Shrink Selection"), @@ -765,7 +765,7 @@ impl Fsm for SelectToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Grow/Shrink Selection"), @@ -775,10 +775,10 @@ impl Fsm for SelectToolFsmState { HintGroup(vec![ HintInfo { key_groups: vec![ - KeysGroup(vec![Key::KeyArrowUp]), - KeysGroup(vec![Key::KeyArrowRight]), - KeysGroup(vec![Key::KeyArrowDown]), - KeysGroup(vec![Key::KeyArrowLeft]), + KeysGroup(vec![Key::ArrowUp]), + KeysGroup(vec![Key::ArrowRight]), + KeysGroup(vec![Key::ArrowDown]), + KeysGroup(vec![Key::ArrowLeft]), ], key_groups_mac: None, mouse: None, @@ -786,7 +786,7 @@ impl Fsm for SelectToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Big Increment Nudge"), @@ -795,15 +795,15 @@ impl Fsm for SelectToolFsmState { ]), HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: Some(MouseMotion::LmbDrag), label: String::from("Move Duplicate"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl, Key::KeyD])], - key_groups_mac: Some(vec![KeysGroup(vec![Key::KeyCommand, Key::KeyD])]), + key_groups: vec![KeysGroup(vec![Key::Control, Key::KeyD])], + key_groups_mac: Some(vec![KeysGroup(vec![Key::Command, Key::KeyD])]), mouse: None, label: String::from("Duplicate"), plus: false, @@ -812,14 +812,14 @@ impl Fsm for SelectToolFsmState { ]), SelectToolFsmState::Dragging => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain to Axis"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Snap to Points (coming soon)"), @@ -829,7 +829,7 @@ impl Fsm for SelectToolFsmState { SelectToolFsmState::DrawingBox => HintData(vec![]), SelectToolFsmState::ResizingBounds => HintData(vec![]), SelectToolFsmState::RotatingBounds => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl])], + key_groups: vec![KeysGroup(vec![Key::Control])], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs index 8512536d..e7e5c559 100644 --- a/editor/src/messages/tool/tool_messages/shape_tool.rs +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -235,14 +235,14 @@ impl Fsm for ShapeToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain 1:1 Aspect"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), @@ -251,14 +251,14 @@ impl Fsm for ShapeToolFsmState { ])]), ShapeToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyShift])], + key_groups: vec![KeysGroup(vec![Key::Shift])], key_groups_mac: None, mouse: None, label: String::from("Constrain 1:1 Aspect"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyAlt])], + key_groups: vec![KeysGroup(vec![Key::Alt])], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/spline_tool.rs b/editor/src/messages/tool/tool_messages/spline_tool.rs index 96d80a27..6907ecdb 100644 --- a/editor/src/messages/tool/tool_messages/spline_tool.rs +++ b/editor/src/messages/tool/tool_messages/spline_tool.rs @@ -267,7 +267,7 @@ impl Fsm for SplineToolFsmState { plus: false, }]), HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyEnter])], + key_groups: vec![KeysGroup(vec![Key::Enter])], key_groups_mac: None, mouse: None, label: String::from("End Spline"), diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index 4a1b0f06..294d7d3d 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -474,14 +474,14 @@ impl Fsm for TextToolFsmState { ])]), TextToolFsmState::Editing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyControl, Key::KeyEnter])], - key_groups_mac: Some(vec![KeysGroup(vec![Key::KeyCommand, Key::KeyEnter])]), + key_groups: vec![KeysGroup(vec![Key::Control, Key::Enter])], + key_groups_mac: Some(vec![KeysGroup(vec![Key::Command, Key::Enter])]), mouse: None, label: String::from("Commit Edit"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyEscape])], + key_groups: vec![KeysGroup(vec![Key::Escape])], key_groups_mac: None, mouse: None, label: String::from("Discard Edit"), diff --git a/frontend/src/components/floating-menus/MenuList.vue b/frontend/src/components/floating-menus/MenuList.vue index a0b5cdd7..0f7511a4 100644 --- a/frontend/src/components/floating-menus/MenuList.vue +++ b/frontend/src/components/floating-menus/MenuList.vue @@ -33,7 +33,7 @@ - +
diff --git a/frontend/src/components/panels/LayerTree.vue b/frontend/src/components/panels/LayerTree.vue index 35365361..b8edb3d2 100644 --- a/frontend/src/components/panels/LayerTree.vue +++ b/frontend/src/components/panels/LayerTree.vue @@ -267,7 +267,7 @@