micromissiles-unity/Assets/Scripts/UI/Windows/UIWindow.cs

108 lines
3.7 KiB
C#

using System.Collections.Generic;
using System;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.EventSystems;
[RequireComponent(typeof(UIElementMouseCapturer))]
[RequireComponent(typeof(UIElementDragger))]
[RequireComponent(typeof(Image))]
public class UIWindow : MonoBehaviour
{
// Window title
[SerializeField]
private string windowTitle = "Window";
// Close button
private GameObject closeButton;
[SerializeField]
private CloseButtonCallback closeButtonCallback;
[Serializable]
private enum CloseButtonCallback
{
CLOSE_WINDOW,
TOGGLE_WINDOW
}
// IsOpen property
private bool isOpen;
private void OnEnable() { isOpen = true; }
private void OnDisable() { isOpen = false; }
public void ToggleWindow()
{
gameObject.SetActive(!gameObject.activeSelf);
}
public void CloseWindow()
{
Destroy(gameObject);
isOpen = false;
}
/// <summary>
/// Called when the UIWindow component is created in the editor
/// We will use it to configure the image component
/// </summary>
private void Reset()
{
// 18 16 28 125
GetComponent<Image>().color = new Color32(18, 16, 28, 125);
}
public virtual void Start()
{
isOpen = gameObject.activeSelf;
CreateCloseButton();
CreateWindowTitle();
if (closeButtonCallback == CloseButtonCallback.CLOSE_WINDOW)
closeButton.AddComponent<Button>().onClick.AddListener(CloseWindow);
else if (closeButtonCallback == CloseButtonCallback.TOGGLE_WINDOW)
closeButton.AddComponent<Button>().onClick.AddListener(ToggleWindow);
}
private void CreateWindowTitle()
{
GameObject windowTitleObject = new GameObject("WindowTitle", typeof(RectTransform));
windowTitleObject.transform.SetParent(transform);
TextMeshProUGUI windowTitleHandle = windowTitleObject.AddComponent<TextMeshProUGUI>();
windowTitleHandle.text = windowTitle;
windowTitleHandle.font = UIManager.Instance.Font;
windowTitleHandle.fontSize = 14;
windowTitleHandle.color = Color.white;
windowTitleHandle.alignment = TextAlignmentOptions.Left;
windowTitleHandle.rectTransform.anchorMin = new Vector2(0, 1);
windowTitleHandle.rectTransform.anchorMax = new Vector2(1, 1);
windowTitleHandle.rectTransform.pivot = new Vector2(0, 1);
windowTitleHandle.rectTransform.sizeDelta = new Vector2(0, 30);
windowTitleHandle.rectTransform.anchoredPosition = new Vector2(5, 0);
windowTitleHandle.rectTransform.SetRight(30); // Give spacing to the close button
}
/// <summary>
/// Create the close [x] button in the top right corner of the window
/// </summary>
private void CreateCloseButton()
{
closeButton = new GameObject("CloseButton", typeof(RectTransform));
RectTransform buttonTransform = closeButton.GetComponent<RectTransform>();
buttonTransform.SetParent(transform);
// anchor top right
buttonTransform.anchorMin = new Vector2(1, 1);
buttonTransform.anchorMax = new Vector2(1, 1);
buttonTransform.pivot = new Vector2(1, 1);
// position top right
buttonTransform.anchoredPosition = new Vector2(0, 0);
// size
buttonTransform.sizeDelta = new Vector2(30, 30);
// add button component
TextMeshProUGUI textbox = closeButton.AddComponent<TextMeshProUGUI>();
textbox.text = "X";
textbox.font = UIManager.Instance.Font;
textbox.fontSize = 12;
textbox.alignment = TextAlignmentOptions.Center;
textbox.verticalAlignment = VerticalAlignmentOptions.Middle;
}
}