Clipboard
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
using FileTime.Core.Command;
|
||||||
|
using FileTime.Core.Models;
|
||||||
|
|
||||||
|
namespace FileTime.App.Core.Services
|
||||||
|
{
|
||||||
|
public interface IClipboardService
|
||||||
|
{
|
||||||
|
Type? CommandType { get; }
|
||||||
|
IReadOnlyList<IAbsolutePath> Content { get; }
|
||||||
|
|
||||||
|
void AddContent(IAbsolutePath absolutePath);
|
||||||
|
void RemoveContent(IAbsolutePath absolutePath);
|
||||||
|
void Clear();
|
||||||
|
void SetCommand<T>() where T : ITransportationCommand;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,7 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
IObservable<IContainer?> CurrentLocation { get; }
|
IObservable<IContainer?> CurrentLocation { get; }
|
||||||
IObservable<IItemViewModel?> CurrentSelectedItem { get; }
|
IObservable<IItemViewModel?> CurrentSelectedItem { get; }
|
||||||
IObservable<IObservable<IChangeSet<IItemViewModel>>?> CurrentItems { get; }
|
IObservable<IObservable<IChangeSet<IItemViewModel>>?> CurrentItems { get; }
|
||||||
IObservable<IEnumerable<FullName>> MarkedItems { get; }
|
IObservable<IChangeSet<IAbsolutePath>> MarkedItems { get; }
|
||||||
IObservable<IObservable<IChangeSet<IItemViewModel>>?> SelectedsChildren { get; }
|
IObservable<IObservable<IChangeSet<IItemViewModel>>?> SelectedsChildren { get; }
|
||||||
IObservable<IObservable<IChangeSet<IItemViewModel>>?> ParentsChildren { get; }
|
IObservable<IObservable<IChangeSet<IItemViewModel>>?> ParentsChildren { get; }
|
||||||
BindedCollection<IItemViewModel>? CurrentItemsCollection { get; }
|
BindedCollection<IItemViewModel>? CurrentItemsCollection { get; }
|
||||||
@@ -23,8 +23,8 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
BindedCollection<IItemViewModel>? ParentsChildrenCollection { get; }
|
BindedCollection<IItemViewModel>? ParentsChildrenCollection { get; }
|
||||||
IObservable<IReadOnlyCollection<IItemViewModel>?> CurrentItemsCollectionObservable { get; }
|
IObservable<IReadOnlyCollection<IItemViewModel>?> CurrentItemsCollectionObservable { get; }
|
||||||
void ClearMarkedItems();
|
void ClearMarkedItems();
|
||||||
void RemoveMarkedItem(FullName item);
|
void RemoveMarkedItem(IAbsolutePath item);
|
||||||
void AddMarkedItem(FullName item);
|
void AddMarkedItem(IAbsolutePath item);
|
||||||
void ToggleMarkedItem(FullName item);
|
void ToggleMarkedItem(IAbsolutePath item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
<ProjectReference Include="..\..\Core\FileTime.Core.Models\FileTime.Core.Models.csproj" />
|
<ProjectReference Include="..\..\Core\FileTime.Core.Models\FileTime.Core.Models.csproj" />
|
||||||
<ProjectReference Include="..\..\Tools\FileTime.Tools\FileTime.Tools.csproj" />
|
<ProjectReference Include="..\..\Tools\FileTime.Tools\FileTime.Tools.csproj" />
|
||||||
<ProjectReference Include="..\FileTime.App.Core.Abstraction\FileTime.App.Core.Abstraction.csproj" />
|
<ProjectReference Include="..\FileTime.App.Core.Abstraction\FileTime.App.Core.Abstraction.csproj" />
|
||||||
|
<ProjectReference Include="..\..\Core\FileTime.Core.Command\FileTime.Core.Command.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
51
src/AppCommon/FileTime.App.Core/Services/ClipboardService.cs
Normal file
51
src/AppCommon/FileTime.App.Core/Services/ClipboardService.cs
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
using FileTime.Core.Command;
|
||||||
|
using FileTime.Core.Models;
|
||||||
|
|
||||||
|
namespace FileTime.App.Core.Services
|
||||||
|
{
|
||||||
|
public class ClipboardService : IClipboardService
|
||||||
|
{
|
||||||
|
private List<IAbsolutePath> _content;
|
||||||
|
public IReadOnlyList<IAbsolutePath> Content { get; private set; }
|
||||||
|
public Type? CommandType { get; private set; }
|
||||||
|
|
||||||
|
public ClipboardService()
|
||||||
|
{
|
||||||
|
_content = new List<IAbsolutePath>();
|
||||||
|
Content = _content.AsReadOnly();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddContent(IAbsolutePath absolutePath)
|
||||||
|
{
|
||||||
|
foreach (var content in _content)
|
||||||
|
{
|
||||||
|
if (content.Equals(absolutePath)) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_content.Add(absolutePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveContent(IAbsolutePath absolutePath)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < _content.Count; i++)
|
||||||
|
{
|
||||||
|
if (_content[i].Equals(absolutePath))
|
||||||
|
{
|
||||||
|
_content.RemoveAt(i--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
_content = new List<IAbsolutePath>();
|
||||||
|
Content = _content.AsReadOnly();
|
||||||
|
CommandType = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCommand<T>() where T : ITransportationCommand
|
||||||
|
{
|
||||||
|
CommandType = typeof(T);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +1,17 @@
|
|||||||
using System.Reactive.Linq;
|
using System.Reactive.Linq;
|
||||||
|
using DynamicData;
|
||||||
using FileTime.App.Core.Command;
|
using FileTime.App.Core.Command;
|
||||||
using FileTime.App.Core.ViewModels;
|
using FileTime.App.Core.ViewModels;
|
||||||
using FileTime.Core.Models;
|
using FileTime.Core.Models;
|
||||||
|
|
||||||
namespace FileTime.App.Core.Services.CommandHandler
|
namespace FileTime.App.Core.Services.CommandHandler
|
||||||
{
|
{
|
||||||
public abstract class CommandHanderBase : ICommandHandler
|
public abstract class CommandHandlerBase : ICommandHandler
|
||||||
{
|
{
|
||||||
private readonly Dictionary<Commands, Func<Task>> _commandHandlers = new();
|
private readonly Dictionary<Commands, Func<Task>> _commandHandlers = new();
|
||||||
private readonly IAppState? _appState;
|
private readonly IAppState? _appState;
|
||||||
|
|
||||||
protected CommandHanderBase(IAppState? appState = null)
|
protected CommandHandlerBase(IAppState? appState = null)
|
||||||
{
|
{
|
||||||
_appState = appState;
|
_appState = appState;
|
||||||
}
|
}
|
||||||
@@ -40,9 +41,12 @@ namespace FileTime.App.Core.Services.CommandHandler
|
|||||||
protected IDisposable SaveCurrentItems(Action<IEnumerable<IItemViewModel>> handler)
|
protected IDisposable SaveCurrentItems(Action<IEnumerable<IItemViewModel>> handler)
|
||||||
=> RunWithAppState(appState => appState.SelectedTab.Select(t => t?.CurrentItemsCollectionObservable ?? Observable.Return((IEnumerable<IItemViewModel>?)Enumerable.Empty<IItemViewModel>())).Switch().Subscribe(i => handler(i ?? Enumerable.Empty<IItemViewModel>())));
|
=> RunWithAppState(appState => appState.SelectedTab.Select(t => t?.CurrentItemsCollectionObservable ?? Observable.Return((IEnumerable<IItemViewModel>?)Enumerable.Empty<IItemViewModel>())).Switch().Subscribe(i => handler(i ?? Enumerable.Empty<IItemViewModel>())));
|
||||||
|
|
||||||
|
protected IDisposable SaveMarkedItems(Action<IChangeSet<IAbsolutePath>> handler)
|
||||||
|
=> RunWithAppState(appstate => appstate.SelectedTab.Select(t => t == null ? Observable.Empty<IChangeSet<IAbsolutePath>>() : t.MarkedItems).Switch().Subscribe(handler));
|
||||||
|
|
||||||
private IDisposable RunWithAppState(Func<IAppState, IDisposable> act)
|
private IDisposable RunWithAppState(Func<IAppState, IDisposable> act)
|
||||||
{
|
{
|
||||||
if (_appState == null) throw new NullReferenceException($"AppState is nit initialized in {nameof(CommandHanderBase)}.");
|
if (_appState == null) throw new NullReferenceException($"AppState is nit initialized in {nameof(CommandHandlerBase)}.");
|
||||||
|
|
||||||
return act(_appState);
|
return act(_appState);
|
||||||
}
|
}
|
||||||
@@ -1,24 +1,44 @@
|
|||||||
|
using DynamicData;
|
||||||
using FileTime.App.Core.Command;
|
using FileTime.App.Core.Command;
|
||||||
|
using FileTime.App.Core.Models;
|
||||||
using FileTime.App.Core.ViewModels;
|
using FileTime.App.Core.ViewModels;
|
||||||
|
using FileTime.Core.Command;
|
||||||
|
using FileTime.Core.Command.Copy;
|
||||||
|
using FileTime.Core.Models;
|
||||||
|
|
||||||
namespace FileTime.App.Core.Services.CommandHandler
|
namespace FileTime.App.Core.Services.CommandHandler
|
||||||
{
|
{
|
||||||
public class ItemManipulationCommandHandler : CommandHanderBase
|
public class ItemManipulationCommandHandler : CommandHandlerBase
|
||||||
{
|
{
|
||||||
private ITabViewModel? _selectedTab;
|
private ITabViewModel? _selectedTab;
|
||||||
private IItemViewModel? _currentSelectedItem;
|
private IItemViewModel? _currentSelectedItem;
|
||||||
private readonly ICommandHandlerService _commandHandlerService;
|
private readonly ICommandHandlerService _commandHandlerService;
|
||||||
|
private readonly IClipboardService _clipboardService;
|
||||||
|
private BindedCollection<IAbsolutePath>? _markedItems;
|
||||||
|
|
||||||
public ItemManipulationCommandHandler(IAppState appState, ICommandHandlerService commandHandlerService) : base(appState)
|
public ItemManipulationCommandHandler(
|
||||||
|
IAppState appState,
|
||||||
|
ICommandHandlerService commandHandlerService,
|
||||||
|
IClipboardService clipboardService) : base(appState)
|
||||||
{
|
{
|
||||||
_commandHandlerService = commandHandlerService;
|
_commandHandlerService = commandHandlerService;
|
||||||
|
_clipboardService = clipboardService;
|
||||||
|
|
||||||
SaveSelectedTab(t => _selectedTab = t);
|
SaveSelectedTab(t =>
|
||||||
|
{
|
||||||
|
_selectedTab = t;
|
||||||
|
_markedItems?.Dispose();
|
||||||
|
_markedItems = t == null ? null : new BindedCollection<IAbsolutePath>(t.MarkedItems);
|
||||||
|
});
|
||||||
SaveCurrentSelectedItem(i => _currentSelectedItem = i);
|
SaveCurrentSelectedItem(i => _currentSelectedItem = i);
|
||||||
|
|
||||||
AddCommandHandlers(new (Commands, Func<Task>)[]
|
AddCommandHandlers(new (Commands, Func<Task>)[]
|
||||||
{
|
{
|
||||||
(Commands.Mark, MarkItem)
|
(Commands.Copy, Copy),
|
||||||
|
(Commands.Mark, MarkItem),
|
||||||
|
(Commands.PasteMerge, PasteMerge),
|
||||||
|
(Commands.PasteOverwrite, PasteOverwrite),
|
||||||
|
(Commands.PasteSkip, PasteSkip),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,8 +46,51 @@ namespace FileTime.App.Core.Services.CommandHandler
|
|||||||
{
|
{
|
||||||
if (_selectedTab == null || _currentSelectedItem?.BaseItem?.FullName == null) return;
|
if (_selectedTab == null || _currentSelectedItem?.BaseItem?.FullName == null) return;
|
||||||
|
|
||||||
_selectedTab.ToggleMarkedItem(_currentSelectedItem.BaseItem.FullName);
|
_selectedTab.ToggleMarkedItem(new AbsolutePath(_currentSelectedItem.BaseItem));
|
||||||
await _commandHandlerService.HandleCommandAsync(Commands.MoveCursorDown);
|
await _commandHandlerService.HandleCommandAsync(Commands.MoveCursorDown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Task Copy()
|
||||||
|
{
|
||||||
|
_clipboardService.Clear();
|
||||||
|
_clipboardService.SetCommand<CopyCommand>();
|
||||||
|
|
||||||
|
if ((_markedItems?.Collection.Count ?? 0) > 0)
|
||||||
|
{
|
||||||
|
foreach (var item in _markedItems!.Collection)
|
||||||
|
{
|
||||||
|
_clipboardService.AddContent(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
_selectedTab?.ClearMarkedItems();
|
||||||
|
}
|
||||||
|
else if (_currentSelectedItem?.BaseItem != null)
|
||||||
|
{
|
||||||
|
_clipboardService.AddContent(new AbsolutePath(_currentSelectedItem.BaseItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task PasteMerge()
|
||||||
|
{
|
||||||
|
await Paste(TransportMode.Merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task PasteOverwrite()
|
||||||
|
{
|
||||||
|
await Paste(TransportMode.Overwrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task PasteSkip()
|
||||||
|
{
|
||||||
|
await Paste(TransportMode.Skip);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task Paste(TransportMode skip)
|
||||||
|
{
|
||||||
|
if (_clipboardService.CommandType is null) return Task.CompletedTask;
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@ using FileTime.Core.Models;
|
|||||||
|
|
||||||
namespace FileTime.App.Core.Services.CommandHandler
|
namespace FileTime.App.Core.Services.CommandHandler
|
||||||
{
|
{
|
||||||
public class NavigationCommandHandler : CommandHanderBase
|
public class NavigationCommandHandler : CommandHandlerBase
|
||||||
{
|
{
|
||||||
private ITabViewModel? _selectedTab;
|
private ITabViewModel? _selectedTab;
|
||||||
private IContainer? _currentLocation;
|
private IContainer? _currentLocation;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ namespace FileTime.App.Core
|
|||||||
.AddTransient<IElementViewModel, ElementViewModel>()
|
.AddTransient<IElementViewModel, ElementViewModel>()
|
||||||
.AddTransient<IItemNameConverterService, ItemNameConverterService>()
|
.AddTransient<IItemNameConverterService, ItemNameConverterService>()
|
||||||
.AddSingleton<ICommandHandlerService, CommandHandlerService>()
|
.AddSingleton<ICommandHandlerService, CommandHandlerService>()
|
||||||
|
.AddSingleton<IClipboardService, ClipboardService>()
|
||||||
.AddCommandHandlers();
|
.AddCommandHandlers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Reactive.Linq;
|
using System.Reactive.Linq;
|
||||||
|
using DynamicData;
|
||||||
using FileTime.App.Core.Models;
|
using FileTime.App.Core.Models;
|
||||||
using FileTime.App.Core.Models.Enums;
|
using FileTime.App.Core.Models.Enums;
|
||||||
using FileTime.App.Core.Services;
|
using FileTime.App.Core.Services;
|
||||||
@@ -45,7 +46,7 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
BaseItem = item;
|
BaseItem = item;
|
||||||
DisplayName = _appState.SearchText.Select(s => _itemNameConverterService.GetDisplayName(item.DisplayName, s));
|
DisplayName = _appState.SearchText.Select(s => _itemNameConverterService.GetDisplayName(item.DisplayName, s));
|
||||||
DisplayNameText = item.DisplayName;
|
DisplayNameText = item.DisplayName;
|
||||||
IsMarked = parentTab.MarkedItems.Select(m => m.Contains(item.FullName));
|
IsMarked = parentTab.MarkedItems.ToCollection().Select(m => m.Any(i => i.Path.Path == item.FullName?.Path));
|
||||||
IsSelected = parentTab.CurrentSelectedItem.Select(EqualsTo);
|
IsSelected = parentTab.CurrentSelectedItem.Select(EqualsTo);
|
||||||
IsAlternative = parentTab.CurrentItemsCollectionObservable.Select(c => c?.Index().FirstOrDefault(i => EqualsTo(i.Value)).Key % 2 == 0);
|
IsAlternative = parentTab.CurrentItemsCollectionObservable.Select(c => c?.Index().FirstOrDefault(i => EqualsTo(i.Value)).Key % 2 == 0);
|
||||||
ViewMode = Observable.CombineLatest(IsMarked, IsSelected, IsAlternative, GenerateViewMode);
|
ViewMode = Observable.CombineLatest(IsMarked, IsSelected, IsAlternative, GenerateViewMode);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.Reactive.Linq;
|
using System.Reactive.Linq;
|
||||||
using System.Reactive.Subjects;
|
|
||||||
using DynamicData;
|
using DynamicData;
|
||||||
using FileTime.App.Core.Extensions;
|
using FileTime.App.Core.Extensions;
|
||||||
using FileTime.App.Core.Models;
|
using FileTime.App.Core.Models;
|
||||||
@@ -19,8 +18,7 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
private readonly IItemNameConverterService _itemNameConverterService;
|
private readonly IItemNameConverterService _itemNameConverterService;
|
||||||
private readonly IAppState _appState;
|
private readonly IAppState _appState;
|
||||||
private readonly IRxSchedulerService _rxSchedulerService;
|
private readonly IRxSchedulerService _rxSchedulerService;
|
||||||
private readonly BehaviorSubject<IEnumerable<FullName>> _markedItems = new(Enumerable.Empty<FullName>());
|
private readonly SourceList<IAbsolutePath> _markedItems = new();
|
||||||
private readonly List<FullName> _currentMarkedItems = new();
|
|
||||||
private readonly List<IDisposable> _disposables = new();
|
private readonly List<IDisposable> _disposables = new();
|
||||||
private bool disposed;
|
private bool disposed;
|
||||||
|
|
||||||
@@ -32,7 +30,7 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
public IObservable<IContainer?> CurrentLocation { get; private set; } = null!;
|
public IObservable<IContainer?> CurrentLocation { get; private set; } = null!;
|
||||||
public IObservable<IItemViewModel?> CurrentSelectedItem { get; private set; } = null!;
|
public IObservable<IItemViewModel?> CurrentSelectedItem { get; private set; } = null!;
|
||||||
public IObservable<IObservable<IChangeSet<IItemViewModel>>?> CurrentItems { get; private set; } = null!;
|
public IObservable<IObservable<IChangeSet<IItemViewModel>>?> CurrentItems { get; private set; } = null!;
|
||||||
public IObservable<IEnumerable<FullName>> MarkedItems { get; }
|
public IObservable<IChangeSet<IAbsolutePath>> MarkedItems { get; }
|
||||||
public IObservable<IObservable<IChangeSet<IItemViewModel>>?> SelectedsChildren { get; private set; } = null!;
|
public IObservable<IObservable<IChangeSet<IItemViewModel>>?> SelectedsChildren { get; private set; } = null!;
|
||||||
public IObservable<IObservable<IChangeSet<IItemViewModel>>?> ParentsChildren { get; private set; } = null!;
|
public IObservable<IObservable<IChangeSet<IItemViewModel>>?> ParentsChildren { get; private set; } = null!;
|
||||||
|
|
||||||
@@ -57,7 +55,7 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
_itemNameConverterService = itemNameConverterService;
|
_itemNameConverterService = itemNameConverterService;
|
||||||
_appState = appState;
|
_appState = appState;
|
||||||
|
|
||||||
MarkedItems = _markedItems.Select(e => e.ToList()).AsObservable();
|
MarkedItems = _markedItems.Connect().StartWithEmpty();
|
||||||
IsSelected = _appState.SelectedTab.Select(s => s == this);
|
IsSelected = _appState.SelectedTab.Select(s => s == this);
|
||||||
_rxSchedulerService = rxSchedulerService;
|
_rxSchedulerService = rxSchedulerService;
|
||||||
}
|
}
|
||||||
@@ -117,7 +115,7 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
SelectedsChildrenCollection = children.MapNull(c => new BindedCollection<IItemViewModel>(c!));
|
SelectedsChildrenCollection = children.MapNull(c => new BindedCollection<IItemViewModel>(c!));
|
||||||
});
|
});
|
||||||
|
|
||||||
tab.CurrentLocation.Subscribe((_) => _markedItems.OnNext(Enumerable.Empty<FullName>()));
|
tab.CurrentLocation.Subscribe((_) => _markedItems.Clear());
|
||||||
|
|
||||||
IObservable<IObservable<IChangeSet<IItemViewModel>>?> InitSelectedsChildren()
|
IObservable<IObservable<IChangeSet<IItemViewModel>>?> InitSelectedsChildren()
|
||||||
{
|
{
|
||||||
@@ -195,21 +193,18 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
throw new ArgumentException($"{nameof(item)} is not {nameof(IContainer)} neither {nameof(IElement)}");
|
throw new ArgumentException($"{nameof(item)} is not {nameof(IContainer)} neither {nameof(IElement)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddMarkedItem(FullName item)
|
public void AddMarkedItem(IAbsolutePath item) => _markedItems.Add(item);
|
||||||
|
|
||||||
|
public void RemoveMarkedItem(IAbsolutePath item)
|
||||||
{
|
{
|
||||||
_currentMarkedItems.Add(item);
|
var itemsToRemove = _markedItems.Items.Where(i => i.Path.Path == item.Path.Path).ToList();
|
||||||
_markedItems.OnNext(_currentMarkedItems);
|
|
||||||
|
_markedItems.RemoveMany(itemsToRemove);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveMarkedItem(FullName item)
|
public void ToggleMarkedItem(IAbsolutePath item)
|
||||||
{
|
{
|
||||||
_currentMarkedItems.RemoveAll(i => i.Path == item.Path);
|
if (_markedItems.Items.Any(i => i.Path.Path == item.Path.Path))
|
||||||
_markedItems.OnNext(_currentMarkedItems);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ToggleMarkedItem(FullName item)
|
|
||||||
{
|
|
||||||
if (_currentMarkedItems.Any(i => i.Path == item.Path))
|
|
||||||
{
|
{
|
||||||
RemoveMarkedItem(item);
|
RemoveMarkedItem(item);
|
||||||
}
|
}
|
||||||
@@ -221,8 +216,7 @@ namespace FileTime.App.Core.ViewModels
|
|||||||
|
|
||||||
public void ClearMarkedItems()
|
public void ClearMarkedItems()
|
||||||
{
|
{
|
||||||
_currentMarkedItems.Clear();
|
_markedItems.Clear();
|
||||||
_markedItems.OnNext(_currentMarkedItems);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~TabViewModel() => Dispose(false);
|
~TabViewModel() => Dispose(false);
|
||||||
|
|||||||
7
src/Core/FileTime.Core.Abstraction/Command/ICommand.cs
Normal file
7
src/Core/FileTime.Core.Abstraction/Command/ICommand.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace FileTime.Core.Command
|
||||||
|
{
|
||||||
|
public interface ICommand
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace FileTime.Core.Command
|
||||||
|
{
|
||||||
|
public interface ITransportationCommand : ICommand
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
7
src/Core/FileTime.Core.Command/Copy/CopyCommand.cs
Normal file
7
src/Core/FileTime.Core.Command/Copy/CopyCommand.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace FileTime.Core.Command.Copy
|
||||||
|
{
|
||||||
|
public class CopyCommand : ITransportationCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/Core/FileTime.Core.Command/FileTime.Core.Command.csproj
Normal file
13
src/Core/FileTime.Core.Command/FileTime.Core.Command.csproj
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\FileTime.Core.Abstraction\FileTime.Core.Abstraction.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
9
src/Core/FileTime.Core.Command/TransportMode.cs
Normal file
9
src/Core/FileTime.Core.Command/TransportMode.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
namespace FileTime.Core.Command
|
||||||
|
{
|
||||||
|
public enum TransportMode
|
||||||
|
{
|
||||||
|
Merge,
|
||||||
|
Overwrite,
|
||||||
|
Skip
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -51,6 +51,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{8C3CFEFE
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileTime.Tools", "Tools\FileTime.Tools\FileTime.Tools.csproj", "{B7A45654-E56C-43C8-998E-0F4661395540}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileTime.Tools", "Tools\FileTime.Tools\FileTime.Tools.csproj", "{B7A45654-E56C-43C8-998E-0F4661395540}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileTime.Core.Command", "Core\FileTime.Core.Command\FileTime.Core.Command.csproj", "{1846BE76-8F68-4FC3-8954-871F14743F0B}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -121,6 +123,10 @@ Global
|
|||||||
{B7A45654-E56C-43C8-998E-0F4661395540}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B7A45654-E56C-43C8-998E-0F4661395540}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B7A45654-E56C-43C8-998E-0F4661395540}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B7A45654-E56C-43C8-998E-0F4661395540}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{B7A45654-E56C-43C8-998E-0F4661395540}.Release|Any CPU.Build.0 = Release|Any CPU
|
{B7A45654-E56C-43C8-998E-0F4661395540}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{1846BE76-8F68-4FC3-8954-871F14743F0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{1846BE76-8F68-4FC3-8954-871F14743F0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{1846BE76-8F68-4FC3-8954-871F14743F0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{1846BE76-8F68-4FC3-8954-871F14743F0B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@@ -143,6 +149,7 @@ Global
|
|||||||
{1500A537-2116-4111-B216-7632040619B0} = {2FC40FE1-4446-44AB-BF77-00F94D995FA3}
|
{1500A537-2116-4111-B216-7632040619B0} = {2FC40FE1-4446-44AB-BF77-00F94D995FA3}
|
||||||
{D7D1C76A-05B0-49BC-BCFF-06340E264EC1} = {01F231DE-4A65-435F-B4BB-77EE5221890C}
|
{D7D1C76A-05B0-49BC-BCFF-06340E264EC1} = {01F231DE-4A65-435F-B4BB-77EE5221890C}
|
||||||
{B7A45654-E56C-43C8-998E-0F4661395540} = {8C3CFEFE-78A5-4940-B388-D15FCE02ECE9}
|
{B7A45654-E56C-43C8-998E-0F4661395540} = {8C3CFEFE-78A5-4940-B388-D15FCE02ECE9}
|
||||||
|
{1846BE76-8F68-4FC3-8954-871F14743F0B} = {3324D046-1E05-46B5-B1BA-82910D56B332}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {859FB3DF-C60A-46B1-82E5-90274905D1EF}
|
SolutionGuid = {859FB3DF-C60A-46B1-82E5-90274905D1EF}
|
||||||
|
|||||||
Reference in New Issue
Block a user