| 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);    }}
 |