VanguardReMaster/client/Assets/Vanguard/Runtime/UI/CommunityView.cs

203 lines
7.9 KiB
C#
Raw 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;
namespace Vanguard.UI
{
public enum CommunityTab
{
Guides,
Decks,
Tickets,
}
/// <summary>
/// Сцена Community: вкладки гайдов, публичных колод и тикетов. Пока это
/// каркас — серверных данных для разделов нет.
/// </summary>
public sealed class CommunityView
{
public const string RootName = "CommunityScreen";
private static readonly Color PanelFill = new Color(0.024f, 0.058f, 0.15f, 0.92f);
private static readonly Color Border = new Color(0.18f, 0.49f, 1f, 0.55f);
private static readonly Color BorderStrong = new Color(0.34f, 0.72f, 1f, 0.9f);
private static readonly Color TextPrimary = new Color(0.88f, 0.93f, 1f);
private static readonly Color TextDim = new Color(0.44f, 0.55f, 0.75f);
private readonly RectTransform _root;
private readonly RectTransform[] _contents;
private readonly Button[] _tabs;
public CommunityView(Transform parent, Action onBack)
{
_root = UiKit.CreatePanel(parent, RootName, new Color(0f, 0f, 0f, 0f));
_root.GetComponent<Image>().raycastTarget = false;
var top = Surface(_root, "TopBar", new Color(0.012f, 0.03f, 0.08f, 0.94f), 0);
top.anchorMin = new Vector2(0f, 1f);
top.anchorMax = new Vector2(1f, 1f);
top.pivot = new Vector2(0.5f, 1f);
top.sizeDelta = new Vector2(0f, 88f);
top.anchoredPosition = Vector2.zero;
var back = UiKit.CreateButton(top, "Back", "← Назад", () => onBack(), 18);
var backRect = back.GetComponent<RectTransform>();
backRect.anchorMin = new Vector2(0f, 0.5f);
backRect.anchorMax = new Vector2(0f, 0.5f);
backRect.pivot = new Vector2(0f, 0.5f);
backRect.sizeDelta = new Vector2(150f, 44f);
backRect.anchoredPosition = new Vector2(24f, 0f);
ApplyFill(back.GetComponent<Image>(), new Color(0.06f, 0.12f, 0.24f, 0.95f), Border);
var title = UiKit.CreateText(
top,
"Title",
"Сообщество",
30,
TextPrimary,
TextAnchor.MiddleLeft);
title.fontStyle = FontStyle.Bold;
var titleRect = title.rectTransform;
titleRect.anchorMin = new Vector2(0f, 0.5f);
titleRect.anchorMax = new Vector2(0f, 0.5f);
titleRect.pivot = new Vector2(0f, 0.5f);
titleRect.sizeDelta = new Vector2(420f, 44f);
titleRect.anchoredPosition = new Vector2(196f, 0f);
var hint = UiKit.CreateText(
top,
"Hint",
"Гайды, колоды и обратная связь",
15,
TextDim,
TextAnchor.MiddleRight);
var hintRect = hint.rectTransform;
hintRect.anchorMin = new Vector2(1f, 0.5f);
hintRect.anchorMax = new Vector2(1f, 0.5f);
hintRect.pivot = new Vector2(1f, 0.5f);
hintRect.sizeDelta = new Vector2(420f, 30f);
hintRect.anchoredPosition = new Vector2(-24f, 0f);
var tabs = NewRect(_root, "Tabs");
tabs.anchorMin = new Vector2(0f, 1f);
tabs.anchorMax = new Vector2(0f, 1f);
tabs.pivot = new Vector2(0f, 1f);
tabs.sizeDelta = new Vector2(900f, 56f);
tabs.anchoredPosition = new Vector2(24f, -104f);
_tabs = new Button[3];
_contents = new RectTransform[3];
for (var i = 0; i < 3; i++)
{
var index = i;
var label = TabTitle((CommunityTab)i);
var tab = UiKit.CreateButton(tabs, "Tab" + i, label, () => SelectTab((CommunityTab)index), 17);
var rect = tab.GetComponent<RectTransform>();
rect.anchorMin = new Vector2(0f, 0.5f);
rect.anchorMax = new Vector2(0f, 0.5f);
rect.pivot = new Vector2(0f, 0.5f);
rect.sizeDelta = new Vector2(250f, 52f);
rect.anchoredPosition = new Vector2(i * 266f, 0f);
_tabs[i] = tab;
}
var body = Surface(_root, "Body", PanelFill, 16);
body.anchorMin = new Vector2(0f, 0f);
body.anchorMax = new Vector2(1f, 1f);
body.offsetMin = new Vector2(24f, 24f);
body.offsetMax = new Vector2(-24f, -180f);
for (var i = 0; i < 3; i++)
{
var tab = (CommunityTab)i;
_contents[i] = StubUi.Panel(
body,
"Content" + i,
TabTitle(tab),
TabNote(tab));
}
SelectTab(CommunityTab.Guides);
_root.gameObject.SetActive(false);
}
public CommunityTab Current { get; private set; }
public void Show() => UiKit.SetActive(_root, true);
public void Hide() => UiKit.SetActive(_root, false);
public void SelectTab(CommunityTab tab)
{
Current = tab;
for (var i = 0; i < 3; i++)
{
var active = (CommunityTab)i == tab;
_contents[i].gameObject.SetActive(active);
ApplyFill(
_tabs[i].GetComponent<Image>(),
active
? new Color(0.16f, 0.40f, 0.80f, 0.95f)
: new Color(0.05f, 0.10f, 0.22f, 0.9f),
active ? BorderStrong : Border);
}
}
private static string TabTitle(CommunityTab tab)
{
switch (tab)
{
case CommunityTab.Decks:
return "Колоды";
case CommunityTab.Tickets:
return "Тикеты";
default:
return "Гайды";
}
}
private static string TabNote(CommunityTab tab)
{
switch (tab)
{
case CommunityTab.Decks:
return "Публичные колоды появятся позже. Сейчас колодой можно поделиться по коду в редакторе.";
case CommunityTab.Tickets:
return "Отправка сообщений о багах и улучшениях появится позже: нужен серверный раздел тикетов.";
default:
return "Разборы карт, колод и механик появятся позже. Материалы будут открываться прямо здесь.";
}
}
private static RectTransform NewRect(Transform parent, string name)
{
var go = new GameObject(name, typeof(RectTransform));
var rect = (RectTransform)go.transform;
rect.SetParent(parent, false);
return rect;
}
private static RectTransform Surface(Transform parent, string name, Color fill, int radius)
{
var go = new GameObject(name, typeof(RectTransform), typeof(Image));
var rect = (RectTransform)go.transform;
rect.SetParent(parent, false);
var image = go.GetComponent<Image>();
image.sprite = NeonUi.BodySliced(radius, fill, Border, 1);
image.type = Image.Type.Sliced;
image.color = Color.white;
image.raycastTarget = false;
return rect;
}
private static void ApplyFill(Image image, Color fill, Color border)
{
image.sprite = NeonUi.BodySliced(12, fill, border, 1);
image.type = Image.Type.Sliced;
image.color = Color.white;
}
}
}