51 lines
1.3 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|