Refactor MarkedItems to DeclarativeProperty

This commit is contained in:
2023-08-02 09:59:53 +02:00
parent c2fbc32159
commit 5508828717
7 changed files with 24 additions and 25 deletions

View File

@@ -11,7 +11,7 @@ public interface IItemViewModel : IInitable<IItem, ITabViewModel, ItemViewModelT
IDeclarativeProperty<IReadOnlyList<ItemNamePart>>? DisplayName { get; } IDeclarativeProperty<IReadOnlyList<ItemNamePart>>? DisplayName { get; }
string? DisplayNameText { get; set; } string? DisplayNameText { get; set; }
IDeclarativeProperty<bool> IsSelected { get; set; } IDeclarativeProperty<bool> IsSelected { get; set; }
IObservable<bool>? IsMarked { get; set; } IDeclarativeProperty<bool>? IsMarked { get; set; }
IDeclarativeProperty<bool> IsAlternative { get; } IDeclarativeProperty<bool> IsAlternative { get; }
IObservable<ItemViewMode> ViewMode { get; set; } IObservable<ItemViewMode> ViewMode { get; set; }
DateTime? CreatedAt { get; set; } DateTime? CreatedAt { get; set; }

View File

@@ -18,7 +18,7 @@ public interface ITabViewModel : IInitable<ITab, int>, IDisposable
IDeclarativeProperty<IItemViewModel?> CurrentSelectedItem { get; } IDeclarativeProperty<IItemViewModel?> CurrentSelectedItem { get; }
IDeclarativeProperty<IContainerViewModel?> CurrentSelectedItemAsContainer { get; } IDeclarativeProperty<IContainerViewModel?> CurrentSelectedItemAsContainer { get; }
IDeclarativeProperty<ObservableCollection<IItemViewModel>?> CurrentItems { get; } IDeclarativeProperty<ObservableCollection<IItemViewModel>?> CurrentItems { get; }
IObservable<IChangeSet<FullName>> MarkedItems { get; } IDeclarativeProperty<ObservableCollection<FullName>> MarkedItems { get; }
IDeclarativeProperty<ObservableCollection<IItemViewModel>> SelectedsChildren { get; } IDeclarativeProperty<ObservableCollection<IItemViewModel>> SelectedsChildren { get; }
IDeclarativeProperty<ObservableCollection<IItemViewModel>> ParentsChildren { get; } IDeclarativeProperty<ObservableCollection<IItemViewModel>> ParentsChildren { get; }
DeclarativeProperty<ItemOrdering?> Ordering { get; } DeclarativeProperty<ItemOrdering?> Ordering { get; }

View File

