keebie/scripts/layouts/layout_custom.gd

84 lines
1.8 KiB
GDScript

class_name LayoutCustom extends AbstractLayout
var failed: bool
var _name: String
var _rows: Array[Array]
var _file_name: String
var _has_errors: bool
func _init(path: String) -> void:
_file_name = path.get_file()
_name = _file_name
var data: Variant = _load_json_file(path)
if not data:
failed = true
printerr("%s: COULD NOT PARSE CUSTOM LAYOUT JSON" % _file_name)
print()
return
var layout_rows := _deserialize(data, _file_name)
if not layout_rows:
failed = true
printerr("%s: COULD NOT DESERIALIZE CUSTOM LAYOUT" % _file_name)
print()
return
if _has_errors:
print()
_rows = layout_rows
func get_name() -> String:
return _name
func get_rows() -> Array[Array]:
return _rows
func _load_json_file(path: String) -> Variant:
var file := FileAccess.open(path, FileAccess.READ)
if not file:
var file_err := FileAccess.get_open_error()
if file_err == ERR_FILE_NOT_FOUND:
printerr("%s: file not found" % _file_name)
else:
printerr("%s: error opening file: %s" % [_file_name, file_err])
return []
var content := file.get_as_text()
var json := JSON.new()
var err := json.parse(content)
if err != OK:
printerr(
(
"%s: json parse error at line %s: %s"
% [_file_name, json.get_error_line(), json.get_error_message()]
)
)
return []
var data: Variant = json.data
return data
func _deserialize(data: Variant, path: String) -> Array[Array]:
var parser: AbstractParser
if data is Array:
parser = ParserKLE.new(data as Array, path)
elif data is Dictionary:
parser = ParserQMK.new(data as Dictionary, path)
else:
printerr(
"%s: top-level json item is neither an array nor a dictionary" % _file_name
)
return []
if parser.get_name() != "":
_name = parser.get_name()
_has_errors = parser.has_errors()
return parser.get_rows()