NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/UI/UINavigationManager.cs

122 lines
3.1 KiB
C#
Raw Normal View History

2025-12-22 16:55:56 +08:00
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 bool IsWindowInStack(UIWindow window)
{
return _navigationStack.Contains(window);
}
/// <summary>
/// 清空栈
/// </summary>
public void Clear()
{
_navigationStack.Clear();
}
#endregion
}