Container traits to extensions
This commit is contained in:
@@ -5,14 +5,15 @@ using DeclarativeProperty;
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Core.Enums;
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Core.Models.ContainerTraits;
|
||||
using FileTime.Core.Models.Extensions;
|
||||
using FileTime.Core.Timeline;
|
||||
|
||||
namespace FileTime.App.ContainerSizeScanner;
|
||||
|
||||
//TODO: create readonly version
|
||||
public record SizeScanContainer : ISizeScanContainer, IEscHandlerContainer
|
||||
//TODO: create readonly version, or not...
|
||||
public record SizeScanContainer : ISizeScanContainer
|
||||
{
|
||||
private readonly ITimelessContentProvider _timelessContentProvider;
|
||||
private readonly ReadOnlyExtensionCollection _readOnlyExtensions;
|
||||
private readonly BehaviorSubject<bool> _isLoading = new(false);
|
||||
private readonly CombineProperty<long, long> _size;
|
||||
@@ -38,25 +39,35 @@ public record SizeScanContainer : ISizeScanContainer, IEscHandlerContainer
|
||||
public ObservableCollection<AbsolutePath> Items { get; } = new();
|
||||
public IObservable<bool> IsLoading { get; }
|
||||
public bool? IsLoaded { get; private set; }
|
||||
public Task WaitForLoaded(CancellationToken token = default) => throw new NotImplementedException();
|
||||
|
||||
public async Task WaitForLoaded(CancellationToken token = default)
|
||||
{
|
||||
while (IsLoaded != true) await Task.Delay(1, token);
|
||||
}
|
||||
|
||||
public bool AllowRecursiveDeletion => false;
|
||||
|
||||
public IDeclarativeProperty<long> Size { get; }
|
||||
|
||||
public ObservableCollection<ISizeScanContainer> ChildContainers { get; } = new();
|
||||
public ObservableCollection<ISizeScanElement> ChildElements { get; } = new();
|
||||
public ObservableCollection<ISizeItem> SizeItems { get; } = new();
|
||||
public required IContainer RealContainer { get; init; }
|
||||
|
||||
internal SizeScanContainer()
|
||||
internal SizeScanContainer(ITimelessContentProvider timelessContentProvider)
|
||||
{
|
||||
_timelessContentProvider = timelessContentProvider;
|
||||
_readOnlyExtensions = new ReadOnlyExtensionCollection(Extensions);
|
||||
|
||||
IsLoading = _isLoading.AsObservable();
|
||||
CreatedAt = DateTime.Now;
|
||||
|
||||
_size = new(childContainerSizes => Task.FromResult(childContainerSizes.Sum()));
|
||||
Size = _size.Debounce(TimeSpan.FromSeconds(1));
|
||||
CreatedAt = DateTime.Now;
|
||||
|
||||
Extensions.Add(new EscHandlerContainerExtension(HandleEsc));
|
||||
Extensions.Add(new NonRestorableContainerExtension());
|
||||
Extensions.Add(new RealContainerProviderExtension(() => new(_timelessContentProvider, RealContainer!)));
|
||||
Extensions.Add(new StatusProviderContainerExtension(() => Status));
|
||||
}
|
||||
|
||||
public async Task AddSizeSourceAsync(IDeclarativeProperty<long> sizeElement)
|
||||
@@ -90,4 +101,19 @@ public record SizeScanContainer : ISizeScanContainer, IEscHandlerContainer
|
||||
SizeScanTask.Stop();
|
||||
return Task.FromResult(new ContainerEscapeResult(true));
|
||||
}
|
||||
|
||||
public async Task AddSizeChildAsync(ISizeItem newChild)
|
||||
{
|
||||
SizeItems.Add(newChild);
|
||||
|
||||
if (newChild is ISizeScanContainer newContainer)
|
||||
{
|
||||
ChildContainers.Add(newContainer);
|
||||
}
|
||||
|
||||
await AddSizeSourceAsync(newChild.Size);
|
||||
Items.Add(new AbsolutePath(
|
||||
_timelessContentProvider,
|
||||
newChild));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user