Files
FlowScope/Packages/com.flowscope.gamecore/Runtime/UI/UIScreenNavigator.cs
2026-06-04 14:54:49 +08:00

51 lines
1.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace FlowScope.UI
{
public sealed class UIScreenNavigator : IUIScreenNavigator
{
private readonly UIManager _uiManager;
private readonly Stack<Action> _closeStack = new();
public UIScreenNavigator(UIManager uiManager)
{
_uiManager = uiManager ?? throw new ArgumentNullException(nameof(uiManager));
}
public bool CanGoBack => _closeStack.Count > 1;
public async Task<TPanel> PushAsync<TPanel, TViewModel>(
TViewModel viewModel,
CancellationToken cancellationToken)
where TPanel : UIPanelBase<TViewModel>
{
var panel = await _uiManager.OpenAsync<TPanel, TViewModel>(viewModel, cancellationToken);
_closeStack.Push(() => _uiManager.Close<TPanel>());
return panel;
}
public void GoBack()
{
if (!CanGoBack)
{
return;
}
var close = _closeStack.Pop();
close();
}
public void Clear()
{
while (_closeStack.Count > 0)
{
var close = _closeStack.Pop();
close();
}
}
}
}