138 lines
3.5 KiB
C#
138 lines
3.5 KiB
C#
using System.Collections.Generic;
|
||
|
||
/// <summary>
|
||
/// UI导航栈管理器
|
||
/// 负责管理窗口的入栈、出栈和返回历史
|
||
/// </summary>
|
||
public class UINavigationManager
|
||
{
|
||
#region Singleton
|
||
private static UINavigationManager _instance;
|
||
public static UINavigationManager Instance
|
||
{
|
||
get
|
||
{
|
||
if (_instance == null)
|
||
{
|
||
_instance = new UINavigationManager();
|
||
}
|
||
return _instance;
|
||
}
|
||
}
|
||
|
||
private UINavigationManager() { }
|
||
#endregion
|
||
|
||
#region Fields
|
||
/// <summary>
|
||
/// 导航栈:存储窗口的返回历史
|
||
/// </summary>
|
||
private List<UIWindow> _navigationStack = new List<UIWindow>(8);
|
||
|
||
/// <summary>
|
||
/// 对外只读访问(用于兼容旧代码)
|
||
/// </summary>
|
||
public List<UIWindow> NavigationStack => _navigationStack;
|
||
|
||
/// <summary>
|
||
/// 栈中窗口数量
|
||
/// </summary>
|
||
public int Count => _navigationStack.Count;
|
||
#endregion
|
||
|
||
#region Stack Operations
|
||
/// <summary>
|
||
/// 处理窗口入栈(根据配置)
|
||
/// </summary>
|
||
/// <param name="window">窗口实例</param>
|
||
/// <param name="stackMode">栈管理模式</param>
|
||
public void HandleWindowOpen(UIWindow window, UIStackMode stackMode)
|
||
{
|
||
if (window == null) return;
|
||
|
||
switch (stackMode)
|
||
{
|
||
case UIStackMode.None:
|
||
// 不入栈(如Tips、HUD)
|
||
break;
|
||
|
||
case UIStackMode.Stackable:
|
||
// 普通入栈
|
||
if (!_navigationStack.Contains(window))
|
||
{
|
||
_navigationStack.Add(window);
|
||
}
|
||
break;
|
||
|
||
case UIStackMode.Replace:
|
||
// 替换栈顶
|
||
if (_navigationStack.Count > 0)
|
||
{
|
||
var top = _navigationStack[_navigationStack.Count - 1];
|
||
_navigationStack.RemoveAt(_navigationStack.Count - 1);
|
||
}
|
||
_navigationStack.Add(window);
|
||
break;
|
||
|
||
case UIStackMode.ClearAndPush:
|
||
// 清空后入栈
|
||
_navigationStack.Clear();
|
||
_navigationStack.Add(window);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 处理窗口关闭(出栈)
|
||
/// </summary>
|
||
/// <param name="window">窗口实例</param>
|
||
public void HandleWindowClose(UIWindow window)
|
||
{
|
||
if (window != null && _navigationStack.Contains(window))
|
||
{
|
||
_navigationStack.Remove(window);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取栈顶窗口
|
||
/// </summary>
|
||
public UIWindow GetTopWindow()
|
||
{
|
||
return _navigationStack.Count > 0 ? _navigationStack[_navigationStack.Count - 1] : null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取栈顶的全屏窗口
|
||
/// </summary>
|
||
public UIWindow GetTopFullScreenWindow()
|
||
{
|
||
for (int i = _navigationStack.Count - 1; i >= 0; i--)
|
||
{
|
||
var window = _navigationStack[i];
|
||
if (UIManager.Instance.CheckWindowIsFullScreen(window))
|
||
{
|
||
return window;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 检查窗口是否在栈中
|
||
/// </summary>
|
||
public bool IsWindowInStack(UIWindow window)
|
||
{
|
||
return _navigationStack.Contains(window);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 清空栈
|
||
/// </summary>
|
||
public void Clear()
|
||
{
|
||
_navigationStack.Clear();
|
||
}
|
||
#endregion
|
||
}
|