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,7 +1,12 @@
using FileTime.App.Core.Models;
using System.Collections.ObjectModel;
using FileTime.App.ContainerSizeScanner;
using FileTime.App.Core.Helpers;
using FileTime.App.Core.Models;
using FileTime.App.Core.ViewModels.ItemPreview;
using FileTime.ConsoleUI.App.Preview;
using FileTime.ConsoleUI.App.Styling;
using Humanizer.Bytes;
using TerminalUI.Color;
using TerminalUI.Controls;
using TerminalUI.Extensions;
using TerminalUI.Models;
@@ -13,11 +18,18 @@ public class ItemPreviews
{
private readonly ITheme _theme;
private readonly IConsoleAppState _appState;
private readonly IColorProvider _colorProvider;
private ItemsControl<ContainerPreview, ISizePreviewItem> _sizePreviews;
public ItemPreviews(ITheme theme, IConsoleAppState appState)
public ItemPreviews(
ITheme theme,
IConsoleAppState appState,
IColorProvider colorProvider
)
{
_theme = theme;
_appState = appState;
_colorProvider = colorProvider;
}
public IView<IRootViewModel> View()
@@ -38,7 +50,11 @@ public class ItemPreviews
fallbackValue: false)),
ElementPreviews()
.WithDataContextBinding<IRootViewModel, IElementPreviewViewModel>(
dc => (IElementPreviewViewModel)dc.ItemPreviewService.ItemPreview.Value
dc => (IElementPreviewViewModel) dc.ItemPreviewService.ItemPreview.Value
),
SizeContainerPreview()
.WithDataContextBinding<IRootViewModel, ContainerPreview>(
dc => (ContainerPreview) dc.ItemPreviewService.ItemPreview.Value
)
}
};
@@ -46,6 +62,125 @@ public class ItemPreviews
return view;
}
private IView<ContainerPreview> SizeContainerPreview()
{
var sizePreviews = new ItemsControl<ContainerPreview, ISizePreviewItem>
{
Orientation = Orientation.Horizontal,
Margin = "0 0 0 1"
};
sizePreviews.Setup(c => c.Bind(
c,
dc => dc.TopItems,
c => c.ItemsSource));
_sizePreviews = sizePreviews;
sizePreviews.ItemTemplate = SizeContainerItem;
var root = new Grid<ContainerPreview>
{
RowDefinitionsObject = "Auto Auto",
ChildInitializer =
{
sizePreviews,
new ItemsControl<ContainerPreview, ISizePreviewItem>
{
Extensions = {new GridPositionExtension(0, 1)},
ItemTemplate = () =>
{
var root = new Grid<ISizePreviewItem>
{
ColumnDefinitionsObject = "5 11 *",
ChildInitializer =
{
new Rectangle<ISizePreviewItem>
{
Height = 1,
Width = 3
}
.Setup(r => r.Bind(
r,
dc => GenerateSizeBackground(_sizePreviews.DataContext.TopItems, dc),
r => r.Fill)),
new TextBlock<ISizePreviewItem>
{
Extensions = {new GridPositionExtension(1, 0)},
TextAlignment = TextAlignment.Right,
Margin = "0 0 1 0"
}
.Setup(t => t.Bind(
t,
dc => dc.Size.Value,
t => t.Text,
v => ByteSize.FromBytes(v).ToString())),
new TextBlock<ISizePreviewItem>
{
Extensions = {new GridPositionExtension(2, 0)}
}
.Setup(t => t.Bind(
t,
dc => dc.Name,
t => t.Text))
}
};
return root;
}
}
.Setup(c => c.Bind(
c,
dc => dc.TopItems,
c => c.ItemsSource))
}
};
root.Bind(
root,
dc => dc.Name == ContainerPreview.PreviewName,
r => r.IsVisible);
return root;
}
private Grid<ISizePreviewItem> SizeContainerItem()
{
var root = new Grid<ISizePreviewItem>
{
ChildInitializer =
{
new Rectangle<ISizePreviewItem>
{
Height = 1
}
.Setup(r => r.Bind(
r,
dc => GenerateSizeBackground(_sizePreviews.DataContext.TopItems, dc),
r => r.Fill))
}
};
root.Bind(
root,
dc => GetWidth(dc.Size.Value, _sizePreviews.DataContext.TopItems, _sizePreviews.ActualWidth),
r => r.Width);
return root;
}
private int? GetWidth(long sizeValue, ObservableCollection<ISizePreviewItem>? dataContextTopItems, int rootActualWidth)
=> dataContextTopItems is null
? 0
: (int) Math.Floor((double) rootActualWidth * sizeValue / dataContextTopItems.Select(i => i.Size.Value).Sum());
private IColor? GenerateSizeBackground(ObservableCollection<ISizePreviewItem> topItems, ISizePreviewItem? dc)
{
if (dc is null) return null;
var (r, g, b) = SizePreviewItemHelper.GetItemColor(topItems, dc);
return _colorProvider.FromRgb(new Rgb(r, g, b), ColorType.Background);
}
private IView<IElementPreviewViewModel> ElementPreviews()
{
var view = new Grid<IElementPreviewViewModel>
@@ -60,7 +195,6 @@ public class ItemPreviews
t,
dc => dc.Mode == ItemPreviewMode.Unknown,
t => t.IsVisible,
v => v,
fallbackValue: false)),
new TextBlock<IElementPreviewViewModel>
{
@@ -70,7 +204,6 @@ public class ItemPreviews
t,
dc => dc.Mode == ItemPreviewMode.Empty,
t => t.IsVisible,
v => v,
fallbackValue: false)),
new Grid<IElementPreviewViewModel>
{
@@ -85,7 +218,7 @@ public class ItemPreviews
dc => dc.TextContent,
t => t.Text,
fallbackValue: string.Empty);
t.Bind(
t,
dc => _appState.PreviewType,
@@ -99,7 +232,7 @@ public class ItemPreviews
b,
dc => dc.BinaryContent,
b => b.Data);
b.Bind(
b,
dc => _appState.PreviewType,
@@ -120,7 +253,6 @@ public class ItemPreviews
t,
dc => dc.Mode == ItemPreviewMode.Text,
t => t.IsVisible,
v => v,
fallbackValue: false)),
}
};
@@ -128,8 +260,7 @@ public class ItemPreviews
view.Bind(
view,
dc => dc.Name == ElementPreviewViewModel.PreviewName,
v => v.IsVisible,
v => v
v => v.IsVisible
);
return view;

