Refactor MarkedItems to DeclarativeProperty
This commit is contained in:
@@ -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; }
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -54,9 +54,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));
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user