using System.Collections.Generic; using CommunityToolkit.Mvvm.Messaging; using StrixMusic.Shells.Groove.Messages.Navigation; using StrixMusic.Shells.Groove.Messages.Navigation.Pages; using StrixMusic.Shells.Groove.Messages.Navigation.Pages.Abstract; namespace StrixMusic.Shells.Groove.Helper { /// /// A class for tracking navigation history. /// public class NavigationTracker { private Stack? _navigationStack; /// /// Initializes a new instance of the class. /// public void Initialize() { _navigationStack = new Stack(); WeakReferenceMessenger.Default.Register(this, (s, e) => NavigateBackwards()); WeakReferenceMessenger.Default.Register(this, (s, e) => RecordNavigation(e)); WeakReferenceMessenger.Default.Register(this, (s, e) => RecordNavigation(e)); WeakReferenceMessenger.Default.Register(this, (s, e) => RecordNavigation(e)); WeakReferenceMessenger.Default.Register(this, (s, e) => RecordNavigation(e)); WeakReferenceMessenger.Default.Register(this, (s, e) => RecordNavigation(e)); } /// /// Gets the singleton instance of this class. /// public static NavigationTracker Instance { get; } = new NavigationTracker(); /// /// Gets whether or not the navigation can go backwards. /// public bool CanGoBack => _navigationStack != null ? _navigationStack.Count > 1 : false; /// /// Navigates backwards. /// public void NavigateBackwards() { if (!CanGoBack || _navigationStack == null) return; _navigationStack.Pop(); PageNavigationRequestMessage previous = _navigationStack.Peek(); previous.RecordNavigation = false; switch (previous) { case AlbumViewNavigationRequestMessage albumViewNavigationRequest: WeakReferenceMessenger.Default.Send(albumViewNavigationRequest); break; case ArtistViewNavigationRequestMessage artistViewNavigationRequest: WeakReferenceMessenger.Default.Send(artistViewNavigationRequest); break; case HomeViewNavigationRequestMessage homeViewNavigationRequest: WeakReferenceMessenger.Default.Send(homeViewNavigationRequest); break; case PlaylistsViewNavigationRequestMessage playlistViewNavigationRequest: WeakReferenceMessenger.Default.Send(playlistViewNavigationRequest); break; } } private void RecordNavigation(T viewModel) where T : PageNavigationRequestMessage { if (_navigationStack == null) return; if (viewModel.RecordNavigation) _navigationStack.Push(viewModel); } } }