View File

@@ -20,6 +20,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\AppCommon\FileTime.App.ContainerSizeScanner\FileTime.App.ContainerSizeScanner.csproj" />
<ProjectReference Include="..\..\AppCommon\FileTime.App.Core\FileTime.App.Core.csproj" />
<ProjectReference Include="..\..\AppCommon\FileTime.App.FrequencyNavigation\FileTime.App.FrequencyNavigation.csproj" />
<ProjectReference Include="..\..\Library\TerminalUI\TerminalUI.csproj" />

View File

@@ -1,5 +1,6 @@
using System.Globalization;
using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.Models.Traits;
using FileTime.App.Core.ViewModels;
using FileTime.ConsoleUI.App.Configuration;
using FileTime.ConsoleUI.App.Controls;
@@ -479,7 +480,9 @@ public class MainWindow
list.Bind(
list,
dc => dc.AppState.SelectedTab.Value.SelectedsChildren.Value.Count > 0,
dc =>
dc.AppState.SelectedTab.Value.SelectedsChildren.Value.Count > 0
&& dc.ItemPreviewService.ItemPreview.Value == null,
l => l.IsVisible,
fallbackValue: false);
@@ -534,52 +537,43 @@ public class MainWindow
);
}),
new StackPanel<IItemViewModel>
{
Extensions = {new GridPositionExtension(1, 0)},
ChildInitializer =
{
Extensions = {new GridPositionExtension(1, 0)},
ChildInitializer =
{
new TextBlock<IItemViewModel>()
.Setup(t =>
{
if (!options.ShowAttributes) return;
t.Bind(
t,
dc => ((IContainer) dc.BaseItem).Items.Count,
tb => tb.Text,
t => $" {t}");
})
}
}
.Setup(s => s.Bind(
s,
dc => dc.BaseItem.Type == AbsolutePathType.Container,
s => s.IsVisible)),
new StackPanel<IItemViewModel>
{
Extensions = {new GridPositionExtension(1, 0)},
ChildInitializer =
{
new TextBlock<IItemViewModel>()
.Setup(t =>
{
if (!options.ShowAttributes) return;
t.Bind(
t,
dc => ((IElementViewModel) dc).Size.Value,
tb => tb.Text,
v =>
{
var b = ByteSize.FromBytes(v);
new TextBlock<IItemViewModel>()
.Setup(t =>
{
if (!options.ShowAttributes) return;
t.Bind(
t,
dc => dc is ISizeProvider
? ((ISizeProvider) dc).Size.Value
: ((ISizeProvider) dc.BaseItem).Size.Value,
tb => tb.Text,
v =>
{
var b = ByteSize.FromBytes(v);
return $"{b.LargestWholeNumberValue:0.#} " + b.GetLargestWholeNumberSymbol(NumberFormatInfo.CurrentInfo).First();
});
})
}
return $"{b.LargestWholeNumberValue:0.#} " + b.GetLargestWholeNumberSymbol(NumberFormatInfo.CurrentInfo).First();
});
}),
/*new TextBlock<IItemViewModel>()
.Setup(t =>
{
if (!options.ShowAttributes) return;
t.Bind(
t,
dc => ((IContainer) dc.BaseItem).Items.Count,
tb => tb.Text,
t => $" {t,4}");
}).Setup(s => s.Bind(
s,
dc => dc.BaseItem.Type == AbsolutePathType.Container,
s => s.IsVisible))*/
}
.Setup(s => s.Bind(
s,
dc => dc.BaseItem.Type == AbsolutePathType.Element,
s => s.IsVisible))
},
}
}
}

View File

@@ -1,6 +1,4 @@
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.ExceptionServices;
using FileTime.App.Core;
using FileTime.App.Core.Configuration;
using FileTime.ConsoleUI;
@@ -52,7 +50,6 @@ try
}
finally
{
driver?.Clear();
driver?.SetCursorVisible(true);
driver?.Dispose();
}

View File

@@ -17,7 +17,7 @@ public static class Startup
{
public static readonly Dictionary<string, Func<IConsoleDriver>> Drivers = new()
{
["windows"] = () => new XTermDriver(),
["xterm"] = () => new XTermDriver(),
["dotnet"] = () => new DotnetDriver()
};
public static IServiceCollection AddConsoleDriver(this IServiceCollection serviceCollection)