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

138 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}