feat: 2.3.1

This commit is contained in:
2026-05-12 17:55:53 +08:00
parent 13f3c3d591
commit 7ca11c6534
28 changed files with 1328 additions and 578 deletions
+53 -27
View File
@@ -6,11 +6,13 @@ signal closed
@onready var mail_list_vbox := %MailListVBox as VBoxContainer
@onready var mail_title_lbl := %MailTitleLbl as Label
@onready var mail_content_text := %MailContentText as RichTextLabel
@onready var sender_lbl := %SenderLbl as Label
@onready var dynamic_rewards_container := %DynamicRewardsContainer as HBoxContainer
@onready var reward_hbox_template := %RewardHBoxTemplate as HBoxContainer
@onready var sender_lbl = get_node_or_null("%SenderLbl")
@onready var dynamic_rewards_container := %DynamicRewardsContainer as VBoxContainer
@onready var reward_hbox_template = %RewardHBoxTemplate
@onready var action_btn := %ActionBtn as Button
@onready var read_all_btn := %ReadAllBtn as Button
@onready var empty_state_lbl := %EmptyStateLbl as Label
@onready var mail_btn_template := %MailBtnTemplate as Button
var _current_mail: Dictionary = {}
@@ -18,6 +20,7 @@ func _ready() -> void:
visible = false
close_btn.pressed.connect(hide_panel)
action_btn.pressed.connect(_on_action_pressed)
read_all_btn.pressed.connect(_on_read_all_pressed)
if MailManager:
MailManager.mail_updated.connect(_refresh_ui)
@@ -25,6 +28,7 @@ func show_panel() -> void:
visible = true
_clear_details()
if MailManager:
await MailManager.read_all_and_claim_all()
MailManager.fetch_mails()
_refresh_ui()
@@ -57,16 +61,15 @@ func _refresh_ui() -> void:
if _current_mail.is_empty() and mails.size() > 0:
_on_mail_selected(mails[0])
@onready var mail_btn_template := %MailBtnTemplate as Button
func _create_mail_button(mail: Dictionary) -> Button:
var btn = mail_btn_template.duplicate()
btn.visible = true
var title = btn.get_node("VBox/Title") as Label
title.text = mail.get("title", "No Title")
var title_lbl = btn.get_node("Margin/VBox/Title") as Label
if title_lbl:
title_lbl.text = mail.get("title", "No Title")
var date_lbl = btn.get_node("VBox/HBox/DateLbl") as Label
var date_lbl = btn.get_node("Margin/VBox/HBox/DateLbl") as Label
var date_str = mail.get("date", "")
var expiry_str = mail.get("expiry_date", "")
@@ -85,19 +88,21 @@ func _create_mail_button(mail: Dictionary) -> Button:
else:
label_text += " (Expired)"
date_lbl.text = label_text
if date_lbl:
date_lbl.text = label_text
var status_lbl = btn.get_node("VBox/HBox/StatusLbl") as Label
var status_lbl = btn.get_node("Margin/VBox/HBox/StatusLbl") as Label
var mail_id = mail.get("id", "")
if mail_id in MailManager.claimed_ids:
status_lbl.text = "CLAIMED"
status_lbl.add_theme_color_override("font_color", Color.GREEN)
elif mail_id in MailManager.read_ids:
status_lbl.text = "READ"
status_lbl.add_theme_color_override("font_color", Color.GRAY)
else:
status_lbl.text = "NEW"
status_lbl.add_theme_color_override("font_color", Color.YELLOW)
if status_lbl:
if mail_id in MailManager.claimed_ids:
status_lbl.text = "CLAIMED"
status_lbl.add_theme_color_override("font_color", Color.GREEN)
elif mail_id in MailManager.read_ids:
status_lbl.text = "READ"
status_lbl.add_theme_color_override("font_color", Color.GRAY)
else:
status_lbl.text = "NEW"
status_lbl.add_theme_color_override("font_color", Color.YELLOW)
return btn
@@ -113,7 +118,7 @@ func _on_mail_selected(mail: Dictionary) -> void:
func _clear_details() -> void:
mail_title_lbl.text = ""
mail_content_text.text = ""
sender_lbl.text = ""
if sender_lbl: sender_lbl.text = ""
for child in dynamic_rewards_container.get_children():
if child.visible: child.queue_free()
action_btn.hide()
@@ -121,7 +126,7 @@ func _clear_details() -> void:
func _update_details(mail: Dictionary) -> void:
mail_title_lbl.text = mail.get("title", "No Title")
mail_content_text.text = mail.get("content", "")
sender_lbl.text = "SENDER:\n" + mail.get("sender", "SYSTEM")
if sender_lbl: sender_lbl.text = "SENDER:\n" + mail.get("sender", "SYSTEM")
for child in dynamic_rewards_container.get_children():
if child.visible: child.queue_free()
@@ -141,16 +146,29 @@ func _update_details(mail: Dictionary) -> void:
var row = reward_hbox_template.duplicate()
row.visible = true
dynamic_rewards_container.add_child(row)
var amt_lbl = row.get_node("AmountLbl") as Label
var amt_lbl = row.get_node("Margin/HBox/VBox/AmountLbl") as Label
var type_lbl = row.get_node("Margin/HBox/VBox/TypeLbl") as Label
var t = r.get("type", "star")
var amt = r.get("amount", 0)
var id = r.get("id", "")
var rid = r.get("id", "")
if t == "star" or t == "gold":
amt_lbl.text = str(amt) + " " + t.to_upper()
else:
amt_lbl.text = str(amt) + " " + id
if amt_lbl: amt_lbl.text = "x" + str(amt)
if type_lbl: type_lbl.text = t.to_upper() if (t == "star" or t == "gold") else rid.to_upper()
# Fill empty slots up to 4
var added = rewards.size()
while added < 4:
added += 1
var empty_row = reward_hbox_template.duplicate()
empty_row.visible = true
dynamic_rewards_container.add_child(empty_row)
var icon_bg = empty_row.get_node_or_null("Margin/HBox/IconBg")
if icon_bg: icon_bg.color = Color(0, 0, 0, 0)
var t_lbl = empty_row.get_node_or_null("Margin/HBox/VBox/TypeLbl")
if t_lbl: t_lbl.text = ""
var a_lbl = empty_row.get_node_or_null("Margin/HBox/VBox/AmountLbl")
if a_lbl: a_lbl.text = ""
action_btn.show()
var mail_id = mail.get("id", "")
@@ -178,3 +196,11 @@ func _on_action_pressed() -> void:
if ok:
_current_mail = {}
_clear_details()
func _on_read_all_pressed() -> void:
if not MailManager: return
for mail in MailManager.mails:
var mid = mail.get("id", "")
if mid not in MailManager.read_ids:
MailManager.mark_as_read(mid)
_refresh_ui()