Console size scan

This commit is contained in:
2023-08-28 21:29:15 +02:00
parent bc865011d3
commit ba06047a68
43 changed files with 567 additions and 279 deletions

View File

@@ -1,4 +1,5 @@
using DeclarativeProperty;
using FileTime.Core.Models;
namespace FileTime.App.ContainerSizeScanner;
@@ -7,7 +8,7 @@ public class ChildElementPreview : ISizePreviewItem
public ChildElementPreview(ISizeScanElement element)
{
Name = element.Name;
Size = element.Size;
Size = new DeclarativeProperty<long>(((IElement) element).Size);
}
public string Name { get; }

View File

@@ -18,6 +18,9 @@ public record SizeScanElement : ISizeScanElement
public required DateTime? ModifiedAt { get; init;}
public required IDeclarativeProperty<long> Size { get; init; }
long IElement.Size => Size.Value;
public bool IsHidden => false;
public bool IsExists => true;
public SupportsDelete CanDelete => SupportsDelete.False;

View File

@@ -1,7 +1,6 @@
using DeclarativeProperty;
using FileTime.Core.Enums;
using FileTime.Core.Models;
using FileTime.Core.Models.Extensions;
using FileTime.Core.Timeline;
using Microsoft.Extensions.Logging;
@@ -104,10 +103,7 @@ public class SizeScanTask : ISizeScanTask
{
if (_cancelled) return;
var fileExtension = element.GetExtension<FileExtension>();
var size = fileExtension?.Size ?? 0;
var sizeProperty = new DeclarativeProperty<long>(size);
var sizeProperty = new DeclarativeProperty<long>(element.Size);
var childName = sizeScanContainer.FullName!.GetChild(element.Name).Path;
var childElement = new SizeScanElement

View File

@@ -25,4 +25,9 @@
<ProjectReference Include="..\..\Library\GeneralInputKey\GeneralInputKey.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Models\Traits\" />
</ItemGroup>
</Project>

View File

@@ -7,8 +7,8 @@ namespace FileTime.App.Core.ViewModels;
public interface IElementViewModel :
IItemViewModel,
ISizeProvider,
IInitable<IElement, ITabViewModel, ItemViewModelType>
IInitable<IElement, ITabViewModel, ItemViewModelType>,
ISizeProvider
{
IElement? Element { get; }
}

View File

@@ -1,10 +0,0 @@
using FileTime.App.Core.Models.Enums;
using FileTime.Core.Models;
using FileTime.Core.Models.Extensions;
using InitableService;
namespace FileTime.App.Core.ViewModels;
public interface IFileViewModel : IElementViewModel, IInitable<IElement, FileExtension, ITabViewModel, ItemViewModelType>
{
}

View File

@@ -44,4 +44,5 @@
<ProjectReference Include="..\FileTime.App.Search\FileTime.App.Search.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,43 @@
namespace FileTime.App.Core.Helpers;
public static class ColorHelper
{
// Convert an HLS value into an RGB value.
public static (byte r, byte g, byte b) HlsToRgb(double h, double l, double s)
{
double p2;
if (l <= 0.5) p2 = l * (1 + s);
else p2 = l + s - l * s;
var p1 = 2 * l - p2;
double doubleR, doubleG, doubleB;
if (s == 0)
{
doubleR = l;
doubleG = l;
doubleB = l;
}
else
{
doubleR = QqhToRgb(p1, p2, h + 120);
doubleG = QqhToRgb(p1, p2, h);
doubleB = QqhToRgb(p1, p2, h - 120);
}
// Convert RGB to the 0 to 255 range.
return ((byte) (doubleR * 255.0),
(byte) (doubleG * 255.0),
(byte) (doubleB * 255.0));
}
private static double QqhToRgb(double q1, double q2, double hue)
{
if (hue > 360) hue -= 360;
else if (hue < 0) hue += 360;
if (hue < 60) return q1 + (q2 - q1) * hue / 60;
if (hue < 180) return q2;
if (hue < 240) return q1 + (q2 - q1) * (240 - hue) / 60;
return q1;
}
}

View File

@@ -0,0 +1,27 @@
using System.Collections.ObjectModel;
using FileTime.App.ContainerSizeScanner;
namespace FileTime.App.Core.Helpers;
public static class SizePreviewItemHelper
{
public static (byte r, byte g, byte b) GetItemColor(
ObservableCollection<ISizePreviewItem> items,
ISizePreviewItem currentItem,
double hueDiff = 0,
double lightness = 0.75
)
{
var i = 0;
for (; i < items.Count; i++)
{
if (items[i].Name == currentItem.Name) break;
}
var hue = (360d * i / (items.Count < 1 ? 1 : items.Count)) + hueDiff;
if (hue > 360) hue -= 360;
if (hue < 0) hue += 360;
return ColorHelper.HlsToRgb(hue, lightness, 1);
}
}

View File

@@ -321,7 +321,7 @@ public class NavigationUserCommandHandlerService : UserCommandHandlerServiceBase
{
if (_selectedTab is null || _currentItems?.Value is null) return Task.CompletedTask;
var newSelectedItem = getNewSelected(_currentItems.Value);
var newSelectedItem = getNewSelected(_currentItems.Value.ToArray());
if (newSelectedItem == null) return Task.CompletedTask;
if (_selectedTab.Tab is { } tab)

View File

@@ -18,7 +18,6 @@ public static class Startup
serviceCollection.TryAddTransient<ITabViewModel, TabViewModel>();
serviceCollection.TryAddTransient<IContainerViewModel, ContainerViewModel>();
serviceCollection.TryAddTransient<IElementViewModel, ElementViewModel>();
serviceCollection.TryAddTransient<IFileViewModel, FileViewModel>();
serviceCollection.TryAddTransient<IItemNameConverterService, ItemNameConverterService>();
serviceCollection.TryAddTransient<ElementPreviewViewModel>();
serviceCollection.TryAddSingleton<IUserCommandHandlerService, UserCommandHandlerService>();

View File

@@ -4,7 +4,7 @@ using FileTime.Core.Models;
namespace FileTime.App.Core.ViewModels;
public partial class ContainerViewModel : ItemViewModel, IContainerViewModel
public class ContainerViewModel : ItemViewModel, IContainerViewModel
{
public IContainer? Container => BaseItem as IContainer;

View File

@@ -5,16 +5,20 @@ using FileTime.Core.Models;
namespace FileTime.App.Core.ViewModels;
public partial class ElementViewModel : ItemViewModel, IElementViewModel
public class ElementViewModel : ItemViewModel, IElementViewModel
{
private readonly DeclarativeProperty<long> _size = new(0);
public IElement? Element => BaseItem as Element;
public ElementViewModel(IItemNameConverterService itemNameConverterService, IAppState appState) : base(itemNameConverterService, appState)
{
}
public void Init(IElement item, ITabViewModel parentTab, ItemViewModelType itemViewModelType)
=> Init((IItem)item, parentTab, itemViewModelType);
public void Init(IElement item, ITabViewModel parentTab, ItemViewModelType itemViewModelType)
{
Init((IItem) item, parentTab, itemViewModelType);
_size.SetValueSafe(item.Size);
}
public IDeclarativeProperty<long> Size { get; protected set; } = new DeclarativeProperty<long>(0);
public IDeclarativeProperty<long> Size => _size;
}

View File

@@ -1,20 +0,0 @@
using DeclarativeProperty;
using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.Services;
using FileTime.Core.Models;
using FileTime.Core.Models.Extensions;
namespace FileTime.App.Core.ViewModels;
public partial class FileViewModel : ElementViewModel, IFileViewModel
{
public FileViewModel(IItemNameConverterService itemNameConverterService, IAppState appState) : base(itemNameConverterService, appState)
{
}
public void Init(IElement item, FileExtension fileExtension, ITabViewModel parentTab, ItemViewModelType itemViewModelType)
{
Init(item, parentTab, itemViewModelType);
Size = new DeclarativeProperty<long>(fileExtension.Size ?? 0);
}
}

View File

@@ -7,7 +7,6 @@ using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.Services;
using FileTime.Core.Enums;
using FileTime.Core.Models;
using FileTime.Core.Models.Extensions;
using FileTime.Core.Services;
using FileTime.Core.Timeline;
using InitableService;
@@ -206,25 +205,11 @@ public partial class TabViewModel : ITabViewModel
}
else if (item is IElement element)
{
var fileExtension = element.GetExtension<FileExtension>();
var elementViewModel = _serviceProvider
.GetInitableResolver<IElement, ITabViewModel, ItemViewModelType>(element, this, type)
.GetRequiredService<IElementViewModel>();
if (fileExtension is not null)
{
var fileViewModel = _serviceProvider
.GetInitableResolver<IElement, FileExtension, ITabViewModel, ItemViewModelType>(
element, fileExtension, this, type)
.GetRequiredService<IFileViewModel>();
return fileViewModel;
}
else
{
var elementViewModel = _serviceProvider
.GetInitableResolver<IElement, ITabViewModel, ItemViewModelType>(element, this, type)
.GetRequiredService<IElementViewModel>();
return elementViewModel;
}
return elementViewModel;
}
throw new ArgumentException($"{nameof(item)} is not {nameof(IContainer)} neither {nameof(IElement)}");