keebie/scripts/layouts/layout_custom.gd

73 lines
1.5 KiB
GDScript

class_name LayoutCustom extends AbstractLayout
var has_errors: bool = false
var _name: String
var _rows: Array[Array]
var _file_name: String
func _init(path: String) -> void:
_file_name = path.get_file()
_name = _file_name
var data: Variant = _load_json_file(path)
if not data:
has_errors = true
printerr("ERROR LOADING KLE LAYOUT JSON: '%s'" % _file_name)
return
var layout_rows := _deserialize(data, _file_name)
if not layout_rows:
has_errors = true
printerr("ERROR DESERIALIZING KLE LAYOUT: '%s'" % _file_name)
return
_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("file not found '%s'" % _file_name)
else:
printerr("error opening file '%s': %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(
(
"json parse error in '%s' 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)
else:
return []
if parser.get_name() != "":
_name = parser.get_name()
return parser.get_rows()