Fix copy overwrites the source files sometimes
This commit is contained in:
@@ -8,5 +8,7 @@ public interface IContainer : IItem
|
||||
IObservable<IChangeSet<AbsolutePath, string>> Items { get; }
|
||||
ReadOnlyObservableCollection<AbsolutePath> ItemsCollection { get; }
|
||||
IObservable<bool> IsLoading { get; }
|
||||
bool? IsLoaded { get; }
|
||||
Task WaitForLoaded(CancellationToken token = default);
|
||||
bool AllowRecursiveDeletion { get; }
|
||||
}
|
||||
@@ -110,7 +110,7 @@ public class CopyCommand : CommandBase, ITransportationCommand
|
||||
{
|
||||
var total = data.Sum(d => d.TotalProgress);
|
||||
if (total == 0) return 0;
|
||||
return (int) (data.Sum(d => d.Progress) * 100 / total);
|
||||
return (int)(data.Sum(d => d.Progress) * 100 / total);
|
||||
})
|
||||
.Subscribe(SetTotalProgress);
|
||||
|
||||
@@ -140,10 +140,9 @@ public class CopyCommand : CommandBase, ITransportationCommand
|
||||
TransportMode transportMode,
|
||||
ICopyStrategy copyOperation)
|
||||
{
|
||||
var resolvedTarget = ((IContainer) await target.ResolveAsync()) ?? throw new Exception();
|
||||
|
||||
foreach (var source in sources)
|
||||
{
|
||||
var resolvedTarget = (IContainer)await target.ResolveAsync() ?? throw new Exception();
|
||||
var item = await _timelessContentProvider.GetItemByFullNameAsync(source, currentTime);
|
||||
|
||||
if (item is IContainer container)
|
||||
|
||||
@@ -6,6 +6,7 @@ public static class Helper
|
||||
{
|
||||
public static async Task<string?> GetNewNameAsync(IContainer resolvedTarget, string name, TransportMode transportMode)
|
||||
{
|
||||
await resolvedTarget.WaitForLoaded();
|
||||
var items = resolvedTarget.ItemsCollection.ToList();
|
||||
var newName = name;
|
||||
var targetNameExists = items.Any(i => i.Path.GetName() == newName);
|
||||
|
||||
@@ -44,9 +44,11 @@ public abstract class ContentProviderBase : IContentProvider
|
||||
public string? Attributes => null;
|
||||
|
||||
protected BehaviorSubject<bool> IsLoading { get; } = new(false);
|
||||
public bool AllowRecursiveDeletion => false;
|
||||
|
||||
IObservable<bool> IContainer.IsLoading => IsLoading.AsObservable();
|
||||
public bool? IsLoaded => true;
|
||||
public Task WaitForLoaded(CancellationToken token = default) => Task.CompletedTask;
|
||||
|
||||
public bool AllowRecursiveDeletion => false;
|
||||
|
||||
public AbsolutePathType Type => AbsolutePathType.Container;
|
||||
public PointInTime PointInTime { get; } = PointInTime.Eternal;
|
||||
|
||||
@@ -27,19 +27,42 @@ public record Container(
|
||||
ReadOnlyExtensionCollection Extensions,
|
||||
IObservable<IChangeSet<AbsolutePath, string>> Items) : IContainer
|
||||
{
|
||||
|
||||
private readonly Lazy<ReadOnlyObservableCollection<AbsolutePath>> _itemsCollectionLazy =
|
||||
new (() =>
|
||||
new(() =>
|
||||
{
|
||||
Items.Bind(out var items).Subscribe();
|
||||
return items;
|
||||
});
|
||||
private readonly CancellationTokenSource _loadingCancellationTokenSource = new();
|
||||
private readonly BehaviorSubject<bool> _isLoading = new(false);
|
||||
|
||||
public CancellationToken LoadingCancellationToken => _loadingCancellationTokenSource.Token;
|
||||
public BehaviorSubject<bool> IsLoading { get; } = new(false);
|
||||
IObservable<bool> IContainer.IsLoading => IsLoading.AsObservable();
|
||||
public IObservable<bool> IsLoading => _isLoading.AsObservable();
|
||||
public bool? IsLoaded { get; private set; }
|
||||
public AbsolutePathType Type => AbsolutePathType.Container;
|
||||
|
||||
public ReadOnlyObservableCollection<AbsolutePath> ItemsCollection => _itemsCollectionLazy.Value;
|
||||
|
||||
public void CancelLoading() => _loadingCancellationTokenSource.Cancel();
|
||||
public async Task WaitForLoaded(CancellationToken token = default)
|
||||
{
|
||||
while (IsLoaded != true) await Task.Delay(1, token);
|
||||
}
|
||||
|
||||
public void StartLoading()
|
||||
{
|
||||
_isLoading.OnNext(true);
|
||||
IsLoaded = false;
|
||||
}
|
||||
public void StopLoading()
|
||||
{
|
||||
_isLoading.OnNext(false);
|
||||
IsLoaded = true;
|
||||
}
|
||||
public void CancelLoading()
|
||||
{
|
||||
_loadingCancellationTokenSource.Cancel();
|
||||
_isLoading.OnNext(false);
|
||||
IsLoaded = true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user