155 lines
3.8 KiB
GDScript
155 lines
3.8 KiB
GDScript
extends Node
|
|
|
|
signal layout_swapped(new_layout: AbstractLayout)
|
|
|
|
const CONFIG_PATH := "user://layout.cfg"
|
|
const SECTION_INFO := "info"
|
|
const SECTION_KEYS := "keys"
|
|
const PARAM_NAME := "name"
|
|
|
|
var current_layout: AbstractLayout
|
|
var layout_rows: Array[Array]
|
|
var is_configuring: bool = false
|
|
|
|
var layouts: Dictionary[String, AbstractLayout] = {
|
|
# LayoutANSI.name_static(): LayoutANSI.new(),
|
|
# LayoutANSIVariant.name_static(): LayoutANSIVariant.new(),
|
|
# LayoutISO.name_static(): LayoutISO.new(),
|
|
# LayoutJD40.name_static(): LayoutJD40.new(),
|
|
# LayoutPlanck.name_static(): LayoutPlanck.new(),
|
|
"ansi-104.json": LayoutKLE.new("res://scripts/layouts/kle/ansi-104.json"),
|
|
"ansi-104-big-enter.json":
|
|
LayoutKLE.new("res://scripts/layouts/kle/ansi-104-big-enter.json"),
|
|
}
|
|
|
|
|
|
func _ready() -> void:
|
|
var err := _load_config()
|
|
if err != OK:
|
|
print("layout config not loaded.....")
|
|
_set_defaults()
|
|
is_configuring = true
|
|
# _set_defaults()
|
|
|
|
|
|
func _unhandled_input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("save_config"):
|
|
_save_config()
|
|
print("layout config saved!")
|
|
|
|
|
|
func get_config_file() -> ConfigFile:
|
|
var config := ConfigFile.new()
|
|
var err := config.load(CONFIG_PATH)
|
|
|
|
if err == ERR_FILE_NOT_FOUND:
|
|
return null
|
|
|
|
if err != OK:
|
|
printerr("failed to load layout config file: '%s'" % err)
|
|
return null
|
|
|
|
return config
|
|
|
|
|
|
func get_key_config_dict(
|
|
keycode: Key, config: ConfigFile
|
|
) -> Dictionary[String, Variant]:
|
|
var param_key := str(keycode)
|
|
if not config.has_section_key(SECTION_KEYS, param_key):
|
|
return {}
|
|
|
|
return config.get_value(SECTION_KEYS, param_key, {}) as Dictionary[String, Variant]
|
|
|
|
|
|
func swap_layout(layout_name: String) -> void:
|
|
if layouts.has(layout_name):
|
|
_set_layout(layouts[layout_name])
|
|
layout_swapped.emit(current_layout)
|
|
else:
|
|
printerr("no such layout! ", layout_name)
|
|
|
|
|
|
func _set_defaults() -> void:
|
|
print("setting defaults")
|
|
_set_layout(layouts.values()[0] as AbstractLayout)
|
|
# _set_layout(layouts[LayoutANSI.name_static()])
|
|
|
|
|
|
func _set_layout(layout: AbstractLayout) -> void:
|
|
print("SETTING LAYOUT: '%s'" % layout.name())
|
|
current_layout = layout
|
|
|
|
layout_rows = []
|
|
for dict_row: Array[Dictionary] in current_layout.rows():
|
|
var row: Array[KeyProps] = []
|
|
for props_dict: Dictionary in dict_row:
|
|
row.append(KeyProps.new().from_dict(props_dict))
|
|
layout_rows.append(row)
|
|
|
|
|
|
func _load_config() -> Error:
|
|
print("loading layout config....")
|
|
var config := ConfigFile.new()
|
|
var err := config.load(CONFIG_PATH)
|
|
|
|
if err == ERR_FILE_NOT_FOUND:
|
|
print("layout config file not found")
|
|
return FAILED
|
|
|
|
if err != OK:
|
|
printerr("failed to load layout config file: '%s'" % err)
|
|
return FAILED
|
|
|
|
if config.has_section_key(SECTION_INFO, PARAM_NAME):
|
|
var layout_name := config.get_value(SECTION_INFO, PARAM_NAME, "") as String
|
|
if layouts.has(layout_name):
|
|
_set_layout(layouts[layout_name])
|
|
else:
|
|
printerr("layout '%s' not found" % layout_name)
|
|
_set_defaults()
|
|
else:
|
|
printerr("layout config is missing '%s/%s'" % [SECTION_INFO, PARAM_NAME])
|
|
_set_defaults()
|
|
|
|
for row: Array[KeyProps] in layout_rows:
|
|
for key_props in row:
|
|
var param_key := str(key_props.physical_keycode)
|
|
if (
|
|
not key_props.is_char()
|
|
or not config.has_section_key(SECTION_KEYS, param_key)
|
|
):
|
|
continue
|
|
|
|
var dictionary := (
|
|
config.get_value(SECTION_KEYS, param_key, {}) as Dictionary
|
|
)
|
|
key_props.chars_from_dict(dictionary)
|
|
|
|
print("layout config loaded!")
|
|
|
|
return OK
|
|
|
|
|
|
func _save_config() -> Error:
|
|
var config := ConfigFile.new()
|
|
|
|
config.set_value(SECTION_INFO, PARAM_NAME, current_layout.name())
|
|
|
|
for row: Array[KeyProps] in layout_rows:
|
|
for key_props in row:
|
|
if not key_props.is_char():
|
|
continue
|
|
|
|
config.set_value(
|
|
SECTION_KEYS, str(key_props.physical_keycode), key_props.chars_to_dict()
|
|
)
|
|
|
|
var err := config.save(CONFIG_PATH)
|
|
|
|
if err != OK:
|
|
printerr("failed to save config file: '%s'" % err)
|
|
return err
|
|
|
|
return OK
|