using NEG.UI.Area; using NEG.UI.UnityUi.Buttons; 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 { public class MonoWindow : MonoBehaviour, IWindow { public event Action OnOpened; public event Action OnClosed; public event Action UseBack; public IEnumerable AvailableSlots => windowSlots; public IWindowSlot Parent { get; private set; } public IController Controller { get; } public bool IsMainWindow { get; private set; } private IWindowSlot DefaultWindowSlot => windowSlots[0]; [SerializeField] private List windowSlots; [SerializeField] private WindowController controller; [SerializeField] private GameObject defaultSelectedItem; public void SetOpenedState(IWindowSlot parentSlot) { gameObject.SetActive(true); Parent = parentSlot; EventSystem.current.SetSelectedGameObject(defaultSelectedItem); if (parentSlot.OpenWindowAsMain) UiManager.Instance.SetMainWindow(this); } public void SetClosedState() { gameObject.SetActive(false); Parent = null; ((ISlotsHolder)this).CloseAllWindows(); UiManager.Instance.OnWindowClosed(this); if(controller != null) controller.OnClosed(); } public void SetHiddenState() => gameObject.SetActive(false); public void SeVisibleState() => gameObject.SetActive(true); private void Awake() => ((IWindow)this).SetHiddenState(); private void OnValidate() { if (controller == null) controller = GetComponent(); #if !NEG_UI_DISABLE_WARNING_DEFAULT_SELECTION if(defaultSelectedItem == null) Debug.LogWarning($"Window {name} should have default selected item set"); #endif } public void OpenWindow(IWindow window, object data = null) => DefaultWindowSlot.AttachWindow(window, data); public void SetDefaultSelectedItem(GameObject item) => defaultSelectedItem = item; public void FireOpenCallback(object data) => OnOpened?.Invoke(data); public void FireOnClosed() => OnClosed?.Invoke(); public void FireUseBack(ref IControllable.BackUsed backUsed) => UseBack?.Invoke(backUsed); } }