104 lines
3.1 KiB
GDScript
104 lines
3.1 KiB
GDScript
class_name ControllerManager extends Node
|
|
|
|
@export var dynamicallySwappingDevice : bool
|
|
@export var buttons : Array[ButtonClass]
|
|
@export var brackets : Array[Control]
|
|
@export var brackets_3d : Array[Node3D]
|
|
@export var cursor : CursorManager
|
|
@export var exitingButtons : bool
|
|
@export var settingVisibility : bool
|
|
@export var mouseRaycast : MouseRaycast
|
|
var previousFocus : Control
|
|
|
|
func _ready():
|
|
get_viewport().connect("gui_focus_changed", _on_focus_changed)
|
|
var controllers = Input.get_connected_joypads()
|
|
|
|
func _process(delta):
|
|
if (settingVisibility): SetVisibility()
|
|
|
|
func _on_focus_changed(control:Control):
|
|
if (control != null):
|
|
previousFocus = control
|
|
|
|
var controller_currently_enabled = false
|
|
func SetMainControllerState(controllerActive : bool):
|
|
match controllerActive:
|
|
true:
|
|
controller_currently_enabled = true
|
|
cursor.controller_active = true
|
|
SetPrevFocus(true)
|
|
cursor.SetCursor(cursor.cursor_visible, false)
|
|
false:
|
|
controller_currently_enabled = false
|
|
cursor.controller_active = false
|
|
SetPrevFocus(false)
|
|
cursor.SetCursor(cursor.cursor_visible, false)
|
|
|
|
var printing = false
|
|
var checkingForInput = true
|
|
func _input(event):
|
|
if (dynamicallySwappingDevice && checkingForInput):
|
|
#ENABLE CONTROLLER
|
|
if(event is InputEventJoypadButton):
|
|
cursor.controller_active = true
|
|
SetPrevFocus(true)
|
|
cursor.SetCursor(cursor.cursor_visible, false)
|
|
elif(event is InputEventKey):
|
|
if (!IsEventAssignedToNavigation(event)): return
|
|
cursor.controller_active = true
|
|
SetPrevFocus(true)
|
|
cursor.SetCursor(cursor.cursor_visible, false)
|
|
#DISABLE CONTROLLER
|
|
elif(event is InputEventMouseMotion):
|
|
if event.velocity == Vector2(0, 0): return
|
|
cursor.controller_active = false
|
|
SetPrevFocus(false)
|
|
cursor.SetCursor(cursor.cursor_visible, false)
|
|
elif(event is InputEventMouseButton):
|
|
cursor.controller_active = false
|
|
SetPrevFocus(false)
|
|
cursor.SetCursor(cursor.cursor_visible, false)
|
|
|
|
var navigationBinds = ["ui_up", "ui_down", "ui_left", "ui_right"]
|
|
func IsEventAssignedToNavigation(key : InputEventKey):
|
|
for b in navigationBinds:
|
|
if (key.is_action(b)): return true
|
|
return false
|
|
|
|
func SetRebindFocus(settingToPrevious : bool):
|
|
if (!settingToPrevious):
|
|
previousFocus.release_focus()
|
|
return
|
|
if (cursor.controller_active):
|
|
if (settingToPrevious):
|
|
previousFocus.grab_focus()
|
|
|
|
var fs1 = false
|
|
var fs2 = true
|
|
@export var stoppingOverride = true
|
|
@export var settingFilter : bool
|
|
func SetPrevFocus(grabbing : bool):
|
|
if (grabbing && !fs1):
|
|
ExitButtons()
|
|
if (settingFilter): for b in buttons: b.SetFilter("ignore")
|
|
if (previousFocus != null): previousFocus.grab_focus()
|
|
fs2 = false
|
|
fs1 = true
|
|
elif (!grabbing && !fs2):
|
|
ExitButtons()
|
|
if (previousFocus != null): previousFocus.release_focus()
|
|
if (stoppingOverride): mouseRaycast.StopRaycastOverride()
|
|
if (settingFilter): for b in buttons: b.SetFilter("stop")
|
|
fs1 = false
|
|
fs2 = true
|
|
|
|
func SetVisibility():
|
|
for b in brackets: b.visible = cursor.controller_active
|
|
for b in brackets_3d: b.visible = cursor.controller_active
|
|
|
|
func ExitButtons():
|
|
if (exitingButtons):
|
|
for b in buttons:
|
|
if(!b.resetting): b.OnExit()
|