Command execution, CreateContainer command WIP

This commit is contained in:
2022-05-23 18:12:22 +02:00
parent 6b3a8f7127
commit d4bd9d3ba1
29 changed files with 499 additions and 26 deletions

View File

@@ -0,0 +1,9 @@
using System.Collections.ObjectModel;
namespace FileTime.App.Core.Extensions;
public static class DisposableExtensions
{
public static void AddToDisposables(this IDisposable disposable, ICollection<IDisposable> collection)
=> collection.Add(disposable);
}

View File

@@ -7,7 +7,7 @@ using InitableService;
namespace FileTime.App.Core.ViewModels;
public interface ITabViewModel : IInitable<ITab, int>
public interface ITabViewModel : IInitable<ITab, int>, IDisposable
{
ITab? Tab { get; }
int TabNumber { get; }

View File

@@ -22,6 +22,7 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
private readonly IInputInterface _inputInterface;
private readonly ILogger<ItemManipulationUserCommandHandlerService> _logger;
private readonly ITimelessContentProvider _timelessContentProvider;
private readonly ICommandScheduler _commandScheduler;
private readonly BindedCollection<FullName>? _markedItems;
private PointInTime _currentPointInTime;
@@ -31,13 +32,15 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
IClipboardService clipboardService,
IInputInterface inputInterface,
ILogger<ItemManipulationUserCommandHandlerService> logger,
ITimelessContentProvider timelessContentProvider) : base(appState, timelessContentProvider)
ITimelessContentProvider timelessContentProvider,
ICommandScheduler commandScheduler) : base(appState, timelessContentProvider)
{
_userCommandHandlerService = userCommandHandlerService;
_clipboardService = clipboardService;
_inputInterface = inputInterface;
_logger = logger;
_timelessContentProvider = timelessContentProvider;
_commandScheduler = commandScheduler;
_currentPointInTime = null!;
SaveSelectedTab(t => _selectedTab = t);
@@ -128,5 +131,6 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi
var newContainerName = containerNameInput.Value;
var command = new CreateContainerCommand();
await _commandScheduler.AddCommand(command);
}
}

View File

@@ -67,7 +67,8 @@ public class NavigationUserCommandHandlerService : UserCommandHandlerServiceBase
private Task OpenSelected()
{
if (_currentSelectedItem is not IContainerViewModel containerViewModel || containerViewModel.Container is null) return Task.CompletedTask;
if (_currentSelectedItem is not IContainerViewModel containerViewModel || containerViewModel.Container is null)
return Task.CompletedTask;
_selectedTab?.Tab?.SetCurrentLocation(containerViewModel.Container);
return Task.CompletedTask;
@@ -75,7 +76,8 @@ public class NavigationUserCommandHandlerService : UserCommandHandlerServiceBase
private async Task GoUp()
{
if (_currentLocation?.Parent is not AbsolutePath parentPath || await parentPath.ResolveAsyncSafe() is not IContainer newContainer) return;
if (_currentLocation?.Parent is not AbsolutePath parentPath ||
await parentPath.ResolveAsyncSafe() is not IContainer newContainer) return;
_selectedTab?.Tab?.SetCurrentLocation(newContainer);
}
@@ -125,7 +127,8 @@ public class NavigationUserCommandHandlerService : UserCommandHandlerServiceBase
}
else if (tabViewModel == null)
{
var tab = _serviceProvider.GetInitableResolver<IContainer>(_currentLocation ?? _localContentProvider).GetRequiredService<ITab>();
var tab = _serviceProvider.GetInitableResolver<IContainer>(_currentLocation ?? _localContentProvider)
.GetRequiredService<ITab>();
var newTabViewModel = _serviceProvider.GetInitableResolver(tab, number).GetRequiredService<ITabViewModel>();
_appState.AddTab(newTabViewModel);
@@ -144,9 +147,18 @@ public class NavigationUserCommandHandlerService : UserCommandHandlerServiceBase
private Task CloseTab()
{
if (_appState.Tabs.Count < 2) return Task.CompletedTask;
if (_appState.Tabs.Count < 2 || _selectedTab == null) return Task.CompletedTask;
_appState.RemoveTab(_selectedTab!);
var tabToRemove = _selectedTab;
_appState.RemoveTab(tabToRemove!);
try
{
tabToRemove.Dispose();
}
catch
{
}
return Task.CompletedTask;
}

View File

@@ -13,7 +13,7 @@ using MvvmGen;
namespace FileTime.App.Core.ViewModels;
[ViewModel]
public partial class TabViewModel : ITabViewModel, IDisposable
public partial class TabViewModel : ITabViewModel
{
private readonly IServiceProvider _serviceProvider;
private readonly IItemNameConverterService _itemNameConverterService;
@@ -70,6 +70,8 @@ public partial class TabViewModel : ITabViewModel, IDisposable
Tab = tab;
TabNumber = tabNumber;
tab.AddToDisposables(_disposables);
CurrentLocation = tab.CurrentLocation.AsObservable();
CurrentItems = tab.CurrentItems
.Select(items => items?.Transform(i => MapItemToViewModel(i, ItemViewModelType.Main)))
@@ -105,7 +107,7 @@ public partial class TabViewModel : ITabViewModel, IDisposable
ParentsChildrenCollection = new(ParentsChildren);
SelectedsChildrenCollection = new(SelectedsChildren);
tab.CurrentLocation.Subscribe((_) => _markedItems.Clear());
tab.CurrentLocation.Subscribe((_) => _markedItems.Clear()).AddToDisposables(_disposables);
IObservable<IObservable<IChangeSet<IItemViewModel>>?> InitSelectedsChildren()
{

View File

@@ -1,8 +1,10 @@
using FileTime.App.Core;
using FileTime.Core.Command;
using FileTime.Core.Services;
using FileTime.Core.Timeline;
using FileTime.Providers.Local;
using Microsoft.Extensions.DependencyInjection;
using ICommandExecutor = FileTime.Core.Timeline.ICommandExecutor;
namespace FileTime.App.DependencyInjection;
@@ -13,9 +15,11 @@ public static class DependencyInjection
serviceCollection ??= new ServiceCollection();
return serviceCollection
.AddTransient<ITab, Tab>()
.AddSingleton<ICommandScheduler, CommandScheduler>()
.AddSingleton<ITimelessContentProvider, TimelessContentProvider>()
.AddSingleton<ICommandRunner, CommandRunner>()
.AddTransient<ITab, Tab>()
.AddTransient<ILocalCommandExecutor, LocalCommandExecutor>()
.AddCoreAppServices()
.AddLocalServices();
}