Container size scan, improvements

This commit is contained in:
2023-08-03 00:00:45 +02:00
parent 1713973c3a
commit f4d361f767
57 changed files with 814 additions and 532 deletions

View File

@@ -0,0 +1,11 @@
using System.Globalization;
using Avalonia.Data.Converters;
namespace FileTime.GuiApp.Converters;
public class DebugConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) => value;
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => value;
}

View File

@@ -1,46 +1,29 @@
using System.Globalization;
using Avalonia.Data.Converters;
using ByteSizeLib;
namespace FileTime.GuiApp.Converters;
public class FormatSizeConverter : IValueConverter
{
private const long OneKiloByte = 1024;
private const long OneMegaByte = OneKiloByte * 1024;
private const long OneGigaByte = OneMegaByte * 1024;
private const long OneTerraByte = OneGigaByte * 1024;
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
return (value, int.TryParse(parameter?.ToString(), out var prec)) switch
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) =>
(value, int.TryParse(parameter?.ToString(), out var prec)) switch
{
(long size, true) => ToSizeString(size, prec),
(long size, false) => ToSizeString(size),
(null, _) => "...",
_ => value
};
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public static string ToSizeString(long fileSize, int precision = 1)
public static string ToSizeString(long fileSize, int? precision = null)
{
var fileSizeD = (decimal)fileSize;
var (size, suffix) = fileSize switch
{
> OneTerraByte => (fileSizeD / OneTerraByte, "T"),
> OneGigaByte => (fileSizeD / OneGigaByte, "G"),
> OneMegaByte => (fileSizeD / OneMegaByte, "M"),
> OneKiloByte => (fileSizeD / OneKiloByte, "K"),
_ => (fileSizeD, "B")
};
var result = string.Format("{0:N" + precision + "}", size).Replace(',', '.');
if (result.Contains('.')) result = result.TrimEnd('0').TrimEnd('.');
return result + " " + suffix;
var size = new ByteSize(fileSize);
return precision == null? size.ToString()
: size.ToString("0." + new string('#', precision.Value));
}
}

View File

@@ -0,0 +1,25 @@
using System.Globalization;
using Avalonia.Data.Converters;
namespace FileTime.GuiApp.Converters;
public class IsTypeConverter : IValueConverter
{
public bool Invert { get; set; }
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (parameter is Type parameterType)
{
var result = parameterType.IsInstanceOfType(value);
if(Invert) result = !result;
return result;
}
throw new NotSupportedException();
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
=> throw new NotImplementedException();
}

View File

@@ -0,0 +1,41 @@
using System.Globalization;
using Avalonia.Data.Converters;
using Avalonia.Media;
using Avalonia.Threading;
using FileTime.App.ContainerSizeScanner;
using FileTime.GuiApp.Helper;
namespace FileTime.GuiApp.Converters;
public class ItemSizeToBrushConverter : IMultiValueConverter
{
public double HueDiff { get; set; }
public double Lightness { get; set; } = 0.75;
public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{
if (values is [ISizePreviewItem previewItem, ContainerPreview sizeContainerViewModel])
{
var items = sizeContainerViewModel.TopItems;
var i = 0;
for (; i < items.Count; i++)
{
if (items[i].Name == previewItem.Name) break;
}
var hue = (360d * i / (items.Count < 1 ? 1 : items.Count)) + HueDiff;
if (hue > 360) hue -= 360;
if (hue < 0) hue += 360;
var (r, g, b) = ColorHelper.HlsToRgb(hue, Lightness, 1);
var task = Dispatcher.UIThread.InvokeAsync(() => new SolidColorBrush(Color.FromRgb(r, g, b)));
task.Wait();
return task.Result;
}
return null;
}
private static byte Normalize(byte b) => (byte) (255 - (255 - b) / 2);
}

View File

@@ -0,0 +1,19 @@
using System.Globalization;
using Avalonia.Data.Converters;
using FileTime.App.ContainerSizeScanner;
namespace FileTime.GuiApp.Converters;
public class ItemSizeToSizeConverter : IMultiValueConverter
{
public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{
if (values is [ISizePreviewItem previewItem, ContainerPreview sizeContainerViewModel, double width and > 0])
{
var cumulativeSize = sizeContainerViewModel.TopItems.Select(i => i.Size.Value).Sum();
return width * previewItem.Size.Value / cumulativeSize;
}
return null;
}
}

View File

