The UI component displays a reference card for a city object. It acts as a UI element that allows users to select or interact with a specified game entity.
@namespace CitySim.DesignSystem
@using CitySim.Cards
@using CitySim.Match
@using Sandbox.UI
@inherits Panel
<root class="plotter-card-reference @CssClass @(IsTag ? "tag" : "target")">@(GameText.Resolve(Label))</root>
@code {
[Parameter] public CityGame City { get; set; }
[Parameter] public string Label { get; set; }
[Parameter] public string CssClass { get; set; }
[Parameter] public Tag Tag { get; set; }
[Parameter] public IReadOnlyList<InteractionTarget> Targets { get; set; }
[Parameter] public Action<Tag> ReferenceChanged { get; set; }
[Parameter] public Action<IReadOnlyList<InteractionTarget>> TargetsChanged { get; set; }
bool IsTag => Tag != Tag.None;
bool CanHighlight => IsTag || (Targets != null && Targets.Any(t => t.Kind != InteractionKind.None));
protected override void OnParametersSet() { base.OnParametersSet(); AcceptsFocus = CanHighlight; }
void Show() {
if (!CanHighlight) return;
if (IsTag) { City?.HighlightReferenceTag(this, Tag); ReferenceChanged?.Invoke(Tag); }
else { City?.HighlightInteractions(this, Targets, Label); TargetsChanged?.Invoke(Targets); }
}
void Clear() {
City?.ClearInteractionHighlight(this);
if (IsTag) ReferenceChanged?.Invoke(Tag.None);
else if (CanHighlight) TargetsChanged?.Invoke(Array.Empty<InteractionTarget>());
}
protected override void OnMouseOver(MousePanelEvent e) { base.OnMouseOver(e); Show(); }
protected override void OnMouseOut(MousePanelEvent e) { base.OnMouseOut(e); if (!HasFocus) Clear(); }
protected override void OnFocus(PanelEvent e) { base.OnFocus(e); Show(); }
protected override void OnBlur(PanelEvent e) { base.OnBlur(e); if (!HasHovered) Clear(); }
public override void OnDeleted() { Clear(); base.OnDeleted(); }
protected override int BuildHash() => HashCode.Combine(GameText.LanguageCode, Label, Tag, CssClass, City, Targets, ReferenceChanged, TargetsChanged);
}