Neg_Utils/NEG/UI/UnityUi/Window/MonoWindow.cs
2024-08-13 17:12:50 +02:00

94 lines
2.9 KiB
C#

using NEG.UI.UnityUi.WindowSlot;
using NEG.UI.Window;
using NEG.UI.WindowSlot;
using NegUtils.NEG.UI;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
namespace NEG.UI.UnityUi.Window
{
[DefaultExecutionOrder(10)]
public class MonoWindow : MonoBehaviour, IWindow
{
public event Action<object> OnOpened;
public event Action OnClosed;
public event Action<IControllable.BackUsed> OnBackUsed;
[field: SerializeField] public string WindowId { get; private set; }
public IEnumerable<IWindowSlot> AvailableSlots => windowSlots;
public IWindowSlot Parent { get; private set; }
public bool IsOpened { get; protected set; }
public bool IsMainWindow { get; }
public GameObject DefaultSelectedItem => defaultSelectedItem;
[SerializeField] private List<MonoWindowSlot> windowSlots;
[SerializeField] private string windowName;
[SerializeField] private GameObject defaultSelectedItem;
private IWindowSlot DefaultWindowSlot => windowSlots[0];
private void Awake()
{
UiManager.Instance.RegisterWindow(this);
((IWindow)this).SetHiddenState();
}
private void OnDestroy()
{
if(UiManager.Instance == null)
return;
if (IsOpened)
UiManager.Instance.OnWindowClosed(this);
UiManager.Instance.UnRegisterWindow(this);
}
private void OnValidate()
{
#if !NEG_UI_DISABLE_WARNING_DEFAULT_SELECTION
if (defaultSelectedItem == null)
Debug.LogWarning($"Window {name} should have default selected item set");
#endif
}
public void SetOpenedState(IWindowSlot parentSlot, object data)
{
gameObject.SetActive(true);
IsOpened = true;
Parent = parentSlot;
EventSystem.current.SetSelectedGameObject(defaultSelectedItem);
if (parentSlot.OpenWindowAsMain)
UiManager.Instance.SetMainWindow(this);
OnOpened?.Invoke(data);
}
public void SetClosedState()
{
gameObject.SetActive(false);
IsOpened = false;
Parent = null;
((ISlotsHolder)this).CloseAllWindows();
UiManager.Instance.OnWindowClosed(this);
OnClosed?.Invoke();
}
public void SetHiddenState() => gameObject.SetActive(false);
public void SeVisibleState() => gameObject.SetActive(true);
public void OpenWindow(IWindow window, object data = null) => DefaultWindowSlot.AttachWindow(window, data);
public void TryUseBack(ref IControllable.BackUsed backUsed) => OnBackUsed?.Invoke(backUsed);
public void SetDefaultSelectedItem(GameObject item) => defaultSelectedItem = item;
}
}