using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Vanguard.Api.Contracts;
using Vanguard.Shared.Protocol;
namespace Vanguard.UI.Overlays
{
///
/// Единый горизонтальный список карт для Deck/Drop/Soul/Damage/Trigger/Hand.
/// Порядок задаёт адаптер: первой идёт карта, лежащая сверху зоны.
///
public sealed class CardListView
{
private readonly RectTransform _root;
private readonly RectTransform _content;
private readonly Text _title;
private readonly Func _catalog;
private Action _onEntry;
private Action _onClose;
public CardListView(
Transform parent,
Func catalog)
{
_catalog = catalog;
_root = UiKit.CreatePanel(parent, "CardListView", new Color(0f, 0f, 0f, 0.78f));
var panel = UiKit.CreateCenteredCard(
_root,
"CardListPanel",
new Vector2(980f, 560f),
new Color(0.045f, 0.06f, 0.09f, 1f));
UiKit.AddVerticalLayout(panel, 16, 10);
var header = UiKit.CreatePanel(panel, "Header", Color.clear);
UiKit.AddHorizontalLayout(header, 0, 10);
UiKit.SetPreferredHeight(header, 44f);
_title = UiKit.CreateText(
header,
"Title",
"Карты",
24,
Color.white,
TextAnchor.MiddleLeft);
_title.fontStyle = FontStyle.Bold;
UiKit.SetPreferredHeight(_title, 44f);
var close = UiKit.CreateButton(header, "Close", "Закрыть", () => _onClose?.Invoke(), 16);
var closeElement = UiKit.SetPreferredHeight(close, 40f, 0f);
closeElement.preferredWidth = 120f;
var scroll = UiKit.CreateHorizontalScrollView(panel, "CardScroll", out _content, 10f);
var scrollElement = scroll.gameObject.AddComponent();
scrollElement.flexibleHeight = 1f;
scrollElement.minHeight = 400f;
_root.gameObject.SetActive(false);
}
public bool IsVisible => _root.gameObject.activeSelf;
public void Show(
CardListRequest request,
Action onEntry,
Action onClose)
{
_onEntry = onEntry;
_onClose = onClose;
_title.text = request.Title;
ClearChildren(_content);
if (request.Entries.Count == 0)
{
var empty = UiKit.CreateText(
_content,
"Empty",
request.EmptyText,
17,
new Color(0.62f, 0.68f, 0.82f));
UiKit.SetPreferredHeight(empty, 80f);
}
else
{
foreach (var entry in request.Entries)
AddTile(entry);
}
_root.SetAsLastSibling();
_root.gameObject.SetActive(true);
}
public void Hide()
{
_root.gameObject.SetActive(false);
}
private void AddTile(CardListEntry entry)
{
var tile = UiKit.CreatePanel(
_content,
"Card_" + (entry.Card != null ? entry.Card.InstanceId.ToString() : "hidden"),
Color.white);
var layout = tile.gameObject.AddComponent();
layout.preferredWidth = 126f;
layout.preferredHeight = 178f;
layout.flexibleWidth = 0f;
var image = tile.GetComponent();
image.raycastTarget = true;
var meta = entry.Card != null
? _catalog?.Invoke(entry.Card.PrintingId)
: null;
if (entry.Hidden)
{
image.sprite = CardArt.Back;
image.color = Color.white;
}
else
{
CardImageService.Apply(
image,
meta != null ? meta.ImageKey : null,
CardArt.ForCard(
meta != null ? meta.NameId : entry.Card.PrintingId,
meta != null ? meta.Clan : "None"));
}
var shade = UiKit.CreatePanel(tile, "Shade", new Color(0f, 0f, 0f, 0.76f));
shade.anchorMin = new Vector2(0f, 0f);
shade.anchorMax = new Vector2(1f, 0f);
shade.pivot = new Vector2(0.5f, 0f);
shade.anchoredPosition = Vector2.zero;
shade.sizeDelta = new Vector2(0f, 44f);
shade.GetComponent().raycastTarget = false;
var name = UiKit.CreateText(
tile,
"Name",
entry.Hidden
? (entry.Label ?? "Закрытая карта")
: (meta != null ? Loc.CardName(meta) : entry.Card.PrintingId),
12,
Color.white,
TextAnchor.LowerCenter);
UiKit.MakeLiteral(name);
var nameRect = name.rectTransform;
nameRect.anchorMin = new Vector2(0f, 0f);
nameRect.anchorMax = new Vector2(1f, 0f);
nameRect.pivot = new Vector2(0.5f, 0f);
nameRect.anchoredPosition = new Vector2(0f, 22f);
nameRect.sizeDelta = new Vector2(-8f, 20f);
name.horizontalOverflow = HorizontalWrapMode.Wrap;
name.verticalOverflow = VerticalWrapMode.Truncate;
name.raycastTarget = false;
var stats = UiKit.CreateText(
tile,
"Stats",
entry.Hidden || entry.Card == null
? string.Empty
: "P " + entry.Card.Power + " C " + entry.Card.Critical,
10,
new Color(0.78f, 0.84f, 0.95f),
TextAnchor.LowerCenter);
UiKit.MakeLiteral(stats);
var statsRect = stats.rectTransform;
statsRect.anchorMin = new Vector2(0f, 0f);
statsRect.anchorMax = new Vector2(1f, 0f);
statsRect.pivot = new Vector2(0.5f, 0f);
statsRect.anchoredPosition = new Vector2(0f, 5f);
statsRect.sizeDelta = new Vector2(-8f, 16f);
stats.raycastTarget = false;
var button = tile.gameObject.AddComponent