89 lines
3.0 KiB
GDScript3
89 lines
3.0 KiB
GDScript3
|
tool
|
||
|
|
||
|
extends Control
|
||
|
|
||
|
onready var grid = find_node("grid")
|
||
|
onready var key_dialog = get_node("key_dialog")
|
||
|
|
||
|
const INPUT_TYPE_KEY = 0
|
||
|
const INPUT_TYPE_JOYPAD = 1
|
||
|
|
||
|
var last_action:String
|
||
|
var last_event:InputEvent
|
||
|
|
||
|
var new_inputs = {}
|
||
|
|
||
|
func _ready():
|
||
|
init_mapping()
|
||
|
|
||
|
|
||
|
func init_mapping():
|
||
|
new_inputs = {}
|
||
|
for action in InputMap.get_actions():
|
||
|
if action.begins_with("controls_"):
|
||
|
var action_label = Label.new()
|
||
|
action_label.set_name(action + "_label")
|
||
|
action_label.set_text(action)
|
||
|
grid.add_child(action_label)
|
||
|
|
||
|
var key_action_button = Button.new()
|
||
|
key_action_button.set_h_size_flags(SIZE_SHRINK_CENTER)
|
||
|
key_action_button.set_flat(true)
|
||
|
key_action_button.set_meta("action",action)
|
||
|
key_action_button.set_button_icon(get_node("icons/key").get_button_icon())
|
||
|
|
||
|
var joypad_action_button = Button.new()
|
||
|
joypad_action_button.set_h_size_flags(SIZE_SHRINK_CENTER)
|
||
|
joypad_action_button.set_flat(true)
|
||
|
joypad_action_button.set_meta("action",action)
|
||
|
|
||
|
for mapping in InputMap.get_action_list(action):
|
||
|
if mapping is InputEventKey:
|
||
|
key_action_button.set_text(mapping.as_text())
|
||
|
key_action_button.set_tooltip(mapping.as_text())
|
||
|
elif mapping is InputEventJoypadButton:
|
||
|
joypad_action_button.set_tooltip(str(mapping.button_index))
|
||
|
if has_node("icons/joypad/" + str(mapping.button_index)):
|
||
|
joypad_action_button.set_button_icon(get_node("icons/joypad/" + str(mapping.button_index)).get_button_icon())
|
||
|
else:
|
||
|
joypad_action_button.set_button_icon(get_node("icons/joypad/other").get_button_icon())
|
||
|
joypad_action_button.set_text(str(mapping.button_index))
|
||
|
|
||
|
grid.add_child(key_action_button)
|
||
|
key_action_button.connect("pressed",self,"_on_button_pressed",[action, INPUT_TYPE_KEY])
|
||
|
|
||
|
grid.add_child(joypad_action_button)
|
||
|
joypad_action_button.connect("pressed",self,"_on_button_pressed",[action, INPUT_TYPE_JOYPAD])
|
||
|
|
||
|
func _unhandled_input(event):
|
||
|
if key_dialog.is_visible_in_tree():
|
||
|
if key_dialog.get_meta("type") == INPUT_TYPE_KEY && event is InputEventKey:
|
||
|
last_event = event
|
||
|
key_dialog.set_text(tr(last_event.as_text()))
|
||
|
key_dialog.get_ok().set_disabled(false)
|
||
|
elif key_dialog.get_meta("type") == INPUT_TYPE_JOYPAD && event is InputEventJoypadButton:
|
||
|
last_event = event
|
||
|
key_dialog.set_text(last_event.as_text())
|
||
|
key_dialog.get_ok().set_disabled(false)
|
||
|
|
||
|
|
||
|
func _on_button_pressed(action, type):
|
||
|
last_action = action
|
||
|
last_event = null
|
||
|
key_dialog.set_text(tr("PRESS_KEY"))
|
||
|
key_dialog.set_meta("type", type)
|
||
|
key_dialog.connect("confirmed",self,"_on_dialog_confirmed")
|
||
|
key_dialog.get_ok().set_disabled(true)
|
||
|
key_dialog.popup_centered()
|
||
|
|
||
|
|
||
|
func _on_dialog_confirmed(type):
|
||
|
if not new_inputs.has(last_action):
|
||
|
new_inputs[last_action] = {}
|
||
|
match key_dialog.get_meta("type"):
|
||
|
INPUT_TYPE_KEY:
|
||
|
if last_event is InputEventKey:
|
||
|
new_inputs[last_action]["key"] = OS.get_scancode_string(last_event.scancode)
|
||
|
INPUT_TYPE_JOYPAD:
|
||
|
if last_event is InputEventJoypadButton:
|
||
|
new_inputs[last_action]["joypad"] = last_event.button_index
|