ChocolateBird/widgets/PartyMenu.gd

110 lines
3.7 KiB
GDScript

extends Panel
onready var sidebar_classic := $'%sidebar_classic'
onready var sbc_menu_item_containers := [$'%menu_items_1', $'%menu_items_2']
onready var lbl_time := $'%lbl_time'
onready var lbl_gilcount := $'%lbl_gilcount'
onready var characters_container := $'%characters_container'
onready var items_menu := $'%items_menu'
onready var items_container := $'%items_container'
onready var lbl_item_description := $'%lbl_item_description'
enum Submenu {PARTY, ITEMS}
const str2submenu := {
'party': Submenu.PARTY,
'items': Submenu.ITEMS,
}
var submenu2sbc_label := {}
onready var submenu2widget := {
Submenu.PARTY: characters_container,
Submenu.ITEMS: items_menu,
}
func update_labels(data: Dictionary):
var characters = data.characters
var character_panels = characters_container.get_children()
for i in len(characters):
var p = character_panels[i]
p.visible = not characters[i].is_absent
p.update_labels(data, i)
lbl_time.text = Common.game_time_frames_to_hhmm(data.game_time_frames)
lbl_gilcount.text = '%d' % data.current_gil
# Populate inventory
for child in items_container.get_children():
child.queue_free()
for i in 256:
var item_id = data.inventory_item_ids[i]
var item_qty = data.inventory_item_qtys[i]
# var item_name = StringLoader.tables.items[item_id]
var item_name = StringLoader.tables.item_long_names[item_id].rstrip(' ')
var lbl_item_name := Label.new()
var lbl_item_qty := Label.new()
lbl_item_qty.align = HALIGN_RIGHT
if item_qty > 0:
lbl_item_name.text = item_name
lbl_item_qty.text = 'x%d'%item_qty
var desc = StringLoader.get_inventory_item_desc(item_id)
if desc:
lbl_item_name.mouse_filter = MOUSE_FILTER_PASS
lbl_item_name.hint_tooltip = desc
items_container.add_child(lbl_item_name)
items_container.add_child(lbl_item_qty)
func _init_sidebar_classic() -> void:
for menu_item_container in sbc_menu_item_containers:
for label in menu_item_container.get_children():
var submenu = str2submenu.get(label.name, -1)
if submenu > -1:
self.submenu2sbc_label[submenu] = label
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
_init_sidebar_classic()
var _err = change_submenu(Submenu.PARTY)
const active_label_colour := Color.yellow
const inactive_label_colour := Color.white
func change_submenu(submenu_id) -> int:
# print(submenu)
if not (submenu_id in submenu2widget):
return ERR_DOES_NOT_EXIST
# Make everything inactive/invisible
for submenu in submenu2widget.values():
submenu.visible = false
for label in submenu2sbc_label.values():
label.modulate = inactive_label_colour
# Make the selected submenu active/visible
submenu2widget[submenu_id].visible = true
submenu2sbc_label[submenu_id].modulate = active_label_colour
return OK
func change_submenu_by_name(name: String) -> int:
var submenu = str2submenu.get(name, -1)
if submenu < 0:
return ERR_DOES_NOT_EXIST
return change_submenu(submenu)
func _on_sidebar_classic_click(pos: Vector2) -> int:
for menu_item_container in sbc_menu_item_containers:
var rect: Rect2 = menu_item_container.get_global_rect()
if rect.has_point(pos):
var local_y := pos.y - rect.position.y
var menu_items: Array = menu_item_container.get_children()
# A y-check is sufficient if we assume all labels are the same height
var label_height: float = menu_items[0].rect_size.y
var selected_label: int = int(local_y/label_height)
if selected_label < len(menu_items):
return change_submenu_by_name(menu_items[selected_label].name)
return ERR_CANT_RESOLVE
func _input(event: InputEvent) -> void:
if (event is InputEventMouseButton or event is InputEventScreenTouch) and event.pressed:
var pos: Vector2 = event.position
if sidebar_classic.get_global_rect().has_point(pos):
var _err = _on_sidebar_classic_click(pos)