aboutsummaryrefslogtreecommitdiff
path: root/client/menu/menu.gd
blob: 5e7ba34c116b581f65a5b52c236a356da6a0763c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
class_name Menu
extends Control


#enum Anim { NONE, FADE }
#@export var animation: Anim = Anim.NONE
@export var support_anim := true
@export var auto_anim := true

signal submenu_close()

const transition_scene = preload("res://menu/scene_transition.tscn")
var transition: SceneTransition
var parent_menu: Menu = null

func _ready():
	focus_first_button(self)
	connect_button_sounds(self)
	update_parent_menu(self.get_parent())
	if support_anim: anim_setup()
	if auto_anim: menu_anim_open()

func anim_setup():
	transition = transition_scene.instantiate()
	add_child(transition)
func menu_anim_open():
	print("open ", transition)
	if transition != null: await transition.fade_in()
func menu_anim_exit():
	print("exit ", transition)
	if transition != null: await transition.fade_out()
func menu_anim_cover(state: bool):
	pass

var popup: Menu = null
func submenu(path: String, instant: bool = false):
	if popup != null: return
	await menu_anim_cover(true)
	popup = load(path).instantiate()
	if instant: popup.support_anim = false
	add_child(popup)
	print("Submenu opened ", path)
	await submenu_close
	print("Submenu closed ", path)
	await menu_anim_cover(false)

func exit():
	await self.menu_anim_exit()
	get_parent().submenu_close.emit()
	queue_free()

func quit():
	await exit()
	get_parent().quit()

func replace_menu(path: String):
	print("Replace menu: ", path)
	if popup != null: await popup.exit()
	await menu_anim_exit()
	get_parent().add_child(load(path).instantiate())
	queue_free()

var focus_auto_changed := false
func focus_first_button(node: Node) -> bool:
	focus_auto_changed = true
	if node is Button:
		node.grab_focus()
		print("Node %s (%s) was selected for focus" % [node.name, node])
		return true
	for c in node.get_children():
		if focus_first_button(c):
			return true
	return false

func connect_button_sounds(node: Node):
	if node is Button:
		node.pressed.connect(Sound.play_click)
	if node is Button or node is LineEdit or node is Slider:
		node.mouse_entered.connect(Sound.play_hover)
	for c in node.get_children():
		connect_button_sounds(c)

func update_parent_menu(node: Node):
	if node is Menu: parent_menu = node
	elif node.get_parent() != null: update_parent_menu(node.get_parent())

#func _input(_event):
	#if Input.is_action_just_pressed("ui_cancel"):
		#Sound.play_click()
		#exit()