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 _closeStack = new(); public UIScreenNavigator(UIManager uiManager) { _uiManager = uiManager ?? throw new ArgumentNullException(nameof(uiManager)); } public bool CanGoBack => _closeStack.Count > 1; public async Task PushAsync( TViewModel viewModel, CancellationToken cancellationToken) where TPanel : UIPanelBase { var panel = await _uiManager.OpenAsync(viewModel, cancellationToken); _closeStack.Push(() => _uiManager.Close()); 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(); } } } }