Add some UI

This commit is contained in:
2026-06-11 20:42:08 -05:00
parent 456ea1e07e
commit f46f08c083
29 changed files with 678 additions and 88 deletions
+52
View File
@@ -0,0 +1,52 @@
class_name GameMenu extends Control
enum Tab { PARTY, ITEMS }
@export var SIDEBAR:ItemList
@export var PARTY_TAB:GameMenuPartyTab
@export var ITEMS_TAB:GameMenuItemsTab
var _currentTab:Tab = Tab.PARTY
func _ready() -> void:
visible = false
SIDEBAR.item_selected.connect(_onTabSelected)
func open() -> void:
visible = true
_selectTab(_currentTab)
SIDEBAR.select(_currentTab)
SIDEBAR.grab_focus()
func close() -> void:
visible = false
func isOpen() -> bool:
return visible
func _onTabSelected(index:int) -> void:
_selectTab(index as Tab)
func _selectTab(tab:Tab) -> void:
_currentTab = tab
PARTY_TAB.visible = (tab == Tab.PARTY)
ITEMS_TAB.visible = (tab == Tab.ITEMS)
match tab:
Tab.PARTY:
PARTY_TAB.refresh()
Tab.ITEMS:
ITEMS_TAB.refresh()
func _unhandled_input(event:InputEvent) -> void:
if event.is_action_pressed("menu"):
if visible:
close()
elif !UI.dialogueActive && UI.TEXTBOX.isClosed:
open()
get_viewport().set_input_as_handled()
return
if !visible:
return
if event.is_action_pressed("ui_cancel"):
close()
get_viewport().set_input_as_handled()
+1
View File
@@ -0,0 +1 @@
uid://dvqu7spul754e
+76
View File
@@ -0,0 +1,76 @@
[gd_scene load_steps=5 format=3 uid="uid://bv5r2x9m4k7n1"]
[ext_resource type="Script" uid="uid://dn8p3y6a1s5t2" path="res://ui/gamemenu/GameMenu.gd" id="1_gmgd"]
[ext_resource type="PackedScene" uid="uid://br9c7x4t1n6q2" path="res://ui/gamemenu/GameMenuPartyTab.tscn" id="2_ptab"]
[ext_resource type="PackedScene" uid="uid://bq4m7v2k9d3c1" path="res://ui/gamemenu/GameMenuItemsTab.tscn" id="3_itab"]
[node name="GameMenu" type="Control" node_paths=PackedStringArray("SIDEBAR", "PARTY_TAB", "ITEMS_TAB")]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 0
script = ExtResource("1_gmgd")
SIDEBAR = NodePath("MarginContainer/HBoxContainer/SidebarPanel/VBoxContainer/Sidebar")
PARTY_TAB = NodePath("MarginContainer/HBoxContainer/ContentPanel/GameMenuPartyTab")
ITEMS_TAB = NodePath("MarginContainer/HBoxContainer/ContentPanel/GameMenuItemsTab")
[node name="ColorRect" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
color = Color(0, 0, 0, 0.75)
[node name="MarginContainer" type="MarginContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/margin_left = 16
theme_override_constants/margin_right = 16
theme_override_constants/margin_top = 12
theme_override_constants/margin_bottom = 12
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"]
layout_mode = 2
theme_override_constants/separation = 8
[node name="SidebarPanel" type="PanelContainer" parent="MarginContainer/HBoxContainer"]
layout_mode = 2
custom_minimum_size = Vector2(120, 0)
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer/SidebarPanel"]
layout_mode = 2
theme_override_constants/separation = 4
[node name="MenuTitle" type="Label" parent="MarginContainer/HBoxContainer/SidebarPanel/VBoxContainer"]
layout_mode = 2
horizontal_alignment = 1
text = "MENU"
[node name="Sidebar" type="ItemList" parent="MarginContainer/HBoxContainer/SidebarPanel/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
auto_width = true
item_count = 2
item_0/text = "Party"
item_1/text = "Items"
[node name="ContentPanel" type="PanelContainer" parent="MarginContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="GameMenuPartyTab" parent="MarginContainer/HBoxContainer/ContentPanel" instance=ExtResource("2_ptab")]
layout_mode = 2
[node name="GameMenuItemsTab" parent="MarginContainer/HBoxContainer/ContentPanel" instance=ExtResource("3_itab")]
layout_mode = 2
visible = false
+32
View File
@@ -0,0 +1,32 @@
class_name GameMenuItemsTab extends Control
func refresh() -> void:
var container = $ScrollContainer/ItemContainer
for child in container.get_children():
child.queue_free()
var items = PARTY.BACKPACK.items
if items.is_empty():
var empty = Label.new()
empty.text = "No items."
container.add_child(empty)
return
for stack in items:
container.add_child(_makeItemRow(stack))
func _makeItemRow(stack:ItemStack) -> Control:
var panel = PanelContainer.new()
var hbox = HBoxContainer.new()
panel.add_child(hbox)
var nameLabel = Label.new()
nameLabel.text = Item.getItemHandle(stack.item).capitalize()
nameLabel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
hbox.add_child(nameLabel)
var qtyLabel = Label.new()
qtyLabel.text = "x%d" % stack.quantity
hbox.add_child(qtyLabel)
return panel
+1
View File
@@ -0,0 +1 @@
uid://bmhnyuhkwti7i
+25
View File
@@ -0,0 +1,25 @@
[gd_scene load_steps=2 format=3 uid="uid://bq4m7v2k9d3c1"]
[ext_resource type="Script" uid="uid://cx6h2j9r4b8w5" path="res://ui/gamemenu/GameMenuItemsTab.gd" id="1_itabgd"]
[node name="GameMenuItemsTab" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_itabgd")
[node name="ScrollContainer" type="ScrollContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="ItemContainer" type="VBoxContainer" parent="ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 4
+68
View File
@@ -0,0 +1,68 @@
class_name GameMenuPartyTab extends Control
func refresh() -> void:
var list = $ScrollContainer/MemberList
for child in list.get_children():
child.queue_free()
for member in PARTY.getFullParty():
list.add_child(_makeMemberCard(member))
func _makeMemberCard(member:PartyMember) -> Control:
var panel = PanelContainer.new()
var margin = MarginContainer.new()
panel.add_child(margin)
margin.add_theme_constant_override("margin_left", 8)
margin.add_theme_constant_override("margin_right", 8)
margin.add_theme_constant_override("margin_top", 6)
margin.add_theme_constant_override("margin_bottom", 6)
var vbox = VBoxContainer.new()
margin.add_child(vbox)
# Name + status row
var headerRow = HBoxContainer.new()
vbox.add_child(headerRow)
var nameLabel = Label.new()
nameLabel.text = member.name
nameLabel.size_flags_horizontal = Control.SIZE_EXPAND_FILL
headerRow.add_child(nameLabel)
var statusLabel = Label.new()
statusLabel.text = "DEAD" if member.status == BattleFighter.Status.DEAD else "OK"
headerRow.add_child(statusLabel)
# HP row
var hpRow = HBoxContainer.new()
hpRow.add_theme_constant_override("separation", 6)
vbox.add_child(hpRow)
var hpKey = Label.new()
hpKey.text = "HP"
hpKey.custom_minimum_size = Vector2(30, 0)
hpRow.add_child(hpKey)
var hpVal = Label.new()
hpVal.text = "%d / %d" % [member.health, member.maxHealth]
hpRow.add_child(hpVal)
# MP row
var mpRow = HBoxContainer.new()
mpRow.add_theme_constant_override("separation", 6)
vbox.add_child(mpRow)
var mpKey = Label.new()
mpKey.text = "MP"
mpKey.custom_minimum_size = Vector2(30, 0)
mpRow.add_child(mpKey)
var mpVal = Label.new()
mpVal.text = "%d / %d" % [member.mp, member.maxMp]
mpRow.add_child(mpVal)
# Stats row
var statsRow = HBoxContainer.new()
statsRow.add_theme_constant_override("separation", 14)
vbox.add_child(statsRow)
for pair in [["ATK", member.attack], ["DEF", member.defense], ["SPD", member.speed], ["MAG", member.magic], ["LCK", member.luck]]:
var label = Label.new()
label.text = "%s %d" % [pair[0], pair[1]]
statsRow.add_child(label)
return panel
+1
View File
@@ -0,0 +1 @@
uid://bfklpf0grikg5
+25
View File
@@ -0,0 +1,25 @@
[gd_scene load_steps=2 format=3 uid="uid://br9c7x4t1n6q2"]
[ext_resource type="Script" uid="uid://dw3n5k8m2p1a7" path="res://ui/gamemenu/GameMenuPartyTab.gd" id="1_ptabgd"]
[node name="GameMenuPartyTab" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_ptabgd")
[node name="ScrollContainer" type="ScrollContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="MemberList" type="VBoxContainer" parent="ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 6