81 lines
1.7 KiB
GDScript
81 lines
1.7 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
|
|
push_error("%s: COULD NOT PARSE CUSTOM LAYOUT JSON" % _file_name)
|
|
print()
|
|
return
|
|
|
|
var layout_rows := _deserialize(data, _file_name)
|
|
if not layout_rows:
|
|
failed = true
|
|
push_error("%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_key_dict_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()
|
|
push_error("%s: error opening file: %s" % [_file_name, error_string(file_err)])
|
|
return []
|
|
|
|
var content := file.get_as_text()
|
|
var json := JSON.new()
|
|
var err := json.parse(content)
|
|
if err:
|
|
push_error(
|
|
(
|
|
"%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:
|
|
push_error(
|
|
"%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()
|