1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- namespace InABox.Avalonia.Router;
- public enum RouterDirection
- {
- Forward,
- Backward
- }
- public class HistoryRouter<TViewModelBase>: Router<TViewModelBase> where TViewModelBase: class
- {
-
- private int _historyIndex = -1;
- private List<TViewModelBase> _history = new();
- private readonly uint _historyMaxSize = 100;
- public bool HasNext => _history.Count > 0 && _historyIndex < _history.Count - 1;
- public bool HasPrev => _historyIndex > 0;
-
- public event Action<TViewModelBase,RouterDirection>? CurrentViewModelChanging;
-
- public HistoryRouter(Func<Type, TViewModelBase> createViewModel) : base(createViewModel)
- {
- }
-
- // pushState
- // popState
- // replaceState
- public void Push(TViewModelBase item)
- {
- if (HasNext)
- {
- _history = _history.Take(_historyIndex + 1).ToList();
- }
- _history.Add(item);
- _historyIndex = _history.Count - 1;
- if (_history.Count > _historyMaxSize)
- {
- _history.RemoveAt(0);
- }
- }
-
- public TViewModelBase? Go(int offset = 0)
- {
-
- if (offset == 0)
- {
- return default;
- }
- var newIndex = _historyIndex + offset;
- if (newIndex < 0 || newIndex > _history.Count - 1)
- {
- return default;
- }
-
- _historyIndex = newIndex;
- var viewModel = _history.ElementAt(_historyIndex);
-
- CurrentViewModelChanging?.Invoke(viewModel, offset >= 0 ? RouterDirection.Forward : RouterDirection.Backward);
- CurrentViewModel = viewModel;
- return viewModel;
- }
-
- public TViewModelBase? Back() => HasPrev ? Go(-1) : default;
-
- public TViewModelBase? Forward() => HasNext ? Go(1) : default;
- private T InternalGoTo<T>(RouterDirection direction, Action<T>? configure = null) where T: TViewModelBase
- {
- var destination = InstantiateViewModel<T>(configure);
- CurrentViewModelChanging?.Invoke(destination, direction);
- CurrentViewModel = destination;
- Push(destination);
- return destination;
- }
-
- public T Reset<T>(Action<T>? configure = null) where T: TViewModelBase
- {
- _historyIndex = -1;
- _history.Clear();
- return InternalGoTo<T>(RouterDirection.Backward, configure);
- }
-
- public override T GoTo<T>(Action<T>? configure = null)
- {
- return InternalGoTo<T>(RouterDirection.Forward, configure);
- }
- }
|