extends Control

const OVERLAY_PROPERTIES = {
	"has_touch": true,
}

export var key_size := 120
export var key_row : PackedScene
export var key_button : PackedScene
export var row_container_path : NodePath

var row_container

var keymap := {}
var toggle_keys := []

func _ready():
	row_container = get_node(row_container_path)
	load_keys("res://overlay_resources/keyboard/layouts/layout_se.json")


func load_keys(fp: String):
	var file = File.new()
	file.open(fp, File.READ)
	keymap = parse_json(file.get_as_text())
	file.close()
	
	apply_keys()


func apply_keys():
	for row in keymap.rows:
		var row_box = key_row.instance()
		row_container.add_child(row_box)
		for key in row.keys:
			var btn = key_button.instance()
			
			if not key.has("display"):
				key.display = key.keycode
			btn.get_node("Label").text = key.display
			btn.name = key.keycode
			
			btn.rect_min_size.x = key_size
			btn.rect_min_size.y = key_size
			if key.has("width"):
				btn.rect_min_size.x *= key.width
			
			if key.has("toggle") and key.toggle:
				btn.toggle_mode = true
				btn.connect("toggled", self, "key_toggled", [key.keycode])
				toggle_keys.append(btn)
			else:
				btn.connect("button_down", self, "key_down", [key.keycode])
				btn.connect("button_up", self, "key_up", [key.keycode])
				
			row_box.add_child(btn)
			
			# horizontal gaps
			if key.has("gap"):
				var gapbox = Control.new()
				gapbox.rect_min_size.x = key.gap * key_size
				gapbox.name = "Gap"
				row_box.add_child(gapbox)

		# vertical gaps
		if row.has("gap") and row.gap > 0:
			var gapbox = Control.new()
			gapbox.rect_min_size.y = row.gap * key_size
			gapbox.name = "Gap"
			row_container.add_child(gapbox)


func key_toggled(state, code):
	if state:
		GDVK.key_down(code)
	else:
		GDVK.key_up(code)


func key_down(code):
	GDVK.key_down(code)


func key_up(code):
	GDVK.key_up(code)
	# clear all modifier keys
	for k in toggle_keys:
		if k.pressed:
			k.pressed = false
	
