From ccb6478ae7d2044994d63960cb92cdfb62b25e20 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Tue, 23 Jan 2024 17:48:13 +0100 Subject: [PATCH] make tabs modular --- content/ui/components/button/button.gd | 11 +++- content/ui/components/tabs/tabs.gd | 27 ++++++++ content/ui/components/tabs/tabs.tscn | 6 ++ content/ui/components/tabs/tabs_content.gd | 20 ++++++ content/ui/components/tabs/tabs_content.tscn | 6 ++ content/ui/menu/menu.gd | 68 -------------------- content/ui/menu/menu.tscn | 35 ++++++---- content/ui/menu/room/room_menu.tscn | 8 +++ content/ui/menu/settings/settings_menu.tscn | 8 +-- lib/globals/save_system.gd | 8 +-- lib/utils/proxy.gd | 9 ++- lib/utils/proxy_group.gd | 19 ++++++ 12 files changed, 134 insertions(+), 91 deletions(-) create mode 100644 content/ui/components/tabs/tabs.gd create mode 100644 content/ui/components/tabs/tabs.tscn create mode 100644 content/ui/components/tabs/tabs_content.gd create mode 100644 content/ui/components/tabs/tabs_content.tscn create mode 100644 lib/utils/proxy_group.gd diff --git a/content/ui/components/button/button.gd b/content/ui/components/button/button.gd index 5dbfad1..54efe1d 100644 --- a/content/ui/components/button/button.gd +++ b/content/ui/components/button/button.gd @@ -50,7 +50,16 @@ const IconFont = preload("res://assets/icons/icons.tres") @export var toggleable: bool = false @export var disabled: bool = false @export var initial_active: bool = false -var external_value: Proxy = null +var external_value: Proxy = null: + set(value): + print("set external value", value) + external_value = value + if value != null: + value.on_set.connect(func(_value): + print("external value changed", _value) + update_animation() + ) + var active: bool = false: get: if external_value != null: diff --git a/content/ui/components/tabs/tabs.gd b/content/ui/components/tabs/tabs.gd new file mode 100644 index 0000000..f5172ce --- /dev/null +++ b/content/ui/components/tabs/tabs.gd @@ -0,0 +1,27 @@ +extends Node3D +class_name Tabs3D + +signal on_select(selected: int) + +var selected: Node3D +@export var initial_selected: Node3D +var proxy_group = ProxyGroup.new() + +func _ready(): + if initial_selected != null: + selected = initial_selected + on_select.emit(selected.get_index()) + + for option in get_children(): + if option is Button3D == false: + continue + + var proxy = proxy_group.proxy(func(): + return selected == option + , func(value: bool): + if value == true: + selected = option + on_select.emit(selected.get_index()) + ) + + option.external_value = proxy diff --git a/content/ui/components/tabs/tabs.tscn b/content/ui/components/tabs/tabs.tscn new file mode 100644 index 0000000..7adbee7 --- /dev/null +++ b/content/ui/components/tabs/tabs.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://doavdm6fskmrt"] + +[ext_resource type="Script" path="res://content/ui/components/tabs/tabs.gd" id="1_xt6wm"] + +[node name="Tabs" type="Node3D"] +script = ExtResource("1_xt6wm") diff --git a/content/ui/components/tabs/tabs_content.gd b/content/ui/components/tabs/tabs_content.gd new file mode 100644 index 0000000..734ff29 --- /dev/null +++ b/content/ui/components/tabs/tabs_content.gd @@ -0,0 +1,20 @@ +extends Node3D +class_name TabsContent3D + +@export var tabs: Tabs3D + +var children: Array = [] + +func _ready(): + children = get_children() + + for child in children: + child.visible = true + remove_child(child) + + tabs.on_select.connect(func(index): + for child in get_children(): + remove_child(child) + + add_child(children[index]) + ) diff --git a/content/ui/components/tabs/tabs_content.tscn b/content/ui/components/tabs/tabs_content.tscn new file mode 100644 index 0000000..48c8307 --- /dev/null +++ b/content/ui/components/tabs/tabs_content.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://wewhef3qmulp"] + +[ext_resource type="Script" path="res://content/ui/components/tabs/tabs_content.gd" id="1_ljgkj"] + +[node name="TabsContent" type="Node3D"] +script = ExtResource("1_ljgkj") diff --git a/content/ui/menu/menu.gd b/content/ui/menu/menu.gd index e9a5a38..6af6f86 100644 --- a/content/ui/menu/menu.gd +++ b/content/ui/menu/menu.gd @@ -3,16 +3,6 @@ extends Node3D const Proxy = preload("res://lib/utils/proxy.gd") const Notification = preload("res://content/ui/components/notification/notification.tscn") -@onready var nav_view = $AnimationContainer/Navigation/View -@onready var nav_edit: Button3D = $AnimationContainer/Navigation/Edit -@onready var nav_room = $AnimationContainer/Navigation/Room -@onready var nav_automate = $AnimationContainer/Navigation/Automate -@onready var nav_settings = $AnimationContainer/Navigation/Settings -@onready var menu_view: Node3D = $AnimationContainer/Content/ViewMenu -@onready var menu_edit: Node3D = $AnimationContainer/Content/EditMenu -@onready var menu_room: Node3D = $AnimationContainer/Content/RoomMenu -@onready var menu_settings: Node3D = $AnimationContainer/Content/SettingsMenu - @onready var menu_root = $AnimationContainer @onready var content = $AnimationContainer/Content @onready var nav = $AnimationContainer/Navigation @@ -42,61 +32,3 @@ func _ready(): notify_place.add_child(notification_node) ) - - var nav_buttons = [ - nav_view, - nav_edit, - nav_room, - nav_automate, - nav_settings - ] - - for nav_button in nav_buttons: - var getter = func(): - return nav_button == selected_nav - - var setter = func(value): - if value: - select_menu(nav_button) - - nav_button.external_value = Proxy.new(getter, setter) - - select_menu(nav_edit) - -func select_menu(nav): - if _is_valid_nav(nav) == false || selected_nav == nav: - return - - for child in content.get_children(): - content.remove_child(child) - - var old_nav = selected_nav - - selected_nav = nav - - if old_nav != null: - old_nav.update_animation() - - if selected_nav != null: - selected_nav.update_animation() - var menu = _nav_to_menu(selected_nav) - if menu != null: - content.add_child(menu) - menu.visible = true - -func _is_valid_nav(nav): - return nav == nav_view || nav == nav_edit || nav == nav_room || nav == nav_automate || nav == nav_settings - -func _nav_to_menu(nav): - match nav: - nav_view: - return menu_view - nav_edit: - return menu_edit - nav_room: - return menu_room - nav_automate: - return null - nav_settings: - return menu_settings - return null diff --git a/content/ui/menu/menu.tscn b/content/ui/menu/menu.tscn index 827c911..a8acc5a 100644 --- a/content/ui/menu/menu.tscn +++ b/content/ui/menu/menu.tscn @@ -1,10 +1,12 @@ -[gd_scene load_steps=17 format=3 uid="uid://c3kdssrmv84kv"] +[gd_scene load_steps=19 format=3 uid="uid://c3kdssrmv84kv"] [ext_resource type="Script" path="res://content/ui/menu/menu.gd" id="1_ng4u3"] [ext_resource type="Material" uid="uid://bnwimm214q67g" path="res://assets/materials/sec-500.material" id="2_0x5at"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="2_8coxu"] +[ext_resource type="Script" path="res://content/ui/components/tabs/tabs.gd" id="4_eavfx"] [ext_resource type="PackedScene" uid="uid://crrb0l3ekuotj" path="res://content/ui/menu/edit/edit_menu.tscn" id="4_r2raj"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="5_w4i01"] +[ext_resource type="Script" path="res://content/ui/components/tabs/tabs_content.gd" id="6_7rntr"] [ext_resource type="ArrayMesh" uid="uid://cbqhhnknyium2" path="res://assets/immersive_home_panels/immersive_home_panels.obj" id="7_f4u4o"] [ext_resource type="PackedScene" uid="uid://ddpxthb414unp" path="res://content/ui/menu/view/view_menu.tscn" id="8_71pkg"] [ext_resource type="PackedScene" uid="uid://c01gkeldvjwtr" path="res://content/ui/menu/room/room_menu.tscn" id="10_u4i1x"] @@ -182,51 +184,58 @@ skeleton = NodePath("../..") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.21, 0, 0.15) shape = SubResource("ConvexPolygonShape3D_mgnm0") -[node name="Navigation" type="Node3D" parent="AnimationContainer"] +[node name="Tabs" type="Node3D" parent="AnimationContainer" node_paths=PackedStringArray("initial_selected")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0, 0) +script = ExtResource("4_eavfx") +initial_selected = NodePath("View") -[node name="View" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +[node name="View" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.03) label = "visibility" icon = true toggleable = true -[node name="Edit" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +[node name="Edit" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.09) label = "widgets" icon = true toggleable = true -[node name="Room" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +[node name="Room" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.15) label = "view_in_ar" icon = true toggleable = true -[node name="Automate" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +[node name="Automate" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.21) label = "schema" icon = true toggleable = true -[node name="Settings" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +[node name="Settings" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.27) label = "settings" icon = true toggleable = true -[node name="Content" type="Node3D" parent="AnimationContainer"] +[node name="TabsContent" type="Node3D" parent="AnimationContainer" node_paths=PackedStringArray("tabs")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0, 0) +script = ExtResource("6_7rntr") +tabs = NodePath("../Tabs") -[node name="EditMenu" parent="AnimationContainer/Content" instance=ExtResource("4_r2raj")] - -[node name="RoomMenu" parent="AnimationContainer/Content" instance=ExtResource("10_u4i1x")] +[node name="ViewMenu" parent="AnimationContainer/TabsContent" instance=ExtResource("8_71pkg")] visible = false -[node name="SettingsMenu" parent="AnimationContainer/Content" instance=ExtResource("11_7wm6b")] +[node name="EditMenu" parent="AnimationContainer/TabsContent" instance=ExtResource("4_r2raj")] + +[node name="RoomMenu" parent="AnimationContainer/TabsContent" instance=ExtResource("10_u4i1x")] visible = false -[node name="ViewMenu" parent="AnimationContainer/Content" instance=ExtResource("8_71pkg")] +[node name="AutomateMenu" type="Node3D" parent="AnimationContainer/TabsContent"] +visible = false + +[node name="SettingsMenu" parent="AnimationContainer/TabsContent" instance=ExtResource("11_7wm6b")] visible = false [node name="NotifyPlace" type="Marker3D" parent="AnimationContainer"] diff --git a/content/ui/menu/room/room_menu.tscn b/content/ui/menu/room/room_menu.tscn index 1fb43d7..72cad75 100644 --- a/content/ui/menu/room/room_menu.tscn +++ b/content/ui/menu/room/room_menu.tscn @@ -29,3 +29,11 @@ icon = true [node name="Input" parent="Interface" instance=ExtResource("4_pbj71")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.12, 0.005, 0.27) text = "New Room 1" + +[node name="Button2" parent="." instance=ExtResource("4_cghmp")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0, 0) +label = "Overview" + +[node name="Button" parent="." instance=ExtResource("4_cghmp")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.09, 0, 0) +label = "Rooms" diff --git a/content/ui/menu/settings/settings_menu.tscn b/content/ui/menu/settings/settings_menu.tscn index 195e69c..dcfa1ee 100644 --- a/content/ui/menu/settings/settings_menu.tscn +++ b/content/ui/menu/settings/settings_menu.tscn @@ -23,14 +23,14 @@ mesh = SubResource("BoxMesh_e51x8") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.007, 0) [node name="Label3D" type="Label3D" parent="Content"] -transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.134377, 0, 0.253575) +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.124377, 0, 0.263575) pixel_size = 0.001 text = "Spawn Ball" font_size = 18 outline_size = 0 [node name="Button" parent="Content" instance=ExtResource("1_faxng")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0458097, 0, 0.253575) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0358097, 0, 0.263575) label = "sports_basketball" icon = true @@ -109,11 +109,11 @@ outline_size = 0 script = ExtResource("3_qmg6q") [node name="Save" parent="Content" instance=ExtResource("1_faxng")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04, 0, 0.17) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0, 0.12) label = "save" icon = true [node name="ClearSave" parent="Content" instance=ExtResource("1_faxng")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1, 0, 0.17) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.09, 0, 0.12) label = "close" icon = true diff --git a/lib/globals/save_system.gd b/lib/globals/save_system.gd index c7b03a5..46beaa4 100644 --- a/lib/globals/save_system.gd +++ b/lib/globals/save_system.gd @@ -49,15 +49,15 @@ func load(): var json_text = save_file.get_line() var save_data = JSON.parse_string(json_text) + if save_data.has("version") == false: + save() + return + var save_tree = save_data["tree"] if save_tree == null: return - if save_tree.has("version") == false: - save() - return - if save_tree is Array: for tree in save_tree: _build_save_tree(tree) diff --git a/lib/utils/proxy.gd b/lib/utils/proxy.gd index 376db93..e42aefe 100644 --- a/lib/utils/proxy.gd +++ b/lib/utils/proxy.gd @@ -1,4 +1,7 @@ extends RefCounted +class_name Proxy + +signal on_set(new_value: Variant) var gettable: Callable var settable: Callable @@ -7,8 +10,12 @@ func _init(gettable: Callable, settable: Callable): self.gettable = gettable self.settable = settable + + var value: Variant: get: return gettable.call() set(new_value): - settable.call(new_value) \ No newline at end of file + settable.call(new_value) + on_set.emit(new_value) + diff --git a/lib/utils/proxy_group.gd b/lib/utils/proxy_group.gd new file mode 100644 index 0000000..0cd956e --- /dev/null +++ b/lib/utils/proxy_group.gd @@ -0,0 +1,19 @@ +extends RefCounted +class_name ProxyGroup + +var proxies = [] + +func proxy(_get: Callable, _set: Callable): + var _proxy + _proxy = Proxy.new(_get, func(value): + _set.call(value) + + for p in proxies: + if p != _proxy: + p.on_set.emit(value) + ) + + proxies.append(_proxy) + + return _proxy + \ No newline at end of file