@@ -1,17 +1,16 @@
using System.Collections.ObjectModel;
using System.Reactive.Linq; using System.Reactive.Linq;
using System.Reactive.Subjects; using System.Reactive.Subjects;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using DeclarativeProperty; using DeclarativeProperty;
using DynamicData; using DynamicData;
using FileTime.App.Core.Interactions; using FileTime.App.Core.Interactions;
using FileTime.App.Core.Models;
using FileTime.App.Core.Models.Enums; using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.UserCommand; using FileTime.App.Core.UserCommand;
using FileTime.App.Core.ViewModels; using FileTime.App.Core.ViewModels;
using FileTime.Core.Command; using FileTime.Core.Command;
using FileTime.Core.Command.CreateContainer; using FileTime.Core.Command.CreateContainer;
using FileTime.Core.Command.Move; using FileTime.Core.Command.Move;
using FileTime.Core.Extensions;
using FileTime.Core.Interactions; using FileTime.Core.Interactions;
using FileTime.Core.Models; using FileTime.Core.Models;
using FileTime.Core.Timeline; using FileTime.Core.Timeline;
@@ -34,7 +33,7 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
private readonly ICommandScheduler _commandScheduler; private readonly ICommandScheduler _commandScheduler;
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private readonly ISystemClipboardService _systemClipboardService; private readonly ISystemClipboardService _systemClipboardService;
private readonly BindedCollection<FullName>? _markedItems; private readonly IDeclarativeProperty<ObservableCollection<FullName>> _markedItems;
private IDeclarativeProperty<IContainer?>? _currentLocation; private IDeclarativeProperty<IContainer?>? _currentLocation;
public ItemManipulationUserCommandHandlerService( public ItemManipulationUserCommandHandlerService(
@@ -61,7 +60,7 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
SaveCurrentLocation(l => _currentLocation = l); SaveCurrentLocation(l => _currentLocation = l);
SaveCurrentSelectedItem(i => _currentSelectedItem = i); SaveCurrentSelectedItem(i => _currentSelectedItem = i);
_markedItems = appState.SelectedTab.Select(t => t?.MarkedItems).ToBindedCollection(); _markedItems = appState.SelectedTab.Map(t => t?.MarkedItems).Switch();
AddCommandHandlers(new IUserCommandHandler[] AddCommandHandlers(new IUserCommandHandler[]
{ {
@@ -80,9 +79,9 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
private async Task CopyFilesToClipboardAsync() private async Task CopyFilesToClipboardAsync()
{ {
var list = new List<FullName>(); var list = new List<FullName>();
if ((_markedItems?.Collection?.Count ?? 0) > 0) if ((_markedItems.Value?.Count ?? 0) > 0)
{ {
list.AddRange(_markedItems!.Collection!); list.AddRange(_markedItems.Value!);
} }
else if(_currentSelectedItem?.Value?.BaseItem?.FullName is { } selectedItemName) else if(_currentSelectedItem?.Value?.BaseItem?.FullName is { } selectedItemName)
{ {
@@ -128,9 +127,9 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
_clipboardService.Clear(); _clipboardService.Clear();
_clipboardService.SetCommand<FileTime.Core.Command.Copy.CopyCommandFactory>(); _clipboardService.SetCommand<FileTime.Core.Command.Copy.CopyCommandFactory>();
if ((_markedItems?.Collection?.Count ?? 0) > 0) if ((_markedItems.Value?.Count ?? 0) > 0)
{ {
foreach (var item in _markedItems!.Collection!) foreach (var item in _markedItems.Value!)
{ {
_clipboardService.AddContent(item); _clipboardService.AddContent(item);
} }
@@ -214,12 +213,12 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
private async Task RenameAsync(RenameCommand command) private async Task RenameAsync(RenameCommand command)
{ {
List<ItemToMove> itemsToMove = new(); List<ItemToMove> itemsToMove = new();
if ((_markedItems?.Collection?.Count ?? 0) > 0) if ((_markedItems.Value?.Count ?? 0) > 0)
{ {
BehaviorSubject<string> templateRegexValue = new(string.Empty); BehaviorSubject<string> templateRegexValue = new(string.Empty);
BehaviorSubject<string> newNameSchemaValue = new(string.Empty); BehaviorSubject<string> newNameSchemaValue = new(string.Empty);
var itemsToRename = new List<FullName>(_markedItems!.Collection!); var itemsToRename = new List<FullName>(_markedItems.Value!);
var itemPreviews = itemsToRename var itemPreviews = itemsToRename
.Select(item => .Select(item =>
@@ -406,9 +405,9 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
IList<FullName>? itemsToDelete = null; IList<FullName>? itemsToDelete = null;
var shouldDelete = false; var shouldDelete = false;
string? questionText = null; string? questionText = null;
if ((_markedItems?.Collection?.Count ?? 0) > 0) if ((_markedItems.Value?.Count ?? 0) > 0)
{ {
itemsToDelete = new List<FullName>(_markedItems!.Collection!); itemsToDelete = new List<FullName>(_markedItems.Value!);
} }
else if (_currentSelectedItem?.Value?.BaseItem?.FullName is not null) else if (_currentSelectedItem?.Value?.BaseItem?.FullName is not null)
{ {

View File

@@ -55,9 +55,6 @@ public abstract class UserCommandHandlerServiceBase : IUserCommandHandler
protected IDisposable SaveCurrentItems(Action<IDeclarativeProperty<ObservableCollection<IItemViewModel>?>?> handler) protected IDisposable SaveCurrentItems(Action<IDeclarativeProperty<ObservableCollection<IItemViewModel>?>?> handler)
=> RunWithAppState(appState => appState.SelectedTab.Select(t => t?.CurrentItems).Subscribe(handler)); => RunWithAppState(appState => appState.SelectedTab.Select(t => t?.CurrentItems).Subscribe(handler));
protected IDisposable SaveMarkedItems(Action<IChangeSet<FullName>> handler)
=> RunWithAppState(appState => appState.SelectedTab.Select(t => t == null ? Observable.Empty<IChangeSet<FullName>>() : t.MarkedItems).Switch().Subscribe(handler));
protected IDisposable SaveCurrentPointInTime(Action<PointInTime> handler) protected IDisposable SaveCurrentPointInTime(Action<PointInTime> handler)
=> RunWithTimelessContentProvider(timelessContentProvider => timelessContentProvider.CurrentPointInTime.Subscribe(handler)); => RunWithTimelessContentProvider(timelessContentProvider => timelessContentProvider.CurrentPointInTime.Subscribe(handler));

View File

@@ -25,7 +25,7 @@ public abstract partial class ItemViewModel : IItemViewModel
[Property] private IDeclarativeProperty<bool> _isSelected; [Property] private IDeclarativeProperty<bool> _isSelected;
[Property] private IObservable<bool>? _isMarked; [Property] private IDeclarativeProperty<bool>? _isMarked;
[Property] private IObservable<ItemViewMode> _viewMode; [Property] private IObservable<ItemViewMode> _viewMode;
@@ -68,8 +68,8 @@ public abstract partial class ItemViewModel : IItemViewModel
DisplayNameText = item.DisplayName; DisplayNameText = item.DisplayName;
IsMarked = itemViewModelType is ItemViewModelType.Main IsMarked = itemViewModelType is ItemViewModelType.Main
? parentTab.MarkedItems.ToCollection().Select(m => m.Any(i => i.Path == item.FullName?.Path)) ? parentTab.MarkedItems.Map(m => m.Any(i => i.Path == item.FullName?.Path))
: Observable.Return(false); : new DeclarativeProperty<bool>(false);
IsSelected = itemViewModelType is ItemViewModelType.Main IsSelected = itemViewModelType is ItemViewModelType.Main
? parentTab.CurrentSelectedItem.Map(EqualsTo) ? parentTab.CurrentSelectedItem.Map(EqualsTo)

View File

@@ -29,7 +29,7 @@ public partial class TabViewModel : ITabViewModel
private readonly IAppState _appState; private readonly IAppState _appState;
private readonly ITimelessContentProvider _timelessContentProvider; private readonly ITimelessContentProvider _timelessContentProvider;
private readonly IRefreshSmoothnessCalculator _refreshSmoothnessCalculator; private readonly IRefreshSmoothnessCalculator _refreshSmoothnessCalculator;
private readonly SourceList<FullName> _markedItems = new(); private readonly ObservableCollection<FullName> _markedItems = new();
private readonly List<IDisposable> _disposables = new(); private readonly List<IDisposable> _disposables = new();
private bool _disposed; private bool _disposed;
private OcConsumer? _currentItemsConsumer; private OcConsumer? _currentItemsConsumer;
@@ -45,7 +45,7 @@ public partial class TabViewModel : ITabViewModel
public IDeclarativeProperty<IItemViewModel?> CurrentSelectedItem { get; private set; } public IDeclarativeProperty<IItemViewModel?> CurrentSelectedItem { get; private set; }
public IDeclarativeProperty<IContainerViewModel?> CurrentSelectedItemAsContainer { get; private set; } public IDeclarativeProperty<IContainerViewModel?> CurrentSelectedItemAsContainer { get; private set; }
public IDeclarativeProperty<ObservableCollection<IItemViewModel>?> CurrentItems { get; private set; } public IDeclarativeProperty<ObservableCollection<IItemViewModel>?> CurrentItems { get; private set; }
public IObservable<IChangeSet<FullName>> MarkedItems { get; } public IDeclarativeProperty<ObservableCollection<FullName>> MarkedItems { get; }
public IDeclarativeProperty<ObservableCollection<IItemViewModel>?> SelectedsChildren { get; private set; } public IDeclarativeProperty<ObservableCollection<IItemViewModel>?> SelectedsChildren { get; private set; }
public IDeclarativeProperty<ObservableCollection<IItemViewModel>?> ParentsChildren { get; private set; } public IDeclarativeProperty<ObservableCollection<IItemViewModel>?> ParentsChildren { get; private set; }
public DeclarativeProperty<ItemOrdering?> Ordering { get; } = new(ItemOrdering.Name); public DeclarativeProperty<ItemOrdering?> Ordering { get; } = new(ItemOrdering.Name);
@@ -60,7 +60,7 @@ public partial class TabViewModel : ITabViewModel
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_appState = appState; _appState = appState;
MarkedItems = _markedItems.Connect().StartWithEmpty(); MarkedItems = _markedItems.Watch();
IsSelected = _appState.SelectedTab.Select(s => s == this); IsSelected = _appState.SelectedTab.Select(s => s == this);
_timelessContentProvider = timelessContentProvider; _timelessContentProvider = timelessContentProvider;
_refreshSmoothnessCalculator = refreshSmoothnessCalculator; _refreshSmoothnessCalculator = refreshSmoothnessCalculator;
@@ -240,14 +240,14 @@ public partial class TabViewModel : ITabViewModel
public void RemoveMarkedItem(FullName fullName) public void RemoveMarkedItem(FullName fullName)
{ {
var itemsToRemove = _markedItems.Items.Where(i => i.Path == fullName.Path).ToList(); var itemsToRemove = _markedItems.Where(i => i.Path == fullName.Path).ToList();
_markedItems.RemoveMany(itemsToRemove); _markedItems.RemoveMany(itemsToRemove);
} }
public void ToggleMarkedItem(FullName fullName) public void ToggleMarkedItem(FullName fullName)
{ {
if (_markedItems.Items.Any(i => i.Path == fullName.Path)) if (_markedItems.Any(i => i.Path == fullName.Path))
{ {
RemoveMarkedItem(fullName); RemoveMarkedItem(fullName);
} }

View File

@@ -90,4 +90,7 @@ public static class DeclarativePropertyExtensions
Func<T1, T2, Task<TResult>> func, Func<T1, T2, Task<TResult>> func,
Action<TResult?>? setValueHook = null) Action<TResult?>? setValueHook = null)
=> new CombineLatestProperty<T1,T2,TResult?>(prop1, prop2, func, setValueHook); => new CombineLatestProperty<T1,T2,TResult?>(prop1, prop2, func, setValueHook);
public static IDeclarativeProperty<T?> Switch<T>(this IDeclarativeProperty<IDeclarativeProperty<T>> from)
=> new SwitchProperty<T>(from);
} }