diff --git a/src/AppCommon/FileTime.App.Core.Abstraction/ViewModels/IItemViewModel.cs b/src/AppCommon/FileTime.App.Core.Abstraction/ViewModels/IItemViewModel.cs index 7c1315b..acfc6e2 100644 --- a/src/AppCommon/FileTime.App.Core.Abstraction/ViewModels/IItemViewModel.cs +++ b/src/AppCommon/FileTime.App.Core.Abstraction/ViewModels/IItemViewModel.cs @@ -11,7 +11,7 @@ public interface IItemViewModel : IInitable>? DisplayName { get; } string? DisplayNameText { get; set; } IDeclarativeProperty IsSelected { get; set; } - IObservable? IsMarked { get; set; } + IDeclarativeProperty? IsMarked { get; set; } IDeclarativeProperty IsAlternative { get; } IObservable ViewMode { get; set; } DateTime? CreatedAt { get; set; } diff --git a/src/AppCommon/FileTime.App.Core.Abstraction/ViewModels/ITabViewModel.cs b/src/AppCommon/FileTime.App.Core.Abstraction/ViewModels/ITabViewModel.cs index 7369e5b..4bf4f19 100644 --- a/src/AppCommon/FileTime.App.Core.Abstraction/ViewModels/ITabViewModel.cs +++ b/src/AppCommon/FileTime.App.Core.Abstraction/ViewModels/ITabViewModel.cs @@ -18,7 +18,7 @@ public interface ITabViewModel : IInitable, IDisposable IDeclarativeProperty CurrentSelectedItem { get; } IDeclarativeProperty CurrentSelectedItemAsContainer { get; } IDeclarativeProperty?> CurrentItems { get; } - IObservable> MarkedItems { get; } + IDeclarativeProperty> MarkedItems { get; } IDeclarativeProperty> SelectedsChildren { get; } IDeclarativeProperty> ParentsChildren { get; } DeclarativeProperty Ordering { get; } diff --git a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs index 3b9d3b9..29c26c2 100644 --- a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs +++ b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs @@ -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? _markedItems; + private readonly IDeclarativeProperty> _markedItems; private IDeclarativeProperty? _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(); - 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(); - 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 itemsToMove = new(); - if ((_markedItems?.Collection?.Count ?? 0) > 0) + if ((_markedItems.Value?.Count ?? 0) > 0) { BehaviorSubject templateRegexValue = new(string.Empty); BehaviorSubject newNameSchemaValue = new(string.Empty); - var itemsToRename = new List(_markedItems!.Collection!); + var itemsToRename = new List(_markedItems.Value!); var itemPreviews = itemsToRename .Select(item => @@ -406,9 +405,9 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi IList? itemsToDelete = null; var shouldDelete = false; string? questionText = null; - if ((_markedItems?.Collection?.Count ?? 0) > 0) + if ((_markedItems.Value?.Count ?? 0) > 0) { - itemsToDelete = new List(_markedItems!.Collection!); + itemsToDelete = new List(_markedItems.Value!); } else if (_currentSelectedItem?.Value?.BaseItem?.FullName is not null) { diff --git a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/UserCommandHandlerServiceBase.cs b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/UserCommandHandlerServiceBase.cs index cec3b9e..dbede0b 100644 --- a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/UserCommandHandlerServiceBase.cs +++ b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/UserCommandHandlerServiceBase.cs @@ -54,9 +54,6 @@ public abstract class UserCommandHandlerServiceBase : IUserCommandHandler protected IDisposable SaveCurrentItems(Action?>?> handler) => RunWithAppState(appState => appState.SelectedTab.Select(t => t?.CurrentItems).Subscribe(handler)); - - protected IDisposable SaveMarkedItems(Action> handler) - => RunWithAppState(appState => appState.SelectedTab.Select(t => t == null ? Observable.Empty>() : t.MarkedItems).Switch().Subscribe(handler)); protected IDisposable SaveCurrentPointInTime(Action handler) => RunWithTimelessContentProvider(timelessContentProvider => timelessContentProvider.CurrentPointInTime.Subscribe(handler)); diff --git a/src/AppCommon/FileTime.App.Core/ViewModels/ItemViewModel.cs b/src/AppCommon/FileTime.App.Core/ViewModels/ItemViewModel.cs index bde6934..5632c4a 100644 --- a/src/AppCommon/FileTime.App.Core/ViewModels/ItemViewModel.cs +++ b/src/AppCommon/FileTime.App.Core/ViewModels/ItemViewModel.cs @@ -25,7 +25,7 @@ public abstract partial class ItemViewModel : IItemViewModel [Property] private IDeclarativeProperty _isSelected; - [Property] private IObservable? _isMarked; + [Property] private IDeclarativeProperty? _isMarked; [Property] private IObservable _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(false); IsSelected = itemViewModelType is ItemViewModelType.Main ? parentTab.CurrentSelectedItem.Map(EqualsTo) diff --git a/src/AppCommon/FileTime.App.Core/ViewModels/TabViewModel.cs b/src/AppCommon/FileTime.App.Core/ViewModels/TabViewModel.cs index 372f106..0dc98fe 100644 --- a/src/AppCommon/FileTime.App.Core/ViewModels/TabViewModel.cs +++ b/src/AppCommon/FileTime.App.Core/ViewModels/TabViewModel.cs @@ -29,7 +29,7 @@ public partial class TabViewModel : ITabViewModel private readonly IAppState _appState; private readonly ITimelessContentProvider _timelessContentProvider; private readonly IRefreshSmoothnessCalculator _refreshSmoothnessCalculator; - private readonly SourceList _markedItems = new(); + private readonly ObservableCollection _markedItems = new(); private readonly List _disposables = new(); private bool _disposed; private OcConsumer? _currentItemsConsumer; @@ -45,7 +45,7 @@ public partial class TabViewModel : ITabViewModel public IDeclarativeProperty CurrentSelectedItem { get; private set; } public IDeclarativeProperty CurrentSelectedItemAsContainer { get; private set; } public IDeclarativeProperty?> CurrentItems { get; private set; } - public IObservable> MarkedItems { get; } + public IDeclarativeProperty> MarkedItems { get; } public IDeclarativeProperty?> SelectedsChildren { get; private set; } public IDeclarativeProperty?> ParentsChildren { get; private set; } public DeclarativeProperty 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); } diff --git a/src/Library/DeclarativeProperty/DeclarativePropertyExtensions.cs b/src/Library/DeclarativeProperty/DeclarativePropertyExtensions.cs index 1bfdffc..01a871a 100644 --- a/src/Library/DeclarativeProperty/DeclarativePropertyExtensions.cs +++ b/src/Library/DeclarativeProperty/DeclarativePropertyExtensions.cs @@ -90,4 +90,7 @@ public static class DeclarativePropertyExtensions Func> func, Action? setValueHook = null) => new CombineLatestProperty(prop1, prop2, func, setValueHook); + + public static IDeclarativeProperty Switch(this IDeclarativeProperty> from) + => new SwitchProperty(from); } \ No newline at end of file