using Godot; namespace Theriapolis.GodotHost.Scenes.Widgets; /// /// Small chip widget. The hover trigger for a trait/skill/detriment. /// Per GODOT_PORTING_GUIDE.md §6.2: on mouse-enter, asks the shared /// to show the popover at this chip's global /// rect; on exit, schedules close (popover stays alive if the cursor /// then enters the popover itself). /// /// Lightweight — every clade trait list, every skill row, every bonus /// pill spawns several of these. The actual popover panel is a single /// reused instance owned by PopoverLayer, not one per chip. /// public partial class TraitChip : PanelContainer { [Export] public string TraitName { get; set; } = ""; [Export] public string Description { get; set; } = ""; [Export] public string Tag { get; set; } = ""; [Export] public bool Detriment { get; set; } private Label _label = null!; public override void _Ready() { // Pass so click events bubble up to the parent card's GuiInput // (selecting the card). Hover signals fire regardless of filter // mode — they're driven by cursor-rect intersection, not input // event routing. MouseFilter = MouseFilterEnum.Pass; ApplyVariation(); _label = new Label { Text = TraitName, MouseFilter = MouseFilterEnum.Ignore, }; AddChild(_label); MouseEntered += OnHoverEntered; MouseExited += OnHoverExited; } public void SetTrait(string name, string description, string tag = "", bool detriment = false) { TraitName = name; Description = description; Tag = tag; Detriment = detriment; if (_label is not null) _label.Text = name; ApplyVariation(); } private void ApplyVariation() { ThemeTypeVariation = Detriment ? "PillDetriment" : "Pill"; } private void OnHoverEntered() { PopoverLayer.Instance?.ShowFor(this, TraitName, Description, Tag, Detriment); } private void OnHoverExited() { PopoverLayer.Instance?.ScheduleClose(); } }