diff options
Diffstat (limited to 'client/menu/menu.gd')
-rw-r--r-- | client/menu/menu.gd | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/client/menu/menu.gd b/client/menu/menu.gd new file mode 100644 index 00000000..a911ca83 --- /dev/null +++ b/client/menu/menu.gd @@ -0,0 +1,89 @@ +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): + 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() |