69 lines
2.0 KiB
GDScript
69 lines
2.0 KiB
GDScript
class_name KeymapData extends RefCounted
|
|
|
|
var title: String = "default"
|
|
var map: Dictionary[String, Array]
|
|
|
|
|
|
func add_binding(bind_array: Array) -> void:
|
|
var x: int = bind_array.size() - 1
|
|
var arr: Array
|
|
for i: int in x:
|
|
arr.append(bind_array[i + 1])
|
|
map[bind_array[0][0]] = arr
|
|
|
|
|
|
static func event_from_array(array: Array) -> InputEvent:
|
|
if array.size() < 2:
|
|
return null
|
|
if array[0] == "InputEventKey":
|
|
var event: InputEventKey = InputEventKey.new()
|
|
event.physical_keycode = array[1]
|
|
return event
|
|
if array[0] == "InputEventMouseButton":
|
|
var event: InputEventMouseButton = InputEventMouseButton.new()
|
|
event.button_index = array[1]
|
|
return event
|
|
if array[0] == "InputEventJoypadButton":
|
|
var event: InputEventJoypadButton = InputEventJoypadButton.new()
|
|
event.button_index = array[1]
|
|
return event
|
|
return null
|
|
|
|
|
|
func apply() -> void:
|
|
for action_string: String in map.keys():
|
|
InputMap.action_erase_events(action_string)
|
|
for binding: Array in map[action_string]:
|
|
var event: InputEvent = event_from_array(binding)
|
|
if event:
|
|
InputMap.action_add_event(action_string, event)
|
|
|
|
|
|
func save_to_disc() -> void:
|
|
var dir: DirAccess = DirAccess.open("user://")
|
|
if !dir.dir_exists("keymaps"):
|
|
dir.make_dir("keymaps")
|
|
var save_file: FileAccess = FileAccess.open("user://keymaps/default", FileAccess.WRITE)
|
|
var dict: Dictionary = {
|
|
"title" = title,
|
|
"map" = map,
|
|
}
|
|
var json_string: String = JSON.stringify(dict)
|
|
save_file.store_line(json_string)
|
|
|
|
|
|
static func load_from_disk() -> KeymapData:
|
|
if FileAccess.file_exists("user://keymaps/default"):
|
|
var save_file: FileAccess = FileAccess.open("user://keymaps/default", FileAccess.READ)
|
|
var json_string: String = save_file.get_line()
|
|
var json: JSON = JSON.new()
|
|
var parse_result: Error = json.parse(json_string)
|
|
if parse_result == OK:
|
|
var dict: Dictionary = json.data
|
|
var keymap: KeymapData = KeymapData.new()
|
|
keymap.title = dict["title"]
|
|
for key: String in dict["map"].keys():
|
|
keymap.map[key] = dict["map"][key]
|
|
return keymap
|
|
return KeymapData.new()
|