Console size scan
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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))
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user