VanguardReMaster/client/Assets/Vanguard/Runtime/UI/Overlays/CardDetailOverlay.cs

163 lines
6.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using UnityEngine;
using UnityEngine.UI;
using Vanguard.Api.Contracts;
namespace Vanguard.UI.Overlays
{
/// <summary>Крупная карточка с полным текстом. Для скрытых карт показывает рубашку.</summary>
public sealed class CardDetailOverlay
{
private readonly RectTransform _root;
private readonly Image _art;
private readonly Text _name;
private readonly Text _meta;
private readonly Text _stats;
private readonly Text _ability;
private readonly Func<string, CardCatalogItemDto> _catalog;
private Action _onBack;
public CardDetailOverlay(
Transform parent,
Func<string, CardCatalogItemDto> catalog)
{
_catalog = catalog;
var prefabRoot = OverlayPrefabs.Instantiate("CardDetailOverlay", parent);
if (prefabRoot != null)
{
_root = prefabRoot;
_name = _root.Find("CardDetailPanel/Header/Name").GetComponent<Text>();
_art = _root.Find("CardDetailPanel/Body/Art").GetComponent<Image>();
_meta = _root.Find("CardDetailPanel/Body/Info/Meta").GetComponent<Text>();
_stats = _root.Find("CardDetailPanel/Body/Info/Stats").GetComponent<Text>();
_ability = _root.Find("CardDetailPanel/Body/Info/Ability").GetComponent<Text>();
WireBack(_root.Find("CardDetailPanel/Header/Back").GetComponent<Button>());
WireBack(_root.Find("CardDetailPanel/Header/Close").GetComponent<Button>());
_root.gameObject.SetActive(false);
return;
}
_root = UiKit.CreatePanel(parent, "CardDetailOverlay", new Color(0f, 0f, 0f, 0.82f));
var panel = UiKit.CreateCenteredCard(
_root,
"CardDetailPanel",
new Vector2(900f, 600f),
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);
_name = UiKit.CreateText(header, "Name", "Карта", 24, Color.white, TextAnchor.MiddleLeft);
_name.fontStyle = FontStyle.Bold;
UiKit.MakeLiteral(_name);
UiKit.SetPreferredHeight(_name, 44f);
var back = UiKit.CreateButton(header, "Back", "Назад", null, 16);
var backElement = UiKit.SetPreferredHeight(back, 40f, 0f);
backElement.preferredWidth = 110f;
WireBack(back);
var close = UiKit.CreateButton(header, "Close", "Закрыть", null, 16);
var closeElement = UiKit.SetPreferredHeight(close, 40f, 0f);
closeElement.preferredWidth = 110f;
WireBack(close);
var body = UiKit.CreatePanel(panel, "Body", Color.clear);
var bodyElement = body.gameObject.AddComponent<LayoutElement>();
bodyElement.flexibleHeight = 1f;
bodyElement.minHeight = 500f;
UiKit.AddHorizontalLayout(body, 0, 16);
var artPanel = UiKit.CreatePanel(body, "Art", Color.white);
var artElement = artPanel.gameObject.AddComponent<LayoutElement>();
artElement.preferredWidth = 300f;
artElement.preferredHeight = 460f;
artElement.flexibleWidth = 0f;
_art = artPanel.GetComponent<Image>();
_art.raycastTarget = false;
var info = UiKit.CreatePanel(body, "Info", Color.clear);
var infoElement = info.gameObject.AddComponent<LayoutElement>();
infoElement.flexibleWidth = 1f;
infoElement.flexibleHeight = 1f;
UiKit.AddVerticalLayout(info, 0, 6);
_meta = UiKit.CreateText(info, "Meta", string.Empty, 15, new Color(0.72f, 0.80f, 0.94f), TextAnchor.UpperLeft);
_meta.horizontalOverflow = HorizontalWrapMode.Wrap;
UiKit.MakeLiteral(_meta);
UiKit.SetPreferredHeight(_meta, 52f);
_stats = UiKit.CreateText(info, "Stats", string.Empty, 17, Color.white, TextAnchor.UpperLeft);
_stats.fontStyle = FontStyle.Bold;
UiKit.MakeLiteral(_stats);
UiKit.SetPreferredHeight(_stats, 40f);
_ability = UiKit.CreateText(info, "Ability", string.Empty, 15, Color.white, TextAnchor.UpperLeft);
_ability.horizontalOverflow = HorizontalWrapMode.Wrap;
_ability.verticalOverflow = VerticalWrapMode.Overflow;
UiKit.MakeLiteral(_ability);
UiKit.SetPreferredHeight(_ability, 300f);
_root.gameObject.SetActive(false);
}
public bool IsVisible => _root.gameObject.activeSelf;
public RectTransform Root => _root;
private void WireBack(Button button)
{
if (button != null)
button.onClick.AddListener(() => _onBack?.Invoke());
}
public void Show(CardListEntry entry, Action onBack)
{
_onBack = onBack;
var card = entry.Card;
var meta = card != null ? _catalog?.Invoke(card.PrintingId) : null;
if (entry.Hidden || card == null)
{
_art.sprite = CardArt.Back;
_art.color = Color.white;
_name.text = entry.Label ?? "Закрытая карта";
_meta.text = "Содержимое этой карты скрыто.";
_stats.text = string.Empty;
_ability.text = string.Empty;
}
else
{
CardImageService.Apply(
_art,
meta != null ? meta.ImageKey : null,
CardArt.ForCard(
meta != null ? meta.NameId : card.PrintingId,
meta != null ? meta.Clan : "None"));
_name.text = meta != null ? Loc.CardName(meta) : card.PrintingId;
_meta.text = meta != null
? meta.Clan + " · " + meta.Type + " · G" + meta.Grade
+ (string.IsNullOrEmpty(meta.Trigger) || meta.Trigger == "None"
? string.Empty
: " · " + meta.Trigger)
: string.Empty;
_stats.text = "P " + card.Power
+ " · Shield " + (meta != null ? meta.Shield : 0)
+ " · C " + card.Critical;
_ability.text = meta != null ? Loc.CardText(meta) : string.Empty;
}
_root.SetAsLastSibling();
_root.gameObject.SetActive(true);
}
public void Hide()
{
_root.gameObject.SetActive(false);
}
}
}