199 lines
7.1 KiB
C#
199 lines
7.1 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using Vanguard.App;
|
|
|
|
namespace Vanguard.UI
|
|
{
|
|
/// <summary>Гамбургер-меню логина: язык, версия и адрес сервера.</summary>
|
|
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<Image>();
|
|
blockerImage.color = new Color(0f, 0f, 0f, 0.001f);
|
|
blockerImage.raycastTarget = true;
|
|
|
|
var blockerButton = _blocker.GetComponent<Button>();
|
|
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<Image>();
|
|
burgerImage.raycastTarget = true;
|
|
|
|
var burgerButton = burger.gameObject.AddComponent<Button>();
|
|
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<Image>();
|
|
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<RectTransform>();
|
|
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<Image>();
|
|
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);
|
|
}
|
|
}
|
|
}
|