@@ -1,36 +0,0 @@
using System.Globalization;
using Avalonia.Data.Converters;
using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.ViewModels;
namespace FileTime.GuiApp.Converters;
public class ItemViewModelIsAttributeTypeConverter : IValueConverter
{
public bool Invert { get; set; }
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
var attributeType = GetAttributeType(value);
if (parameter == null) return attributeType;
var result = parameter is ItemAttributeType targetAttribute && attributeType == targetAttribute;
if (Invert && parameter is ItemAttributeType) result = !result;
return result;
}
private static ItemAttributeType? GetAttributeType(object? value)
{
return value switch
{
IFileViewModel => ItemAttributeType.File,
IContainerSizeContainerViewModel => ItemAttributeType.SizeContainer,
IElementViewModel => ItemAttributeType.Element,
IContainerViewModel => ItemAttributeType.Container,
_ => null
};
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

View File

@@ -0,0 +1,43 @@
namespace FileTime.GuiApp.Helper;
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

@@ -26,18 +26,13 @@
SelectedBrush="{StaticResource SelectedItemBackgroundBrush}"
x:Key="ItemViewModeToBackgroundConverter" />
<converters:NamePartShrinkerConverter x:Key="NamePartShrinkerConverter" />
<converters:ItemViewModelIsAttributeTypeConverter x:Key="ItemViewModelIsAttributeTypeConverter" />
<converters:ItemViewModelIsAttributeTypeConverter Invert="true"
x:Key="ItemViewModelIsNotAttributeTypeConverter" />
<converters:GetFileExtensionConverter x:Key="GetFileExtensionConverter" />
<converters:FormatSizeConverter x:Key="FormatSizeConverter" />
<converters:DateTimeConverter x:Key="DateTimeConverter" />
<converters:SplitStringConverter x:Key="SplitStringConverter" />
<converters:CompareConverter x:Key="EqualsConverter" />
<converters:CompareConverter ComparisonCondition="{x:Static converters:ComparisonCondition.NotEqual}"
x:Key="NotEqualsConverter" />
<converters:CompareConverter ComparisonCondition="{x:Static converters:ComparisonCondition.GreaterThan}"
x:Key="GreaterThanConverter" />
<converters:CompareConverter ComparisonCondition="{x:Static converters:ComparisonCondition.NotEqual}" x:Key="NotEqualsConverter" />
<converters:CompareConverter ComparisonCondition="{x:Static converters:ComparisonCondition.GreaterThan}" x:Key="GreaterThanConverter" />
<converters:ExceptionToStringConverter x:Key="ExceptionToStringConverter" />
<converters:CommandToCommandNameConverter x:Key="CommandToCommandNameConverter" />
<converters:ItemToImageConverter x:Key="ItemToImageConverter" />
@@ -47,6 +42,16 @@
x:Key="PathPreformatter" />
<converters:ContextMenuGenerator x:Key="ContextMenuGenerator" />
<converters:TextDecorationConverter x:Key="TextDecorationConverter" />
<converters:ItemSizeToSizeConverter x:Key="ItemSizeToSizeConverter" />
<converters:ItemSizeToBrushConverter x:Key="ItemSizeToBrushConverter" />
<converters:ItemSizeToBrushConverter
HueDiff="90"
Lightness="0.25"
x:Key="ItemSizeToForegroundBrushConverter" />
<converters:IsTypeConverter x:Key="IsTypeConverter" />
<converters:IsTypeConverter Invert="True" x:Key="IsNotTypeConverter" />
<converters:DebugConverter x:Key="DebugConverter" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

View File

@@ -5,6 +5,7 @@ using FileTime.App.Core.UserCommand;
using FileTime.App.Core.ViewModels;
using FileTime.Core.Extensions;
using FileTime.Core.Models;
using FileTime.Core.Models.ContainerTraits;
using FileTime.GuiApp.Configuration;
using FileTime.GuiApp.Extensions;
using FileTime.GuiApp.Models;
@@ -66,20 +67,23 @@ public class DefaultModeKeyInputHandler : IDefaultModeKeyInputHandler
if (key == Key.Escape)
{
bool doGeneralReset = _appState.PreviousKeys.Count > 1 || _appState.IsAllShortcutVisible;
var doGeneralReset = _appState.PreviousKeys.Count > 1 || _appState.IsAllShortcutVisible;
if ((_openModals.Collection?.Count ?? 0) > 0)
{
_modalService.CloseModal(_openModals.Collection!.Last());
}
/*else if (_currentLocation.Container.CanHandleEscape)
else if (_currentLocation is IEscHandlerContainer escHandler)
{
var escapeResult = await _currentLocation.Container.HandleEscape();
var escapeResult = await escHandler.HandleEsc();
if (escapeResult.NavigateTo != null)
{
setHandled(true);
_appState.PreviousKeys.Clear();
await _appState.SelectedTab.OpenContainer(escapeResult.NavigateTo);
if (_appState.SelectedTab.Value?.Tab is { } selectedTab)
{
await selectedTab.SetCurrentLocation(escapeResult.NavigateTo);
}
}
else
{
@@ -92,7 +96,7 @@ public class DefaultModeKeyInputHandler : IDefaultModeKeyInputHandler
doGeneralReset = true;
}
}
}*/
}
if (doGeneralReset)
{

View File

@@ -1,52 +1,49 @@
<UserControl
Background="{Binding ViewMode.Value, Converter={StaticResource ItemViewModeToBackgroundConverter}}"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d"
x:Class="FileTime.GuiApp.Views.ItemView"
x:CompileBindings="True"
x:DataType="appcore:IItemViewModel"
x:Name="ItemRoot"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:appcore="using:FileTime.App.Core.ViewModels"
xmlns:appcoreenums="using:FileTime.App.Core.Models.Enums"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:guiappvm="using:FileTime.GuiApp.ViewModels"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="ItemRoot"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
d:DesignHeight="450"
d:DesignWidth="800"
x:CompileBindings="True"
x:DataType="appcore:IItemViewModel"
Background="{Binding ViewMode^, Converter={StaticResource ItemViewModeToBackgroundConverter}}"
mc:Ignorable="d">
xmlns:traits="clr-namespace:FileTime.App.Core.Models.Traits;assembly=FileTime.App.Core.Abstraction"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid
x:Name="RootGrid"
ColumnDefinitions="20,*,Auto"
Margin="3"
ColumnDefinitions="20,*,Auto">
x:Name="RootGrid">
<Grid.Styles>
<Style Selector="TextBlock">
<Setter x:CompileBindings="False" Property="Foreground" Value="{Binding DataContext.ViewMode^, Converter={StaticResource ItemViewModeToForegroundConverter}, ElementName=ItemRoot}" />
<Setter Property="Foreground" Value="{Binding DataContext.ViewMode.Value, Converter={StaticResource ItemViewModeToForegroundConverter}, ElementName=ItemRoot}" x:CompileBindings="False" />
</Style>
</Grid.Styles>
<Image
Width="18"
Height="18"
HorizontalAlignment="Left"
Source="{Binding Converter={StaticResource ItemToImageConverter}}"
VerticalAlignment="Center"
Source="{Binding Converter={StaticResource ItemToImageConverter}}" />
Width="18" />
<ItemsControl
Grid.Column="1"
Margin="5,0,0,0"
HorizontalAlignment="Stretch"
Margin="5,0,0,0"
VerticalAlignment="Center">
<ItemsControl.ItemsSource>
<MultiBinding Converter="{StaticResource NamePartShrinkerConverter}">
<MultiBinding.Bindings>
<Binding Path="DisplayName^" />
<Binding
ElementName="RootGrid"
Path="Bounds.Width" />
<Binding
ElementName="ItemRoot"
Path="ShowAttributes" />
<Binding ElementName="RootGrid" Path="Bounds.Width" />
<Binding ElementName="ItemRoot" Path="ShowAttributes" />
</MultiBinding.Bindings>
</MultiBinding>
</ItemsControl.ItemsSource>
@@ -58,96 +55,55 @@
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="guiappvm:ItemNamePartViewModel">
<Grid>
<TextBlock
Text="{Binding Text}"
TextDecorations="{Binding TextDecorations}" />
<TextBlock Text="{Binding Text}" TextDecorations="{Binding TextDecorations}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid
Grid.Column="2"
IsVisible="{Binding ShowAttributes, ElementName=ItemRoot}">
<Grid
HorizontalAlignment="Right"
x:DataType="appcore:IFileViewModel"
ColumnDefinitions="50,50,90,40,45"
IsVisible="{Binding Converter={StaticResource ItemViewModelIsAttributeTypeConverter}, ConverterParameter={x:Static appcoreenums:ItemAttributeType.File}}">
<Grid Grid.Column="2" IsVisible="{Binding ShowAttributes, ElementName=ItemRoot}">
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
<TextBlock
Classes="SmallText"
IsVisible="{Binding Converter={StaticResource IsTypeConverter}, ConverterParameter={x:Type appcore:IElementViewModel}}"
Text="{Binding BaseItem.DisplayName, Converter={StaticResource GetFileExtensionConverter}}"
Width="50" />
<Grid DataContext="{Binding BaseItem}" IsVisible="{Binding Converter={StaticResource IsTypeConverter}, ConverterParameter={x:Type traits:ISizeProvider}}">
<TextBlock
Classes="SmallText"
Text="{Binding Size.Value, Converter={StaticResource FormatSizeConverter}}"
TextAlignment="Right"
Width="60"
x:DataType="traits:ISizeProvider" />
</Grid>
<Grid IsVisible="{Binding BaseItem, Converter={StaticResource IsNotTypeConverter}, ConverterParameter={x:Type traits:ISizeProvider}}">
<TextBlock
Classes="SmallText"
IsVisible="{Binding Converter={StaticResource IsTypeConverter}, ConverterParameter={x:Type traits:ISizeProvider}}"
Text="{Binding Size.Value, Converter={StaticResource FormatSizeConverter}}"
TextAlignment="Right"
Width="60"
x:DataType="traits:ISizeProvider" />
</Grid>
<TextBlock
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding BaseItem.DisplayName, Converter={StaticResource GetFileExtensionConverter}}" />
Text="{Binding CreatedAt, Converter={StaticResource DateTimeConverter}, ConverterParameter=yyyy-MM-dd}"
TextAlignment="Right"
Width="95" />
<TextBlock
Grid.Column="1"
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding Size, Converter={StaticResource FormatSizeConverter}, ConverterParameter=0}" />
Text="{Binding CreatedAt, Converter={StaticResource DateTimeConverter}, ConverterParameter=hh:mm}"
TextAlignment="Right"
Width="35" />
<TextBlock
Grid.Column="2"
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding BaseItem.CreatedAt, Converter={StaticResource DateTimeConverter}, ConverterParameter=yyyy-MM-dd}" />
<TextBlock
Grid.Column="3"
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding BaseItem.CreatedAt, Converter={StaticResource DateTimeConverter}, ConverterParameter=hh:mm}" />
<TextBlock
Grid.Column="4"
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding BaseItem.Attributes}" />
</Grid>
<Grid
HorizontalAlignment="Right"
x:DataType="appcore:IContainerViewModel"
ColumnDefinitions="90,40,45"
IsVisible="{Binding Converter={StaticResource ItemViewModelIsAttributeTypeConverter}, ConverterParameter={x:Static appcoreenums:ItemAttributeType.Container}}">
Text="{Binding BaseItem.Attributes}"
TextAlignment="Right"
Width="45" />
<TextBlock
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding CreatedAt, Converter={StaticResource DateTimeConverter}, ConverterParameter=yyyy-MM-dd}" />
<TextBlock
Grid.Column="1"
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding BaseItem.CreatedAt, Converter={StaticResource DateTimeConverter}, ConverterParameter=hh:mm}" />
<TextBlock
Grid.Column="2"
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding BaseItem.Attributes}" />
</Grid>
<Grid
HorizontalAlignment="Right"
x:DataType="appcore:IContainerSizeContainerViewModel"
ColumnDefinitions="50,90,40,45"
IsVisible="{Binding Converter={StaticResource ItemViewModelIsAttributeTypeConverter}, ConverterParameter={x:Static appcoreenums:ItemAttributeType.SizeContainer}}">
</StackPanel>
<TextBlock
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding Size, Converter={StaticResource FormatSizeConverter}, ConverterParameter=0}" />
</Grid>
<Grid
HorizontalAlignment="Right"
x:DataType="appcore:IElementViewModel"
ColumnDefinitions="50,50"
IsVisible="{Binding Converter={StaticResource ItemViewModelIsAttributeTypeConverter}, ConverterParameter={x:Static appcoreenums:ItemAttributeType.Element}}">
<TextBlock
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding BaseItem.DisplayName, Converter={StaticResource GetFileExtensionConverter}}" />
<TextBlock
Grid.Column="1"
HorizontalAlignment="Right"
Classes="SmallText"
Text="{Binding Size, Converter={StaticResource FormatSizeConverter}, ConverterParameter=0}" />
</Grid>
</Grid>
</Grid>
</UserControl>

