Tabs: open, close
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Reactive.Linq;
|
||||
using System.Reactive.Subjects;
|
||||
using DynamicData;
|
||||
using FileTime.App.Core.Models.Enums;
|
||||
using MvvmGen;
|
||||
using MoreLinq;
|
||||
@@ -12,15 +13,16 @@ public abstract partial class AppStateBase : IAppState
|
||||
{
|
||||
private readonly BehaviorSubject<string?> _searchText = new(null);
|
||||
private readonly BehaviorSubject<ITabViewModel?> _selectedTab = new(null);
|
||||
private readonly BehaviorSubject<IEnumerable<ITabViewModel>> _tabs = new(Enumerable.Empty<ITabViewModel>());
|
||||
private readonly BehaviorSubject<ViewMode> _viewMode = new(Models.Enums.ViewMode.Default);
|
||||
private readonly SourceList<ITabViewModel> _tabs = new();
|
||||
|
||||
public IObservable<ViewMode> ViewMode { get; private set; }
|
||||
|
||||
public ObservableCollection<ITabViewModel> Tabs { get; } = new();
|
||||
public ReadOnlyObservableCollection<ITabViewModel> Tabs { get; private set; }
|
||||
public IObservable<string?> SearchText { get; private set; }
|
||||
|
||||
public IObservable<ITabViewModel?> SelectedTab { get; private set; }
|
||||
public ITabViewModel? CurrentSelectedTab { get; private set; }
|
||||
|
||||
[Property] private string _rapidTravelText = "";
|
||||
|
||||
@@ -28,21 +30,39 @@ public abstract partial class AppStateBase : IAppState
|
||||
{
|
||||
ViewMode = _viewMode.AsObservable();
|
||||
|
||||
Tabs.CollectionChanged += (_, _) => _tabs.OnNext(Tabs);
|
||||
var tabsObservable = _tabs.Connect();
|
||||
|
||||
SearchText = _searchText.AsObservable();
|
||||
SelectedTab = Observable.CombineLatest(_tabs, _selectedTab, GetSelectedTab);
|
||||
SelectedTab = Observable.CombineLatest(tabsObservable.ToCollection(), _selectedTab.DistinctUntilChanged(), GetSelectedTab);
|
||||
|
||||
SelectedTab.Subscribe(t =>
|
||||
{
|
||||
_selectedTab.OnNext(t);
|
||||
CurrentSelectedTab = t;
|
||||
});
|
||||
|
||||
tabsObservable
|
||||
.Bind(out var collection)
|
||||
.DisposeMany()
|
||||
.Subscribe();
|
||||
|
||||
Tabs = collection;
|
||||
}
|
||||
|
||||
public void AddTab(ITabViewModel tabViewModel)
|
||||
{
|
||||
Tabs.Add(tabViewModel);
|
||||
if (_tabs.Items.Any(t => t.TabNumber == tabViewModel.TabNumber))
|
||||
throw new ArgumentException($"There is a tab with the same tab number {tabViewModel.TabNumber}.", nameof(tabViewModel));
|
||||
|
||||
var index = _tabs.Items.Count(t => t.TabNumber < tabViewModel.TabNumber);
|
||||
_tabs.Insert(index, tabViewModel);
|
||||
}
|
||||
|
||||
public void RemoveTab(ITabViewModel tabViewModel)
|
||||
{
|
||||
if (!Tabs.Contains(tabViewModel)) return;
|
||||
if (!_tabs.Items.Contains(tabViewModel)) return;
|
||||
|
||||
Tabs.Remove(tabViewModel);
|
||||
_tabs.Remove(tabViewModel);
|
||||
}
|
||||
|
||||
public void SetSearchText(string? searchText) => _searchText.OnNext(searchText);
|
||||
@@ -56,7 +76,7 @@ public abstract partial class AppStateBase : IAppState
|
||||
|
||||
private ITabViewModel? GetSelectedTab(IEnumerable<ITabViewModel> tabs, ITabViewModel? expectedSelectedTab)
|
||||
{
|
||||
var (prefered, others) = tabs.OrderBy(t => t.TabNumber).Partition(t => t.TabNumber >= (expectedSelectedTab?.TabNumber ?? 0));
|
||||
return prefered.Concat(others).FirstOrDefault();
|
||||
var (preferred, others) = tabs.OrderBy(t => t.TabNumber).Partition(t => t.TabNumber >= (expectedSelectedTab?.TabNumber ?? 0));
|
||||
return preferred.Concat(others).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user