138 lines
5.7 KiB
C#
138 lines
5.7 KiB
C#
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;
|
||
|
||
_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", "Назад", () => _onBack?.Invoke(), 16);
|
||
var backElement = UiKit.SetPreferredHeight(back, 40f, 0f);
|
||
backElement.preferredWidth = 110f;
|
||
|
||
var close = UiKit.CreateButton(header, "Close", "Закрыть", () => _onBack?.Invoke(), 16);
|
||
var closeElement = UiKit.SetPreferredHeight(close, 40f, 0f);
|
||
closeElement.preferredWidth = 110f;
|
||
|
||
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 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);
|
||
}
|
||
}
|
||
}
|