using System; using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; public partial class UIManager { private List _uiWindowStack = new List(8); public List UiWindowStack => _uiWindowStack; #region StackAPI public bool CheckIsWindowInStack(UIWindow window) { if (_uiWindowStack.Contains(window)) { return true; } return false; } public UIWindow GetLast() { if (_uiWindowStack.Count > 0) { return _uiWindowStack.Last(); } return null; } public UIWindow GetLastFullScreen() { if (_uiWindowStack.Count > 0) { for (int i = _uiWindowStack.Count - 1; i >= 0; i--) { if (CheckWindowIsFullScreen(_uiWindowStack[i])) { return _uiWindowStack[i]; } } } return null; } public void PushWindow(UIWindow window) { if (window != null) { if (_uiWindowStack.Contains(window)) { DebugUtil.LogError($"{window.WindowName} exists in UIWindowStack!!!"); return; } _uiWindowStack.Add(window); } } public UIWindow PopWindow() { if (_uiWindowStack.Count > 0) { var window = _uiWindowStack.Last(); _uiWindowStack.Remove(window); return window; } return null; } public UIWindow PopWindow(string checkWindowName) { if (_uiWindowStack.Count > 0) { var window = _uiWindowStack.Last(); if (string.IsNullOrEmpty(checkWindowName) || checkWindowName.Equals(window.WindowName)) { _uiWindowStack.Remove(window); return window;; } } return null; } public void ForceRemoveWindow(UIWindow window) { if (_uiWindowStack.Contains(window)) { _uiWindowStack.Remove(window); } } public void ClearHideStack(params string[] windowName) { for(int i = _uiWindowStack.Count - 1; i >=0 ; i--) { if (!windowName.Contains(_uiWindowStack[i].WindowName)) { _uiWindowStack[i].CloseWindow(UIWindowCloseType.ForceDestroy); _uiWindowStack.RemoveAt(i); } } } public void ClearHideStack() { for(int i = 0; i < _uiWindowStack.Count; i++) { _uiWindowStack[i].CloseWindow(UIWindowCloseType.ForceDestroy); } _uiWindowStack.Clear(); } #endregion public static async UniTask AnimSwitchWindow(UIWindow hideWindow, UIWindowCloseType closeType, string showWindowName, object data = null) { if (hideWindow != null) { await hideWindow.AnimHide(); } var showWindow = await UIManager.Instance.OpenWindow(showWindowName, data); if (showWindow != null) { await showWindow.AnimShow(); } if (hideWindow != null) { hideWindow.CloseWindow(closeType); } return showWindow; } public static async UniTask AnimSwitchWindow(UIWindow hideWindow, UIWindowCloseType closeType, UIWindow showWindow, object data = null) { if (hideWindow != null) { await hideWindow.AnimHide(); } if (showWindow != null) { if (showWindow.IsOpen()) { showWindow.OpenWindow(data); } else { showWindow.ShowWindow(); } await showWindow.AnimShow(); } if (hideWindow != null) { hideWindow.CloseWindow(closeType); } return showWindow; } //常规的关闭一个最后打开的界面 public static async UniTask NormalCloseWindow(UIWindow hideWindow, String showWindowStr, Object data = null) { var window = Instance.PopWindow(); if (window == null) { hideWindow.OnBack(); return; } await AnimSwitchWindow(hideWindow, UIWindowCloseType.HideAndDestroy, showWindowStr, data); } public static async UniTask NormalCloseWindow(UIWindow hideWindow, Object data = null) { var showWindow = Instance.PopWindow(); if (showWindow == null) { hideWindow.OnBack(); return; } await AnimSwitchWindow(hideWindow, UIWindowCloseType.HideAndDestroy, showWindow, data); } }