Files
gplan-2/game/presentation/views/toast_stack.gd
T

54 lines
1.9 KiB
GDScript

## VERTICAL SLICE - NOT FOR PRODUCTION
## 非模态 toast 槽:三槽堆叠自动消退(2.5s),info/warn/gold 三调性。
## 弹什么文案归组合根决定——本类只管槽位堆叠与消退,不做提示内容决策。
class_name ToastStack
extends Control
const LIFE_SEC := 2.5
const MAX_SLOTS := 3
const COL_INFO := UiKit.INK
const COL_WARN := UiKit.RED_MINE # 危险红族——拒绝/作废
const COL_GOLD := UiKit.GOLD_DEEP # 奖励金族——提示/达成(深金档)
var _slot_box: VBoxContainer
func _init() -> void:
mouse_filter = Control.MOUSE_FILTER_IGNORE
set_anchors_preset(Control.PRESET_TOP_WIDE)
custom_minimum_size = Vector2(0, 84)
_slot_box = VBoxContainer.new()
_slot_box.mouse_filter = Control.MOUSE_FILTER_IGNORE
_slot_box.alignment = BoxContainer.ALIGNMENT_BEGIN
_slot_box.add_theme_constant_override("separation", 2)
add_child(_slot_box)
func show_toast(text: String, tone: String = "info") -> void:
while _slot_box.get_child_count() >= MAX_SLOTS:
var old: Control = _slot_box.get_child(0)
_slot_box.remove_child(old)
old.queue_free()
var row := PanelContainer.new()
row.mouse_filter = Control.MOUSE_FILTER_IGNORE
row.clip_contents = true # 缺陷①约束:固定槽高裁剪,不回流布局
row.custom_minimum_size = Vector2(0, 24)
var sb := UiKit.panel_flat(UiKit.TOAST_BG, COL_INFO,UiKit.RADIUS_OBJECT, 1, Vector4(8, 2, 8, 2))
var col := COL_INFO
if tone == "warn":
col = COL_WARN
elif tone == "gold":
col = COL_GOLD
sb.border_color = col
row.add_theme_stylebox_override("panel", sb)
var lab := UiKit.label(("⚠ " if tone == "warn" else "") + text,UiKit.FS_HINT, tone != "info", col)
lab.clip_text = true
row.add_child(lab)
_slot_box.add_child(row)
var tw := row.create_tween()
tw.tween_interval(LIFE_SEC)
tw.tween_property(row, "modulate:a", 0.0, 0.35)
tw.tween_callback(func():
if is_instance_valid(row):
row.queue_free())