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()
|