View File

@@ -61,8 +61,8 @@
<Grid ColumnDefinitions="*, Auto">
<StackPanel Margin="20,10" Orientation="Horizontal">
<local:PathPresenter DataContext="{Binding AppState.SelectedTab^.CurrentLocation^.FullName.Path, Converter={StaticResource PathPreformatter}}" />
<TextBlock Foreground="{StaticResource AccentBrush}" Text="{Binding AppState.SelectedTab^.CurrentSelectedItem.Value.DisplayNameText}" />
<local:PathPresenter DataContext="{Binding AppState.SelectedTab.Value.CurrentLocation^.FullName.Path, Converter={StaticResource PathPreformatter}}" />
<TextBlock Foreground="{StaticResource AccentBrush}" Text="{Binding AppState.SelectedTab.Value.CurrentSelectedItem.Value.DisplayNameText}" />
</StackPanel>
<StackPanel
Grid.Column="1"
@@ -153,7 +153,7 @@
<TextBlock
Classes="SmallText"
Text="{Binding Free, Converter={StaticResource FormatSizeConverter}, ConverterParameter=0}"
Text="{Binding Free, Converter={StaticResource FormatSizeConverter}}"
VerticalAlignment="Center" />
<TextBlock
@@ -163,7 +163,7 @@
<TextBlock
Classes="SmallText"
Text="{Binding Size, Converter={StaticResource FormatSizeConverter}, ConverterParameter=0}"
Text="{Binding Size, Converter={StaticResource FormatSizeConverter}}"
VerticalAlignment="Center" />
</StackPanel>
@@ -437,7 +437,7 @@
AutoScrollToSelectedItem="True"
Classes="ContentListView"
IsTabStop="True"
ItemsSource="{Binding AppState.SelectedTab^.ParentsChildren.Value}"
ItemsSource="{Binding AppState.SelectedTab.Value.ParentsChildren.Value}"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Visible">
<ListBox.ItemTemplate>
@@ -459,7 +459,7 @@
Width="1" />
<Grid Grid.Column="2" RowDefinitions="Auto,*">
<Grid IsVisible="{Binding AppState.SelectedTab^.CurrentLocation.Value.IsLoading^, FallbackValue=False}">
<Grid IsVisible="{Binding AppState.SelectedTab.Value.CurrentLocation.Value.IsLoading^, FallbackValue=False}">
<Image
Classes="LoadingAnimation"
Height="40"
@@ -471,10 +471,10 @@
Classes="ContentListView"
Grid.Row="1"
IsTabStop="True"
ItemsSource="{Binding AppState.SelectedTab^.CurrentItems.Value}"
ItemsSource="{Binding AppState.SelectedTab.Value.CurrentItems.Value}"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectedItem="{Binding AppState.SelectedTab^.CurrentSelectedItem.Value}"
SelectedItem="{Binding AppState.SelectedTab.Value.CurrentSelectedItem.Value}"
x:Name="CurrentItems">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="corevm:IItemViewModel">
@@ -488,7 +488,7 @@
Foreground="{DynamicResource ErrorBrush}"
Grid.Row="1"
HorizontalAlignment="Center"
IsVisible="{Binding AppState.SelectedTab^.CurrentItems.Value.Count, Converter={StaticResource EqualsConverter}, ConverterParameter=0}"
IsVisible="{Binding AppState.SelectedTab.Value.CurrentItems.Value.Count, Converter={StaticResource EqualsConverter}, ConverterParameter=0}"
Margin="10"
x:Name="CurrentEmpty">
Empty
@@ -504,11 +504,11 @@
Width="1" />
<Grid Grid.Column="4">
<Grid IsVisible="{Binding ItemPreviewService.ItemPreview^, Converter={x:Static ObjectConverters.IsNull}}">
<Grid IsVisible="{Binding AppState.SelectedTab^.SelectedsChildren.Value, Converter={x:Static ObjectConverters.IsNotNull}, FallbackValue=False}">
<Grid IsVisible="{Binding ItemPreviewService.ItemPreview.Value, Converter={x:Static ObjectConverters.IsNull}}">
<Grid IsVisible="{Binding AppState.SelectedTab.Value.SelectedsChildren.Value, Converter={x:Static ObjectConverters.IsNotNull}, FallbackValue=False}">
<Grid RowDefinitions="Auto, Auto, *">
<Grid IsVisible="{Binding AppState.SelectedTab^.CurrentSelectedItemAsContainer.Value.Container.IsLoading^, FallbackValue=False}">
<Grid IsVisible="{Binding AppState.SelectedTab.Value.CurrentSelectedItemAsContainer.Value.Container.IsLoading^, FallbackValue=False}">
<Image
Classes="LoadingAnimation"
Height="40"
@@ -517,7 +517,7 @@
</Grid>
<ItemsRepeater Grid.Row="1" ItemsSource="{Binding AppState.SelectedTab^.CurrentLocation.Value.Exceptions}">
<ItemsRepeater Grid.Row="1" ItemsSource="{Binding AppState.SelectedTab.Value.CurrentLocation.Value.Exceptions}">
<ItemsRepeater.ItemTemplate>
<DataTemplate>
<TextBlock
@@ -532,8 +532,8 @@
AutoScrollToSelectedItem="True"
Classes="ContentListView"
Grid.Row="2"
IsVisible="{Binding AppState.SelectedTab^.SelectedsChildren.Value.Count, Converter={StaticResource NotEqualsConverter}, ConverterParameter=0}"
ItemsSource="{Binding AppState.SelectedTab^.SelectedsChildren.Value}"
IsVisible="{Binding AppState.SelectedTab.Value.SelectedsChildren.Value.Count, Converter={StaticResource NotEqualsConverter}, ConverterParameter=0}"
ItemsSource="{Binding AppState.SelectedTab.Value.SelectedsChildren.Value}"
x:Name="ChildItems">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="corevm:IItemViewModel">
@@ -547,14 +547,14 @@
FontWeight="Bold"
Foreground="{DynamicResource ErrorBrush}"
HorizontalAlignment="Center"
IsVisible="{Binding AppState.SelectedTab^.SelectedsChildren.Value.Count, Converter={StaticResource EqualsConverter}, ConverterParameter=0}"
IsVisible="{Binding AppState.SelectedTab.Value.SelectedsChildren.Value.Count, Converter={StaticResource EqualsConverter}, ConverterParameter=0}"
Margin="10"
x:Name="ChildEmpty">
Empty
</TextBlock>
</Grid>
<Grid IsVisible="{Binding AppState.SelectedTab^.SelectedsChildren.Value, Converter={x:Static ObjectConverters.IsNull}, ConverterParameter=0, FallbackValue=False}" RowDefinitions="Auto, Auto">
<Grid IsVisible="{Binding AppState.SelectedTab.Value.SelectedsChildren.Value, Converter={x:Static ObjectConverters.IsNull}, ConverterParameter=0, FallbackValue=False}" RowDefinitions="Auto, Auto">
<TextBlock
Foreground="{DynamicResource ErrorBrush}"
HorizontalAlignment="Center"
@@ -562,7 +562,7 @@
Text="There were some errors while opening container."
TextWrapping="Wrap" />
<ItemsRepeater Grid.Row="1" ItemsSource="{Binding AppState.SelectedTab^.CurrentSelectedItem.Value.BaseItem.Exceptions}">
<ItemsRepeater Grid.Row="1" ItemsSource="{Binding AppState.SelectedTab.Value.CurrentSelectedItem.Value.BaseItem.Exceptions}">
<ItemsRepeater.ItemTemplate>
<DataTemplate>
<TextBlock
@@ -574,109 +574,109 @@
</ItemsRepeater>
</Grid>
</Grid>
<Grid DataContext="{Binding ItemPreviewService.ItemPreview^}" IsVisible="{Binding Converter={x:Static ObjectConverters.IsNotNull}}">
<Grid IsVisible="{Binding Name, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static itemPreview:ElementPreviewViewModel.PreviewName}}" x:DataType="itemPreview:ElementPreviewViewModel">
<TextBlock
HorizontalAlignment="Center"
IsVisible="{Binding Mode, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static appCoreModels:ItemPreviewMode.Unknown}, FallbackValue={x:Static appCoreModels:ItemPreviewMode.Unknown}}"
Text="Don't know how to preview this item." />
<TextBlock
HorizontalAlignment="Center"
IsVisible="{Binding Mode, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static appCoreModels:ItemPreviewMode.Empty}, FallbackValue={x:Static appCoreModels:ItemPreviewMode.Unknown}}"
Text="Empty" />
<Grid IsVisible="{Binding Mode, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static appCoreModels:ItemPreviewMode.Text}, FallbackValue={x:Static appCoreModels:ItemPreviewMode.Unknown}}" RowDefinitions="*, Auto">
<ScrollViewer>
<TextBox IsReadOnly="True" Text="{Binding TextContent}" />
</ScrollViewer>
<Grid DataContext="{Binding ItemPreviewService.ItemPreview.Value}" IsVisible="{Binding FallbackValue=false, Converter={x:Static ObjectConverters.IsNotNull}}">
<Grid IsVisible="{Binding Name, FallbackValue=false, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static itemPreview:ElementPreviewViewModel.PreviewName}}">
<Grid x:DataType="itemPreview:ElementPreviewViewModel">
<TextBlock
Grid.Row="1"
Margin="5"
Text="{Binding TextEncoding, StringFormat=Encoding: {0}}" />
HorizontalAlignment="Center"
IsVisible="{Binding Mode, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static appCoreModels:ItemPreviewMode.Unknown}, FallbackValue={x:Static appCoreModels:ItemPreviewMode.Unknown}}"
Text="Don't know how to preview this item." />
<TextBlock
HorizontalAlignment="Center"
IsVisible="{Binding Mode, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static appCoreModels:ItemPreviewMode.Empty}, FallbackValue={x:Static appCoreModels:ItemPreviewMode.Unknown}}"
Text="Empty" />
<Grid IsVisible="{Binding Mode, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static appCoreModels:ItemPreviewMode.Text}, FallbackValue={x:Static appCoreModels:ItemPreviewMode.Unknown}}" RowDefinitions="*, Auto">
<ScrollViewer>
<TextBox IsReadOnly="True" Text="{Binding TextContent}" />
</ScrollViewer>
<TextBlock
Grid.Row="1"
Margin="5"
Text="{Binding TextEncoding, StringFormat=Encoding: {0}}" />
</Grid>
</Grid>
</Grid>
<Grid
IsVisible="{Binding Name, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static sizePreview:ContainerSizeContainerPreview.PreviewName}}"
RowDefinitions="Auto, Auto"
x:DataType="sizePreview:ContainerSizeContainerPreview">
<ItemsControl Items="{Binding TopItems^}" Margin="0,0,0,30">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.Width>
<MultiBinding Converter="{StaticResource ItemSizeToSizeConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding ElementName="SizeContainerPreview" Path="DataContext.TopItems^" />
<Binding ElementName="SizeContainerPreview" Path="Bounds.Width" />
</MultiBinding.Bindings>
</MultiBinding>
</Grid.Width>
<Rectangle HorizontalAlignment="Stretch">
<Rectangle.Fill>
<MultiBinding Converter="{StaticResource ItemSizeToBrushConverter}">
<Grid IsVisible="{Binding Name, FallbackValue=false, Converter={StaticResource EqualsConverter}, ConverterParameter={x:Static sizePreview:ContainerPreview.PreviewName}}" x:Name="SizeContainerPreview">
<Grid RowDefinitions="Auto, Auto" x:DataType="sizePreview:ContainerPreview">
<ItemsControl ItemsSource="{Binding TopItems}" Margin="0,0,0,30">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.Width>
<MultiBinding Converter="{StaticResource ItemSizeToSizeConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding ElementName="SizeContainerPreview" Path="DataContext.Items^" />
<Binding ElementName="SizeContainerPreview" Path="DataContext" />
<Binding ElementName="SizeContainerPreview" Path="Bounds.Width" />
</MultiBinding.Bindings>
</MultiBinding>
</Rectangle.Fill>
</Rectangle>
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock
Classes="SmallText"
Margin="0,5,0,2"
Text="{Binding Name}">
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource ItemSizeToForegroundBrushConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding ElementName="SizeContainerPreview" Path="DataContext.Items^" />
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>
<TextBlock
Classes="SmallText"
Margin="0,2,0,5"
Text="{Binding Size, Converter={StaticResource FormatSizeConverter}, ConverterParameter=0}">
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource ItemSizeToForegroundBrushConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding ElementName="SizeContainerPreview" Path="DataContext.Items^" />
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid.Width>
<ItemsControl
Grid.Row="1"
Items="{Binding Items^}"
x:CompileBindings="False">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="Auto,*" Margin="0,0,0,20">
<TextBlock Text="{Binding Name}" />
<TextBlock
Grid.Column="1"
HorizontalAlignment="Right"
Margin="0,0,20,0"
Text="{Binding Size, Converter={StaticResource FormatSizeConverter}, ConverterParameter=0}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Rectangle HorizontalAlignment="Stretch">
<Rectangle.Fill>
<MultiBinding Converter="{StaticResource ItemSizeToBrushConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding ElementName="SizeContainerPreview" Path="DataContext" />
</MultiBinding.Bindings>
</MultiBinding>
</Rectangle.Fill>
</Rectangle>
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock
Classes="SmallText"
FontWeight="Bold"
Margin="5,5,5,2"
Text="{Binding Name}">
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource ItemSizeToForegroundBrushConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding ElementName="SizeContainerPreview" Path="DataContext" />
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>
<TextBlock
Classes="SmallText"
FontWeight="Bold"
Margin="5,2,5,5"
Text="{Binding Size.Value, Converter={StaticResource FormatSizeConverter}}">
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource ItemSizeToForegroundBrushConverter}">
<MultiBinding.Bindings>
<Binding />
<Binding ElementName="SizeContainerPreview" Path="DataContext" />
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl Grid.Row="1" ItemsSource="{Binding TopItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="Auto,*" Margin="0,0,0,20">
<TextBlock Text="{Binding Name}" />
<TextBlock
Grid.Column="1"
HorizontalAlignment="Right"
Margin="0,0,20,0"
Text="{Binding Size.Value, Converter={StaticResource FormatSizeConverter}}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Grid>
</Grid>
</Grid>
@@ -684,7 +684,7 @@
<ItemsRepeater
HorizontalAlignment="Center"
IsVisible="{Binding AppState.PopupTexts.Count, Converter={StaticResource NotEqualsConverter}, ConverterParameter=0}"
IsVisible="{Binding AppState.PopupTexts.Count, Converter={StaticResource NotEqualsConverter}}"
ItemsSource="{Binding AppState.PopupTexts}"
Margin="0,0,0,20"
VerticalAlignment="Top">
@@ -718,57 +718,62 @@
</ItemsRepeater>
</Grid>
<Grid Grid.Row="3">
<Grid IsVisible="{Binding AppState.ViewMode^, Converter={StaticResource EqualsConverter}, ConverterParameter=RapidTravel}" RowDefinitions="1,Auto">
<Rectangle
Fill="{DynamicResource ContentSeparatorBrush}"
Height="1"
HorizontalAlignment="Stretch"
Margin="10,0"
VerticalAlignment="Center" />
<StackPanel
Grid.Row="1"
Margin="30,10,10,10"
Orientation="Horizontal">
<TextBlock Margin="0,0,30,0" Text="Rapid travel mode" />
<TextBlock Text="Filter " />
<TextBlock Text="{Binding AppState.RapidTravelText.Value}" />
</StackPanel>
<Grid Grid.Row="3" RowDefinitions="Auto, Auto">
<Grid>
<TextBlock IsVisible="{Binding AppState.ContainerStatus.Value, Converter={x:Static ObjectConverters.IsNotNull}}" Text="{Binding AppState.ContainerStatus.Value}" />
</Grid>
<Grid Grid.Row="1">
<Grid IsVisible="{Binding AppState.ViewMode^, Converter={StaticResource EqualsConverter}, ConverterParameter=RapidTravel}" RowDefinitions="1,Auto">
<Grid IsVisible="{Binding AppState.PossibleCommands.Count, Converter={StaticResource NotEqualsConverter}, ConverterParameter=0}">
<Grid.RowDefinitions>
<RowDefinition Height="1" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle
Fill="{DynamicResource ContentSeparatorBrush}"
Height="1"
HorizontalAlignment="Stretch"
Margin="10,0"
VerticalAlignment="Center" />
<Rectangle
Fill="{DynamicResource ContentSeparatorBrush}"
Height="1"
HorizontalAlignment="Stretch"
Margin="10,0"
VerticalAlignment="Center" />
<StackPanel
Grid.Row="1"
Margin="30,10,10,10"
Orientation="Horizontal">
<ItemsRepeater Grid.Row="1" ItemsSource="{Binding AppState.PossibleCommands}">
<ItemsRepeater.ItemTemplate>
<DataTemplate x:DataType="config:CommandBindingConfiguration">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Margin="0,0,30,0" Text="Rapid travel mode" />
<TextBlock Text="{Binding KeysDisplayText}" />
<TextBlock Grid.Column="1" Text="{Binding Command, Converter={StaticResource CommandToCommandNameConverter}}" />
</Grid>
</DataTemplate>
</ItemsRepeater.ItemTemplate>
</ItemsRepeater>
<TextBlock Text="Filter " />
<TextBlock Text="{Binding AppState.RapidTravelText.Value}" />
</StackPanel>
</Grid>
<Grid IsVisible="{Binding AppState.PossibleCommands.Count, Converter={StaticResource NotEqualsConverter}, ConverterParameter=0}">
<Grid.RowDefinitions>
<RowDefinition Height="1" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle
Fill="{DynamicResource ContentSeparatorBrush}"
Height="1"
HorizontalAlignment="Stretch"
Margin="10,0"
VerticalAlignment="Center" />
<ItemsRepeater Grid.Row="1" ItemsSource="{Binding AppState.PossibleCommands}">
<ItemsRepeater.ItemTemplate>
<DataTemplate x:DataType="config:CommandBindingConfiguration">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding KeysDisplayText}" />
<TextBlock Grid.Column="1" Text="{Binding Command, Converter={StaticResource CommandToCommandNameConverter}}" />
</Grid>
</DataTemplate>
</ItemsRepeater.ItemTemplate>
</ItemsRepeater>
</Grid>
</Grid>
</Grid>
</Grid>