From d028582f271922fd7eeb36df42654c87f4515e83 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Mon, 16 May 2022 21:49:07 +0300 Subject: [PATCH] Move cursor with numpad arrow keys, joy d-pad and left stick Similar to GraphicsGale, you can now draw without moving the mouse. Although you still need the mouse for the left and right buttons, but I'd like to make give more options to the user as well so that they can activate tools using keyboard and joypad buttons, if they like. The numpad arrow keys did nothing previously, so nothing changes for people who are not interested in this feature. They are also configurable thanks to the Keychain plugin. --- project.godot | 28 ++++++++++++++++++++++++++++ src/Autoload/Global.gd | 21 +++++++++++++-------- src/UI/Canvas/Canvas.gd | 22 ++++++++++++++++------ 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/project.godot b/project.godot index 43397cf5b..4b585f887 100644 --- a/project.godot +++ b/project.godot @@ -714,6 +714,34 @@ camera_down={ , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":3,"axis_value":1.0,"script":null) ] } +move_mouse_left={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777354,"physical_scancode":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null) + ] +} +move_mouse_right={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777356,"physical_scancode":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null) + ] +} +move_mouse_up={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777358,"physical_scancode":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null) + ] +} +move_mouse_down={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777352,"physical_scancode":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null) + ] +} [locale] diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index d5938ab74..a742ef29e 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -281,13 +281,17 @@ func _initialize_keychain() -> void: Keychain.MenuInputAction.new("", "Select menu", true, "SelectMenu", SelectMenu.INVERT), "open_docs": Keychain.MenuInputAction.new("", "Help menu", true, "HelpMenu", HelpMenu.ONLINE_DOCS), - "zoom_in": Keychain.InputAction.new("", "General"), - "zoom_out": Keychain.InputAction.new("", "General"), - "camera_left": Keychain.InputAction.new("", "General"), - "camera_right": Keychain.InputAction.new("", "General"), - "camera_up": Keychain.InputAction.new("", "General"), - "camera_down": Keychain.InputAction.new("", "General"), - "pan": Keychain.InputAction.new("", "General"), + "zoom_in": Keychain.InputAction.new("", "Canvas"), + "zoom_out": Keychain.InputAction.new("", "Canvas"), + "camera_left": Keychain.InputAction.new("", "Canvas"), + "camera_right": Keychain.InputAction.new("", "Canvas"), + "camera_up": Keychain.InputAction.new("", "Canvas"), + "camera_down": Keychain.InputAction.new("", "Canvas"), + "pan": Keychain.InputAction.new("", "Canvas"), + "move_mouse_left": Keychain.InputAction.new("", "Cursor movement"), + "move_mouse_right": Keychain.InputAction.new("", "Cursor movement"), + "move_mouse_up": Keychain.InputAction.new("", "Cursor movement"), + "move_mouse_down": Keychain.InputAction.new("", "Cursor movement"), "switch_colors": Keychain.InputAction.new("", "Buttons"), "go_to_first_frame": Keychain.InputAction.new("", "Buttons"), "go_to_last_frame": Keychain.InputAction.new("", "Buttons"), @@ -316,7 +320,8 @@ func _initialize_keychain() -> void: } Keychain.groups = { - "General": Keychain.InputGroup.new("", false), + "Canvas": Keychain.InputGroup.new("", false), + "Cursor movement": Keychain.InputGroup.new("Canvas"), "Buttons": Keychain.InputGroup.new(), "Tools": Keychain.InputGroup.new(), "Left": Keychain.InputGroup.new("Tools"), diff --git a/src/UI/Canvas/Canvas.gd b/src/UI/Canvas/Canvas.gd index 902b684f3..7e896960a 100644 --- a/src/UI/Canvas/Canvas.gd +++ b/src/UI/Canvas/Canvas.gd @@ -1,6 +1,9 @@ class_name Canvas extends Node2D +const MOVE_ACTIONS := ["move_mouse_left", "move_mouse_right", "move_mouse_up", "move_mouse_down"] +const CURSOR_SPEED_RATE := 6.0 + var current_pixel := Vector2.ZERO var sprite_changed_this_frame := false # For optimization purposes var move_preview_location := Vector2.ZERO @@ -57,18 +60,25 @@ func _draw() -> void: func _input(event: InputEvent) -> void: # Don't process anything below if the input isn't a mouse event, or Shift/Ctrl. # This decreases CPU/GPU usage slightly. + var get_velocity := false if not event is InputEventMouse: - if not event is InputEventKey: + for action in MOVE_ACTIONS: + if event.is_action(action): + get_velocity = true + if !get_velocity: return - elif not event.scancode in [KEY_SHIFT, KEY_CONTROL]: - return -# elif not get_viewport_rect().has_point(event.position): -# return + var tmp_position: Vector2 = Global.main_viewport.get_local_mouse_position() + if get_velocity: + var velocity := Input.get_vector( + "move_mouse_left", "move_mouse_right", "move_mouse_up", "move_mouse_down" + ) + if velocity != Vector2.ZERO: + tmp_position += velocity * CURSOR_SPEED_RATE + Global.main_viewport.warp_mouse(tmp_position) # Do not use self.get_local_mouse_position() because it return unexpected # value when shrink parameter is not equal to one. At godot version 3.2.3 var tmp_transform = get_canvas_transform().affine_inverse() - var tmp_position = Global.main_viewport.get_local_mouse_position() current_pixel = tmp_transform.basis_xform(tmp_position) + tmp_transform.origin if Global.has_focus: