From 6eef2c781c588b7f9baafaf1b06279fca311a043 Mon Sep 17 00:00:00 2001 From: 2ndbeam <166764593+2ndbeam@users.noreply.github.com> Date: Sat, 18 May 2024 12:37:36 +0300 Subject: [PATCH] Fully working menu system --- menus/Base Menu/test_menu_1.tres | 19 +++++++++++++++++++ menus/Base Menu/test_menu_2.tres | 19 +++++++++++++++++++ scenes/Base/base_menu.tscn | 4 +++- scripts/Base/Menu/test.gd | 4 ++++ scripts/Base/actions_menu.gd | 20 +++++++++++++------- scripts/Base/menu_action.gd | 12 ++++++++++++ scripts/Classes/{ => Menu}/menu.gd | 2 +- scripts/Classes/Menu/menu_menu_resource.gd | 8 ++++++++ scripts/Classes/Menu/menu_resource.gd | 3 +++ scripts/Classes/Menu/script_menu_resource.gd | 8 ++++++++ scripts/Classes/{ => Menu}/transit_button.gd | 3 +++ 11 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 menus/Base Menu/test_menu_1.tres create mode 100644 menus/Base Menu/test_menu_2.tres create mode 100644 scripts/Base/Menu/test.gd create mode 100644 scripts/Base/menu_action.gd rename scripts/Classes/{ => Menu}/menu.gd (94%) create mode 100644 scripts/Classes/Menu/menu_menu_resource.gd create mode 100644 scripts/Classes/Menu/menu_resource.gd create mode 100644 scripts/Classes/Menu/script_menu_resource.gd rename scripts/Classes/{ => Menu}/transit_button.gd (77%) diff --git a/menus/Base Menu/test_menu_1.tres b/menus/Base Menu/test_menu_1.tres new file mode 100644 index 0000000..1a432ec --- /dev/null +++ b/menus/Base Menu/test_menu_1.tres @@ -0,0 +1,19 @@ +[gd_resource type="Resource" script_class="Menu" load_steps=6 format=3 uid="uid://c4jg3vwtxskjm"] + +[ext_resource type="Script" path="res://scripts/Classes/Menu/menu_menu_resource.gd" id="1_idjuj"] +[ext_resource type="Script" path="res://scripts/Classes/Menu/script_menu_resource.gd" id="3_6o5so"] +[ext_resource type="Script" path="res://scripts/Classes/Menu/menu.gd" id="3_ow6va"] + +[sub_resource type="Resource" id="Resource_jjcgb"] +script = ExtResource("1_idjuj") +item = &"res://menus/Base Menu/test_menu_2.tres" + +[sub_resource type="Resource" id="Resource_b58fs"] +script = ExtResource("3_6o5so") +item = &"res://scripts/Base/Menu/test.gd" + +[resource] +script = ExtResource("3_ow6va") +item_ids = Array[String](["BASE_TEST_TRANSIT", "BASE_TEST_BLANK", "BASE_TEST_BLANK", "BASE_TEST_BLANK", "BASE_TEST_BUTTON", "BASE_TEST_BLANK", "BASE_TEST_BLANK", "BASE_TEST_BLANK"]) +item_actions = Array[int]([0, 3, 3, 3, 1, 3, 3, 3]) +item_data = Array[Resource("res://scripts/Classes/Menu/menu_resource.gd")]([SubResource("Resource_jjcgb"), null, null, null, SubResource("Resource_b58fs"), null, null, null]) diff --git a/menus/Base Menu/test_menu_2.tres b/menus/Base Menu/test_menu_2.tres new file mode 100644 index 0000000..05e61d3 --- /dev/null +++ b/menus/Base Menu/test_menu_2.tres @@ -0,0 +1,19 @@ +[gd_resource type="Resource" script_class="Menu" load_steps=6 format=3 uid="uid://d085ddwle8ald"] + +[ext_resource type="Script" path="res://scripts/Classes/Menu/script_menu_resource.gd" id="2_vxx6s"] +[ext_resource type="Script" path="res://scripts/Classes/Menu/menu.gd" id="3_frt6d"] +[ext_resource type="Script" path="res://scripts/Classes/Menu/menu_menu_resource.gd" id="3_jtkie"] + +[sub_resource type="Resource" id="Resource_dbknc"] +script = ExtResource("2_vxx6s") +item = &"res://scripts/Base/Menu/test.gd" + +[sub_resource type="Resource" id="Resource_rxr54"] +script = ExtResource("3_jtkie") +item = &"res://menus/Base Menu/test_menu_1.tres" + +[resource] +script = ExtResource("3_frt6d") +item_ids = Array[String](["BASE_TEST_BLANK", "BASE_TEST_BUTTON", "BASE_TEST_BLANK", "BASE_TEST_BLANK", "BASE_TEST_BLANK", "BASE_TEST_TRANSIT", "BASE_TEST_BLANK", "BASE_TEST_BLANK"]) +item_actions = Array[int]([3, 1, 3, 3, 3, 0, 3, 3]) +item_data = Array[Resource("res://scripts/Classes/Menu/menu_resource.gd")]([null, SubResource("Resource_dbknc"), null, null, null, SubResource("Resource_rxr54"), null, null]) diff --git a/scenes/Base/base_menu.tscn b/scenes/Base/base_menu.tscn index 4c99268..df5aa77 100644 --- a/scenes/Base/base_menu.tscn +++ b/scenes/Base/base_menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=3 uid="uid://crq284yed2if5"] +[gd_scene load_steps=8 format=3 uid="uid://crq284yed2if5"] [ext_resource type="Script" path="res://scripts/Base/base_menu.gd" id="1_3hgu4"] [ext_resource type="Theme" uid="uid://dmb8bcdghdjd" path="res://main_theme.tres" id="1_p1gsn"] @@ -6,6 +6,7 @@ [ext_resource type="Texture2D" uid="uid://hxrx87gda3uf" path="res://sprites/Bases/Menu/end_communications.png" id="2_ceeiv"] [ext_resource type="Script" path="res://scripts/Base/actions_menu.gd" id="4_3gtyd"] [ext_resource type="Script" path="res://scripts/Base/close_button.gd" id="4_68ool"] +[ext_resource type="Resource" uid="uid://c4jg3vwtxskjm" path="res://menus/Base Menu/test_menu_1.tres" id="5_rkret"] [node name="BaseMenu" type="Control"] layout_mode = 3 @@ -113,6 +114,7 @@ grow_horizontal = 2 grow_vertical = 2 columns = 2 script = ExtResource("4_3gtyd") +menu = ExtResource("5_rkret") metadata/_edit_use_anchors_ = true [node name="Action1" type="Button" parent="MenuBackground/ActionsBackground/ActionsMenu"] diff --git a/scripts/Base/Menu/test.gd b/scripts/Base/Menu/test.gd new file mode 100644 index 0000000..e2e58a9 --- /dev/null +++ b/scripts/Base/Menu/test.gd @@ -0,0 +1,4 @@ +extends MenuAction + +func action(): + print("works") diff --git a/scripts/Base/actions_menu.gd b/scripts/Base/actions_menu.gd index 8eedf66..bb439d5 100644 --- a/scripts/Base/actions_menu.gd +++ b/scripts/Base/actions_menu.gd @@ -11,27 +11,33 @@ extends Node $Action8 ] -@export var menu: Menu +const TRANSIT_BUTTON_SCRIPT = preload("res://scripts/Classes/Menu/transit_button.gd") + +@export var menu: Menu = null func _ready(): load_menu() ## Called when menu is changed func load_menu(): + # iterating through all actions for i in range(len(menu.item_ids)): if actions[i] is TransitButton: actions[i].button_up.disconnect(transit_menu) + elif actions[i] is MenuAction: + actions[i].button_up.disconnect(actions[i].action) + actions[i].set_script(null) + actions[i].text = menu.item_ids[i] match menu.item_actions[i]: Menu.Action.TransitAction: - actions[i].set_script("res://scripts/Classes/transit_button.gd") - actions[i].text = menu.item_ids[i] + actions[i].set_script(TRANSIT_BUTTON_SCRIPT) + actions[i].id = i Menu.Action.ButtonAction: - actions[i].set_script(menu.item_data[i]) - actions[i].text = menu.item_ids[i] + actions[i].set_script(menu.item_data[i].load()) ## Called with transit_button, changes current menu func transit_menu(id: int): - assert(id < len(menu.item_ids) and id > 0) - var new_menu = menu.item_data[id].duplicate() + assert(id < len(menu.item_ids) and id >= 0) + var new_menu = menu.item_data[id].load().duplicate() menu = new_menu load_menu() diff --git a/scripts/Base/menu_action.gd b/scripts/Base/menu_action.gd new file mode 100644 index 0000000..31e13dc --- /dev/null +++ b/scripts/Base/menu_action.gd @@ -0,0 +1,12 @@ +extends Button + +class_name MenuAction + +func _init(): + get_tree().create_timer(0.05).timeout.connect(_ready) + +func _ready(): + button_up.connect(action) + +func action(): + pass diff --git a/scripts/Classes/menu.gd b/scripts/Classes/Menu/menu.gd similarity index 94% rename from scripts/Classes/menu.gd rename to scripts/Classes/Menu/menu.gd index 8c75cb4..610b7d3 100644 --- a/scripts/Classes/menu.gd +++ b/scripts/Classes/Menu/menu.gd @@ -21,4 +21,4 @@ enum Action { ## Action type. Should have same size as item_ids @export var item_actions: Array[Action] ## Should have same size as other arrays -@export var item_data: Array +@export var item_data: Array[MenuResource] diff --git a/scripts/Classes/Menu/menu_menu_resource.gd b/scripts/Classes/Menu/menu_menu_resource.gd new file mode 100644 index 0000000..c7bf5a3 --- /dev/null +++ b/scripts/Classes/Menu/menu_menu_resource.gd @@ -0,0 +1,8 @@ +extends MenuResource + +class_name MenuMenuResource + +@export var item: StringName + +func load() -> Menu: + return ResourceLoader.load(item) diff --git a/scripts/Classes/Menu/menu_resource.gd b/scripts/Classes/Menu/menu_resource.gd new file mode 100644 index 0000000..c29df19 --- /dev/null +++ b/scripts/Classes/Menu/menu_resource.gd @@ -0,0 +1,3 @@ +extends Resource + +class_name MenuResource diff --git a/scripts/Classes/Menu/script_menu_resource.gd b/scripts/Classes/Menu/script_menu_resource.gd new file mode 100644 index 0000000..a0d284f --- /dev/null +++ b/scripts/Classes/Menu/script_menu_resource.gd @@ -0,0 +1,8 @@ +extends MenuResource + +class_name ScriptMenuResource + +@export var item: StringName + +func load() -> GDScript: + return ResourceLoader.load(item) diff --git a/scripts/Classes/transit_button.gd b/scripts/Classes/Menu/transit_button.gd similarity index 77% rename from scripts/Classes/transit_button.gd rename to scripts/Classes/Menu/transit_button.gd index 9653dca..77a225c 100644 --- a/scripts/Classes/transit_button.gd +++ b/scripts/Classes/Menu/transit_button.gd @@ -6,5 +6,8 @@ class_name TransitButton ## This is used when button_up is activated var id: int = -1 +func _init(): + get_tree().create_timer(0.05).timeout.connect(_ready) + func _ready(): button_up.connect(get_parent().transit_menu.bind(id))