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; }
|
||||
string? DisplayNameText { get; set; }
|
||||
IDeclarativeProperty<bool> IsSelected { get; set; }
|
||||
IObservable<bool>? IsMarked { get; set; }
|
||||
IDeclarativeProperty<bool>? IsMarked { get; set; }
|
||||
IDeclarativeProperty<bool> IsAlternative { get; }
|
||||
IObservable<ItemViewMode> ViewMode { get; set; }
|
||||
DateTime? CreatedAt { get; set; }
|
||||
|
||||
@@ -18,7 +18,7 @@ public interface ITabViewModel : IInitable<ITab, int>, IDisposable
|
||||
IDeclarativeProperty<IItemViewModel?> CurrentSelectedItem { get; }
|
||||
IDeclarativeProperty<IContainerViewModel?> CurrentSelectedItemAsContainer { get; }
|
||||
IDeclarativeProperty<ObservableCollection<IItemViewModel>?> CurrentItems { get; }
|
||||
IObservable<IChangeSet<FullName>> MarkedItems { get; }
|
||||
IDeclarativeProperty<ObservableCollection<FullName>> MarkedItems { get; }
|
||||
IDeclarativeProperty<ObservableCollection<IItemViewModel>> SelectedsChildren { get; }
|
||||
IDeclarativeProperty<ObservableCollection<IItemViewModel>> ParentsChildren { get; }
|
||||
DeclarativeProperty<ItemOrdering?> Ordering { get; }
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Reactive.Linq;
|
||||
using System.Reactive.Subjects;
|
||||
using System.Text.RegularExpressions;
|
||||
using DeclarativeProperty;
|
||||
using DynamicData;
|
||||
using FileTime.App.Core.Interactions;
|
||||
using FileTime.App.Core.Models;
|
||||
using FileTime.App.Core.Models.Enums;
|
||||
using FileTime.App.Core.UserCommand;
|
||||
using FileTime.App.Core.ViewModels;
|
||||
using FileTime.Core.Command;
|
||||
using FileTime.Core.Command.CreateContainer;
|
||||
using FileTime.Core.Command.Move;
|
||||
using FileTime.Core.Extensions;
|
||||
using FileTime.Core.Interactions;
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Core.Timeline;
|
||||
@@ -34,7 +33,7 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
|
||||
private readonly ICommandScheduler _commandScheduler;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ISystemClipboardService _systemClipboardService;
|
||||
private readonly BindedCollection<FullName>? _markedItems;
|
||||
private readonly IDeclarativeProperty<ObservableCollection<FullName>> _markedItems;
|
||||
private IDeclarativeProperty<IContainer?>? _currentLocation;
|
||||
|
||||
public ItemManipulationUserCommandHandlerService(
|
||||
@@ -61,7 +60,7 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
|
||||
SaveCurrentLocation(l => _currentLocation = l);
|
||||
SaveCurrentSelectedItem(i => _currentSelectedItem = i);
|
||||
|
||||
_markedItems = appState.SelectedTab.Select(t => t?.MarkedItems).ToBindedCollection();
|
||||
_markedItems = appState.SelectedTab.Map(t => t?.MarkedItems).Switch();
|
||||
|
||||
AddCommandHandlers(new IUserCommandHandler[]
|
||||
{
|
||||
@@ -80,9 +79,9 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
|
||||
private async Task CopyFilesToClipboardAsync()
|
||||
{
|
||||
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)
|
||||
{
|
||||
@@ -128,9 +127,9 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
|
||||
_clipboardService.Clear();
|
||||
_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);
|
||||
}
|
||||
@@ -214,12 +213,12 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
|
||||
private async Task RenameAsync(RenameCommand command)
|
||||
{
|
||||
List<ItemToMove> itemsToMove = new();
|
||||
if ((_markedItems?.Collection?.Count ?? 0) > 0)
|
||||
if ((_markedItems.Value?.Count ?? 0) > 0)
|
||||
{
|
||||
BehaviorSubject<string> templateRegexValue = 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
|
||||
.Select(item =>
|
||||
@@ -406,9 +405,9 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
|
||||
IList<FullName>? itemsToDelete = null;
|
||||
var shouldDelete = false;
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -55,9 +55,6 @@ public abstract class UserCommandHandlerServiceBase : IUserCommandHandler
|
||||
protected IDisposable SaveCurrentItems(Action<IDeclarativeProperty<ObservableCollection<IItemViewModel>?>?> 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)
|
||||
=> RunWithTimelessContentProvider(timelessContentProvider => timelessContentProvider.CurrentPointInTime.Subscribe(handler));
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ public abstract partial class ItemViewModel : IItemViewModel
|
||||
|
||||
[Property] private IDeclarativeProperty<bool> _isSelected;
|
||||
|
||||
[Property] private IObservable<bool>? _isMarked;
|
||||
[Property] private IDeclarativeProperty<bool>? _isMarked;
|
||||
|
||||
[Property] private IObservable<ItemViewMode> _viewMode;
|
||||
|
||||
@@ -68,8 +68,8 @@ public abstract partial class ItemViewModel : IItemViewModel
|
||||
DisplayNameText = item.DisplayName;
|
||||
|
||||
IsMarked = itemViewModelType is ItemViewModelType.Main
|
||||
? parentTab.MarkedItems.ToCollection().Select(m => m.Any(i => i.Path == item.FullName?.Path))
|
||||
: Observable.Return(false);
|
||||
? parentTab.MarkedItems.Map(m => m.Any(i => i.Path == item.FullName?.Path))
|
||||
: new DeclarativeProperty<bool>(false);
|
||||
|
||||
IsSelected = itemViewModelType is ItemViewModelType.Main
|
||||
? parentTab.CurrentSelectedItem.Map(EqualsTo)
|
||||
|
||||
@@ -29,7 +29,7 @@ public partial class TabViewModel : ITabViewModel
|
||||
private readonly IAppState _appState;
|
||||
private readonly ITimelessContentProvider _timelessContentProvider;
|
||||
private readonly IRefreshSmoothnessCalculator _refreshSmoothnessCalculator;
|
||||
private readonly SourceList<FullName> _markedItems = new();
|
||||
private readonly ObservableCollection<FullName> _markedItems = new();
|
||||
private readonly List<IDisposable> _disposables = new();
|
||||
private bool _disposed;
|
||||
private OcConsumer? _currentItemsConsumer;
|
||||
@@ -45,7 +45,7 @@ public partial class TabViewModel : ITabViewModel
|
||||
public IDeclarativeProperty<IItemViewModel?> CurrentSelectedItem { get; private set; }
|
||||
public IDeclarativeProperty<IContainerViewModel?> CurrentSelectedItemAsContainer { 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>?> ParentsChildren { get; private set; }
|
||||
public DeclarativeProperty<ItemOrdering?> Ordering { get; } = new(ItemOrdering.Name);
|
||||
@@ -60,7 +60,7 @@ public partial class TabViewModel : ITabViewModel
|
||||
_serviceProvider = serviceProvider;
|
||||
_appState = appState;
|
||||
|
||||
MarkedItems = _markedItems.Connect().StartWithEmpty();
|
||||
MarkedItems = _markedItems.Watch();
|
||||
IsSelected = _appState.SelectedTab.Select(s => s == this);
|
||||
_timelessContentProvider = timelessContentProvider;
|
||||
_refreshSmoothnessCalculator = refreshSmoothnessCalculator;
|
||||
@@ -240,14 +240,14 @@ public partial class TabViewModel : ITabViewModel
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public void ToggleMarkedItem(FullName fullName)
|
||||
{
|
||||
if (_markedItems.Items.Any(i => i.Path == fullName.Path))
|
||||
if (_markedItems.Any(i => i.Path == fullName.Path))
|
||||
{
|
||||
RemoveMarkedItem(fullName);
|
||||
}
|
||||
|
||||
@@ -90,4 +90,7 @@ public static class DeclarativePropertyExtensions
|
||||
Func<T1, T2, Task<TResult>> func,
|
||||
Action<TResult?>? setValueHook = null)
|
||||
=> 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