using UnityEngine;
using UnityEngine.UI;
using Vanguard.App;
namespace Vanguard.UI
{
/// Гамбургер-меню логина: язык, версия и адрес сервера.
public sealed class LoginMenu
{
private readonly GameObject _blocker;
private readonly RectTransform _panel;
public bool IsOpen => _panel != null && _panel.gameObject.activeSelf;
public LoginMenu(Transform parent, AppConfig config)
{
_blocker = new GameObject(
"MenuBlocker",
typeof(RectTransform),
typeof(Image),
typeof(Button));
var blockerRect = (RectTransform)_blocker.transform;
blockerRect.SetParent(parent, false);
UiKit.Stretch(blockerRect);
var blockerImage = _blocker.GetComponent();
blockerImage.color = new Color(0f, 0f, 0f, 0.001f);
blockerImage.raycastTarget = true;
var blockerButton = _blocker.GetComponent();
blockerButton.transition = Selectable.Transition.None;
blockerButton.onClick.AddListener(Close);
_blocker.SetActive(false);
var burger = NeonUi.AddAnchored(
parent,
"MenuButton",
NeonUi.Body(
56,
56,
12,
new Color(0.027f, 0.066f, 0.17f, 0.92f),
new Color(0.18f, 0.49f, 1f, 0.85f),
1),
new Vector2(56f, 56f),
new Vector2(1f, 1f),
new Vector2(1f, 1f),
new Vector2(-28f, -28f));
var burgerImage = burger.GetComponent();
burgerImage.raycastTarget = true;
var burgerButton = burger.gameObject.AddComponent();
burgerButton.targetGraphic = burgerImage;
burgerButton.transition = Selectable.Transition.ColorTint;
burgerButton.colors = new ColorBlock
{
normalColor = Color.white,
highlightedColor = new Color(1.15f, 1.15f, 1.15f, 1f),
pressedColor = new Color(0.9f, 0.9f, 0.9f, 1f),
selectedColor = Color.white,
disabledColor = new Color(0.6f, 0.6f, 0.6f, 0.5f),
colorMultiplier = 1f,
fadeDuration = 0.08f,
};
burgerButton.onClick.AddListener(Toggle);
var barColor = new Color(0.75f, 0.88f, 1f, 0.95f);
for (var i = -1; i <= 1; i++)
{
NeonUi.AddImage(
burger,
"Bar" + i,
NeonUi.HorizontalBar(22, 2, barColor),
new Vector2(22f, 2f),
new Vector2(0f, i * 7f));
}
var panelGo = new GameObject("MenuPanel", typeof(RectTransform), typeof(Image));
_panel = (RectTransform)panelGo.transform;
_panel.SetParent(parent, false);
_panel.anchorMin = new Vector2(1f, 1f);
_panel.anchorMax = new Vector2(1f, 1f);
_panel.pivot = new Vector2(1f, 1f);
_panel.anchoredPosition = new Vector2(-28f, -96f);
_panel.sizeDelta = new Vector2(340f, 300f);
var panelImage = panelGo.GetComponent();
panelImage.sprite = NeonUi.Body(
340,
300,
16,
new Color(0.027f, 0.066f, 0.17f, 0.96f),
new Color(0.18f, 0.49f, 1f, 0.85f),
1);
panelImage.type = Image.Type.Simple;
panelImage.raycastTarget = true;
BuildContent(config);
_panel.gameObject.SetActive(false);
}
private void BuildContent(AppConfig config)
{
UiKit.AddVerticalLayout(_panel, 16, 10);
var title = UiKit.CreateText(
_panel,
"Title",
"Меню",
18,
new Color(0.82f, 0.9f, 1f),
TextAnchor.MiddleLeft);
UiKit.SetPreferredHeight(title, 24f);
var row = new GameObject("LanguageRow", typeof(RectTransform));
row.transform.SetParent(_panel, false);
UiKit.SetPreferredHeight(row.transform, 36f);
var languageLabel = UiKit.CreateText(
row.transform,
"Label",
"Язык",
15,
new Color(0.66f, 0.76f, 0.9f),
TextAnchor.MiddleLeft);
var labelRect = languageLabel.rectTransform;
labelRect.anchorMin = new Vector2(0f, 0f);
labelRect.anchorMax = new Vector2(0.6f, 1f);
labelRect.offsetMin = Vector2.zero;
labelRect.offsetMax = Vector2.zero;
var language = UiKit.CreateLanguageButton(row.transform, "Language");
var languageRect = language.GetComponent();
languageRect.anchorMin = new Vector2(1f, 0.5f);
languageRect.anchorMax = new Vector2(1f, 0.5f);
languageRect.pivot = new Vector2(1f, 0.5f);
languageRect.sizeDelta = new Vector2(64f, 32f);
languageRect.anchoredPosition = Vector2.zero;
var version = UiKit.CreateText(
_panel,
"Version",
"Версия " + Application.version,
13,
new Color(0.52f, 0.62f, 0.78f),
TextAnchor.MiddleLeft);
UiKit.SetPreferredHeight(version, 18f);
UiKit.MakeLiteral(version);
var caption = UiKit.CreateText(
_panel,
"ServerCaption",
"Адрес сервера",
13,
new Color(0.52f, 0.62f, 0.78f),
TextAnchor.MiddleLeft);
UiKit.SetPreferredHeight(caption, 16f);
var server = UiKit.CreateInput(_panel, "ServerUrl", "http://host:port");
UiKit.SetPreferredHeight(server, 42f);
server.text = config.ServerBaseUrl;
UiKit.MakeLiteral(server.textComponent);
server.onEndEdit.AddListener(value =>
{
config.SetServerBaseUrl(value);
server.text = config.ServerBaseUrl;
});
var close = UiKit.CreateButton(_panel, "Close", "Закрыть", Close, 15);
var closeImage = close.GetComponent();
if (closeImage != null)
closeImage.color = new Color(0.06f, 0.12f, 0.24f, 0.95f);
UiKit.SetPreferredHeight(close, 36f);
}
private void Toggle()
{
if (_panel.gameObject.activeSelf)
Close();
else
Open();
}
private void Open()
{
_blocker.SetActive(true);
_panel.gameObject.SetActive(true);
_panel.SetAsLastSibling();
}
public void Close()
{
_panel.gameObject.SetActive(false);
_blocker.SetActive(false);
}
}
}