Migrate to Avalonia 11.0.0-preview6
This commit is contained in:
parent
ed6f741a65
commit
7289459170
@ -7,6 +7,6 @@
|
|||||||
</Application.DataTemplates>
|
</Application.DataTemplates>
|
||||||
|
|
||||||
<Application.Styles>
|
<Application.Styles>
|
||||||
<FluentTheme Mode="Light"/>
|
<FluentTheme/>
|
||||||
</Application.Styles>
|
</Application.Styles>
|
||||||
</Application>
|
</Application>
|
||||||
|
|||||||
@ -66,13 +66,13 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
||||||
<PackageReference Include="Avalonia" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="Avalonia.Desktop" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia.Desktop" Version="11.0.0-preview6" />
|
||||||
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.0-preview4" />
|
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="Avalonia.ReactiveUI" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia.ReactiveUI" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia.Controls.ItemsRepeater" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="XamlNameReferenceGenerator" Version="1.6.1" />
|
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.0-preview6" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\HangoverBase\HangoverBase.csproj" />
|
<ProjectReference Include="..\HangoverBase\HangoverBase.csproj" />
|
||||||
|
|||||||
@ -7,7 +7,7 @@ namespace HangoverAvalonia
|
|||||||
{
|
{
|
||||||
public class ViewLocator : IDataTemplate
|
public class ViewLocator : IDataTemplate
|
||||||
{
|
{
|
||||||
public IControl Build(object data)
|
public Control Build(object data)
|
||||||
{
|
{
|
||||||
var name = data.GetType().FullName!.Replace("ViewModel", "View");
|
var name = data.GetType().FullName!.Replace("ViewModel", "View");
|
||||||
var type = Type.GetType(name);
|
var type = Type.GetType(name);
|
||||||
|
|||||||
@ -64,7 +64,8 @@ namespace HangoverBase
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var sql = _commands.SqlInput().Trim();
|
var sql = _commands.SqlInput()?.Trim();
|
||||||
|
if (sql is null) return;
|
||||||
|
|
||||||
#region // explanation
|
#region // explanation
|
||||||
// Routing statements to non-query is a convenience.
|
// Routing statements to non-query is a convenience.
|
||||||
|
|||||||
@ -8,10 +8,9 @@
|
|||||||
</Application.DataTemplates>
|
</Application.DataTemplates>
|
||||||
|
|
||||||
<Application.Styles>
|
<Application.Styles>
|
||||||
<FluentTheme Mode="Light"/>
|
<FluentTheme />
|
||||||
<StyleInclude Source="avares://Avalonia.Themes.Fluent/FluentLight.xaml"/>
|
<StyleInclude Source="avares://Avalonia.Themes.Fluent/FluentTheme.xaml"/>
|
||||||
<StyleInclude Source="avares://Avalonia.Themes.Fluent/Accents/BaseLight.xaml"/>
|
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
|
||||||
<StyleInclude Source="/Assets/DataGridTheme.xaml"/>
|
|
||||||
<StyleInclude Source="/Assets/LibationStyles.xaml"/>
|
<StyleInclude Source="/Assets/LibationStyles.xaml"/>
|
||||||
</Application.Styles>
|
</Application.Styles>
|
||||||
</Application>
|
</Application>
|
||||||
@ -1,658 +0,0 @@
|
|||||||
<Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
|
||||||
<Styles.Resources>
|
|
||||||
<x:Double x:Key="ListAccentLowOpacity">0.6</x:Double>
|
|
||||||
<x:Double x:Key="ListAccentMediumOpacity">0.8</x:Double>
|
|
||||||
<Thickness x:Key="DataGridTextColumnCellTextBlockMargin">12,0,12,0</Thickness>
|
|
||||||
|
|
||||||
<StreamGeometry x:Key="DataGridSortIconDescendingPath">M1875 1011l-787 787v-1798h-128v1798l-787 -787l-90 90l941 941l941 -941z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="DataGridRowGroupHeaderIconClosedPath">M515 93l930 931l-930 931l90 90l1022 -1021l-1022 -1021z</StreamGeometry>
|
|
||||||
<StreamGeometry x:Key="DataGridRowGroupHeaderIconOpenedPath">M1939 1581l90 -90l-1005 -1005l-1005 1005l90 90l915 -915z</StreamGeometry>
|
|
||||||
|
|
||||||
<SolidColorBrush x:Key="DataGridColumnHeaderForegroundBrush" Color="{DynamicResource SystemBaseMediumColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridColumnHeaderBackgroundBrush" Color="{DynamicResource SystemAltHighColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridColumnHeaderHoveredBackgroundBrush" Color="{DynamicResource SystemListLowColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridColumnHeaderPressedBackgroundBrush" Color="{DynamicResource SystemListMediumColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridColumnHeaderDraggedBackgroundBrush" Color="{DynamicResource SystemChromeMediumLowColor}" />
|
|
||||||
|
|
||||||
<SolidColorBrush x:Key="DataGridRowGroupHeaderBackgroundBrush" Color="{DynamicResource SystemChromeMediumColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowGroupHeaderPressedBackgroundBrush" Color="{DynamicResource SystemListMediumColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowGroupHeaderForegroundBrush" Color="{DynamicResource SystemBaseHighColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowGroupHeaderHoveredBackgroundBrush" Color="{DynamicResource SystemListLowColor}" />
|
|
||||||
|
|
||||||
<StaticResource x:Key="DataGridRowBackgroundBrush" ResourceKey="SystemControlTransparentBrush" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowSelectedBackgroundBrush" Color="{DynamicResource SystemAccentColor}" />
|
|
||||||
<StaticResource x:Key="DataGridRowSelectedBackgroundOpacity" ResourceKey="ListAccentLowOpacity" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowSelectedHoveredBackgroundBrush" Color="{DynamicResource SystemAccentColor}" />
|
|
||||||
<StaticResource x:Key="DataGridRowSelectedHoveredBackgroundOpacity" ResourceKey="ListAccentMediumOpacity" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowSelectedUnfocusedBackgroundBrush" Color="{DynamicResource SystemAccentColor}" />
|
|
||||||
<StaticResource x:Key="DataGridRowSelectedUnfocusedBackgroundOpacity" ResourceKey="ListAccentLowOpacity" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowSelectedHoveredUnfocusedBackgroundBrush" Color="{DynamicResource SystemAccentColor}" />
|
|
||||||
<StaticResource x:Key="DataGridRowSelectedHoveredUnfocusedBackgroundOpacity" ResourceKey="ListAccentMediumOpacity" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowHoveredBackgroundColor" Color="{DynamicResource SystemListLowColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowInvalidBrush" Color="{DynamicResource SystemErrorTextColor}" />
|
|
||||||
|
|
||||||
<SolidColorBrush x:Key="DataGridRowHeaderForegroundBrush" Color="{DynamicResource SystemBaseMediumColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridRowHeaderBackgroundBrush" Color="{DynamicResource SystemAltHighColor}" />
|
|
||||||
|
|
||||||
<StaticResource x:Key="DataGridCellBackgroundBrush" ResourceKey="SystemControlTransparentBrush" />
|
|
||||||
<SolidColorBrush x:Key="DataGridCellFocusVisualPrimaryBrush" Color="{DynamicResource SystemBaseHighColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridCellFocusVisualSecondaryBrush" Color="{DynamicResource SystemAltMediumColor}" />
|
|
||||||
<SolidColorBrush x:Key="DataGridCellInvalidBrush" Color="{DynamicResource SystemErrorTextColor}" />
|
|
||||||
|
|
||||||
<SolidColorBrush x:Key="DataGridGridLinesBrush"
|
|
||||||
Opacity="0.4"
|
|
||||||
Color="{DynamicResource SystemBaseMediumLowColor}" />
|
|
||||||
<StaticResource x:Key="DataGridCurrencyVisualPrimaryBrush" ResourceKey="SystemControlTransparentBrush" />
|
|
||||||
<SolidColorBrush x:Key="DataGridDetailsPresenterBackgroundBrush" Color="{DynamicResource SystemChromeMediumLowColor}" />
|
|
||||||
<StaticResource x:Key="DataGridFillerColumnGridLinesBrush" ResourceKey="SystemControlTransparentBrush" />
|
|
||||||
</Styles.Resources>
|
|
||||||
|
|
||||||
<Style Selector="DataGridCell">
|
|
||||||
<Setter Property="Background" Value="{DynamicResource DataGridCellBackgroundBrush}" />
|
|
||||||
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
|
|
||||||
<Setter Property="VerticalContentAlignment" Value="Stretch" />
|
|
||||||
<Setter Property="FontSize" Value="12" />
|
|
||||||
<Setter Property="MinHeight" Value="32" />
|
|
||||||
<Setter Property="Focusable" Value="False" />
|
|
||||||
<Setter Property="Template">
|
|
||||||
<ControlTemplate>
|
|
||||||
<Border x:Name="CellBorder"
|
|
||||||
Background="{TemplateBinding Background}"
|
|
||||||
BorderBrush="{TemplateBinding BorderBrush}"
|
|
||||||
BorderThickness="{TemplateBinding BorderThickness}"
|
|
||||||
CornerRadius="{TemplateBinding CornerRadius}">
|
|
||||||
<Grid x:Name="PART_CellRoot" ColumnDefinitions="*,Auto">
|
|
||||||
|
|
||||||
<Rectangle x:Name="CurrencyVisual"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="Transparent"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCurrencyVisualPrimaryBrush}"
|
|
||||||
StrokeThickness="1" />
|
|
||||||
<Grid x:Name="FocusVisual" IsHitTestVisible="False">
|
|
||||||
<Rectangle HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="Transparent"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCellFocusVisualPrimaryBrush}"
|
|
||||||
StrokeThickness="2" />
|
|
||||||
<Rectangle Margin="2"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="Transparent"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCellFocusVisualSecondaryBrush}"
|
|
||||||
StrokeThickness="1" />
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<ContentPresenter Margin="{TemplateBinding Padding}"
|
|
||||||
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
|
||||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
|
||||||
Content="{TemplateBinding Content}"
|
|
||||||
ContentTemplate="{TemplateBinding ContentTemplate}"/>
|
|
||||||
|
|
||||||
<Rectangle x:Name="InvalidVisualElement"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCellInvalidBrush}"
|
|
||||||
StrokeThickness="1" />
|
|
||||||
|
|
||||||
<Rectangle Name="PART_RightGridLine"
|
|
||||||
Grid.Column="1"
|
|
||||||
Width="1"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="{DynamicResource DataGridFillerColumnGridLinesBrush}" />
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridCell > TextBlock#CellTextBlock">
|
|
||||||
<Setter Property="Margin" Value="{DynamicResource DataGridTextColumnCellTextBlockMargin}" />
|
|
||||||
<Setter Property="VerticalAlignment" Value="Center" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridCell /template/ Rectangle#CurrencyVisual">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridCell /template/ Grid#FocusVisual">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridCell:current /template/ Rectangle#CurrencyVisual">
|
|
||||||
<Setter Property="IsVisible" Value="True" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGrid:focus DataGridCell:current /template/ Grid#FocusVisual">
|
|
||||||
<Setter Property="IsVisible" Value="True" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridCell /template/ Rectangle#InvalidVisualElement">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridCell:invalid /template/ Rectangle#InvalidVisualElement">
|
|
||||||
<Setter Property="IsVisible" Value="True" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridCell > TextBox DataValidationErrors">
|
|
||||||
<Setter Property="Template" Value="{DynamicResource TooltipDataValidationContentTemplate}" />
|
|
||||||
<Setter Property="ErrorTemplate" Value="{DynamicResource TooltipDataValidationErrorTemplate}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridColumnHeader">
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource DataGridColumnHeaderForegroundBrush}" />
|
|
||||||
<Setter Property="Background" Value="{DynamicResource DataGridColumnHeaderBackgroundBrush}" />
|
|
||||||
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
|
|
||||||
<Setter Property="VerticalContentAlignment" Value="Center" />
|
|
||||||
<Setter Property="Focusable" Value="False" />
|
|
||||||
<Setter Property="SeparatorBrush" Value="{DynamicResource DataGridGridLinesBrush}" />
|
|
||||||
<Setter Property="Padding" Value="6,0,0,0" />
|
|
||||||
<Setter Property="FontSize" Value="12" />
|
|
||||||
<Setter Property="MinHeight" Value="40" />
|
|
||||||
<Setter Property="Template">
|
|
||||||
<ControlTemplate>
|
|
||||||
<Border x:Name="HeaderBorder"
|
|
||||||
Background="{TemplateBinding Background}"
|
|
||||||
BorderBrush="{TemplateBinding BorderBrush}"
|
|
||||||
BorderThickness="{TemplateBinding BorderThickness}"
|
|
||||||
CornerRadius="{TemplateBinding CornerRadius}">
|
|
||||||
<Grid Name="PART_ColumnHeaderRoot" ColumnDefinitions="*,Auto">
|
|
||||||
|
|
||||||
<Grid Grid.Column="0" Margin="{TemplateBinding Padding}"
|
|
||||||
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
|
||||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" ColumnDefinitions="*,12">
|
|
||||||
|
|
||||||
<ContentPresenter Grid.Column="0"
|
|
||||||
HorizontalAlignment="Left"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Content="{TemplateBinding Content}"
|
|
||||||
ContentTemplate="{TemplateBinding ContentTemplate}" />
|
|
||||||
|
|
||||||
<Path Name="SortIcon"
|
|
||||||
Grid.Column="1"
|
|
||||||
Height="12"
|
|
||||||
Width="8"
|
|
||||||
HorizontalAlignment="Right"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Fill="{TemplateBinding Foreground}"
|
|
||||||
Stretch="Uniform"
|
|
||||||
Margin="0,0,4,0"
|
|
||||||
Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z "/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<Rectangle Name="VerticalSeparator"
|
|
||||||
Grid.Column="1"
|
|
||||||
Width="1"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="{TemplateBinding SeparatorBrush}"
|
|
||||||
IsVisible="{TemplateBinding AreSeparatorsVisible}" />
|
|
||||||
|
|
||||||
<Grid x:Name="FocusVisual" IsHitTestVisible="False">
|
|
||||||
<Rectangle x:Name="FocusVisualPrimary"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="Transparent"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCellFocusVisualPrimaryBrush}"
|
|
||||||
StrokeThickness="2" />
|
|
||||||
<Rectangle x:Name="FocusVisualSecondary"
|
|
||||||
Margin="2"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="Transparent"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCellFocusVisualSecondaryBrush}"
|
|
||||||
StrokeThickness="1" />
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridColumnHeader /template/ Grid#FocusVisual">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridColumnHeader:focus-visible /template/ Grid#FocusVisual">
|
|
||||||
<Setter Property="IsVisible" Value="True" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridColumnHeader:pointerover /template/ Grid#PART_ColumnHeaderRoot">
|
|
||||||
<Setter Property="Background" Value="{DynamicResource DataGridColumnHeaderHoveredBackgroundBrush}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridColumnHeader:pressed /template/ Grid#PART_ColumnHeaderRoot">
|
|
||||||
<Setter Property="Background" Value="{DynamicResource DataGridColumnHeaderPressedBackgroundBrush}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridColumnHeader:dragIndicator">
|
|
||||||
<Setter Property="Opacity" Value="0.5" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridColumnHeader /template/ Path#SortIcon">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
<Setter Property="RenderTransform">
|
|
||||||
<Setter.Value>
|
|
||||||
<ScaleTransform ScaleX="0.9" ScaleY="0.9" />
|
|
||||||
</Setter.Value>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridColumnHeader:sortascending /template/ Path#SortIcon">
|
|
||||||
<Setter Property="IsVisible" Value="True" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridColumnHeader:sortdescending /template/ Path#SortIcon">
|
|
||||||
<Setter Property="IsVisible" Value="True" />
|
|
||||||
<Setter Property="RenderTransform">
|
|
||||||
<Setter.Value>
|
|
||||||
<ScaleTransform ScaleX="0.9" ScaleY="-0.9" />
|
|
||||||
</Setter.Value>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRow">
|
|
||||||
<Setter Property="Focusable" Value="False" />
|
|
||||||
<Setter Property="Template">
|
|
||||||
<ControlTemplate>
|
|
||||||
<Border x:Name="RowBorder"
|
|
||||||
Background="{TemplateBinding Background}"
|
|
||||||
BorderBrush="{TemplateBinding BorderBrush}"
|
|
||||||
BorderThickness="{TemplateBinding BorderThickness}"
|
|
||||||
CornerRadius="{TemplateBinding CornerRadius}">
|
|
||||||
<DataGridFrozenGrid Name="PART_Root"
|
|
||||||
ColumnDefinitions="Auto,*"
|
|
||||||
RowDefinitions="*,Auto,Auto">
|
|
||||||
|
|
||||||
<Rectangle Name="BackgroundRectangle"
|
|
||||||
Grid.RowSpan="2"
|
|
||||||
Grid.ColumnSpan="2" />
|
|
||||||
<Rectangle x:Name="InvalidVisualElement"
|
|
||||||
Grid.ColumnSpan="2"
|
|
||||||
Fill="{DynamicResource DataGridRowInvalidBrush}" />
|
|
||||||
|
|
||||||
<DataGridRowHeader Name="PART_RowHeader"
|
|
||||||
Grid.RowSpan="3"
|
|
||||||
DataGridFrozenGrid.IsFrozen="True" />
|
|
||||||
<DataGridCellsPresenter Name="PART_CellsPresenter"
|
|
||||||
Grid.Column="1"
|
|
||||||
DataGridFrozenGrid.IsFrozen="True" />
|
|
||||||
<DataGridDetailsPresenter Name="PART_DetailsPresenter"
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.Column="1"
|
|
||||||
Background="{DynamicResource DataGridDetailsPresenterBackgroundBrush}" />
|
|
||||||
<Rectangle Name="PART_BottomGridLine"
|
|
||||||
Grid.Row="2"
|
|
||||||
Grid.Column="1"
|
|
||||||
Height="1"
|
|
||||||
HorizontalAlignment="Stretch" />
|
|
||||||
|
|
||||||
</DataGridFrozenGrid>
|
|
||||||
</Border>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRow">
|
|
||||||
<Setter Property="Background" Value="{Binding $parent[DataGrid].RowBackground}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:nth-child(even)">
|
|
||||||
<Setter Property="Background" Value="{Binding $parent[DataGrid].AlternatingRowBackground}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRow /template/ Rectangle#InvalidVisualElement">
|
|
||||||
<Setter Property="Opacity" Value="0" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:invalid /template/ Rectangle#InvalidVisualElement">
|
|
||||||
<Setter Property="Opacity" Value="0.4" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:invalid /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Opacity" Value="0" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRow /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowBackgroundBrush}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:pointerover /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowHoveredBackgroundColor}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:selected /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowSelectedUnfocusedBackgroundBrush}" />
|
|
||||||
<Setter Property="Opacity" Value="{DynamicResource DataGridRowSelectedUnfocusedBackgroundOpacity}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:selected:pointerover /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowSelectedHoveredUnfocusedBackgroundBrush}" />
|
|
||||||
<Setter Property="Opacity" Value="{DynamicResource DataGridRowSelectedHoveredUnfocusedBackgroundOpacity}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:selected:focus /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowSelectedBackgroundBrush}" />
|
|
||||||
<Setter Property="Opacity" Value="{DynamicResource DataGridRowSelectedBackgroundOpacity}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:selected:pointerover:focus /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowSelectedHoveredBackgroundBrush}" />
|
|
||||||
<Setter Property="Opacity" Value="{DynamicResource DataGridRowSelectedHoveredBackgroundOpacity}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowHeader">
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource DataGridRowHeaderForegroundBrush}" />
|
|
||||||
<Setter Property="Background" Value="{DynamicResource DataGridRowHeaderBackgroundBrush}" />
|
|
||||||
<Setter Property="Focusable" Value="False" />
|
|
||||||
<Setter Property="SeparatorBrush" Value="{DynamicResource DataGridGridLinesBrush}" />
|
|
||||||
<Setter Property="AreSeparatorsVisible" Value="False" />
|
|
||||||
<Setter Property="Template">
|
|
||||||
<ControlTemplate>
|
|
||||||
<Grid x:Name="PART_Root"
|
|
||||||
RowDefinitions="*,*,Auto"
|
|
||||||
ColumnDefinitions="Auto,*">
|
|
||||||
<Border Grid.RowSpan="3"
|
|
||||||
Grid.ColumnSpan="2"
|
|
||||||
BorderBrush="{TemplateBinding SeparatorBrush}"
|
|
||||||
BorderThickness="0,0,1,0">
|
|
||||||
<Grid Background="{TemplateBinding Background}">
|
|
||||||
<Rectangle x:Name="RowInvalidVisualElement"
|
|
||||||
Fill="{DynamicResource DataGridRowInvalidBrush}"
|
|
||||||
Stretch="Fill" />
|
|
||||||
<Rectangle x:Name="BackgroundRectangle"
|
|
||||||
Stretch="Fill" />
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
<Rectangle x:Name="HorizontalSeparator"
|
|
||||||
Grid.Row="2"
|
|
||||||
Grid.ColumnSpan="2"
|
|
||||||
Height="1"
|
|
||||||
Margin="1,0,1,0"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
Fill="{TemplateBinding SeparatorBrush}"
|
|
||||||
IsVisible="{TemplateBinding AreSeparatorsVisible}" />
|
|
||||||
|
|
||||||
<ContentPresenter Grid.RowSpan="2"
|
|
||||||
Grid.Column="1"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Content="{TemplateBinding Content}" />
|
|
||||||
</Grid>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowHeader /template/ Rectangle#RowInvalidVisualElement">
|
|
||||||
<Setter Property="Opacity" Value="0" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRowHeader:invalid /template/ Rectangle#RowInvalidVisualElement">
|
|
||||||
<Setter Property="Opacity" Value="0.4" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRowHeader:invalid /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Opacity" Value="0" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowHeader /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowBackgroundBrush}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:pointerover DataGridRowHeader /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowHoveredBackgroundColor}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRowHeader:selected /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowSelectedUnfocusedBackgroundBrush}" />
|
|
||||||
<Setter Property="Opacity" Value="{DynamicResource DataGridRowSelectedUnfocusedBackgroundOpacity}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:pointerover DataGridRowHeader:selected /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowSelectedHoveredUnfocusedBackgroundBrush}" />
|
|
||||||
<Setter Property="Opacity" Value="{DynamicResource DataGridRowSelectedHoveredUnfocusedBackgroundOpacity}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRowHeader:selected:focus /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowSelectedBackgroundBrush}" />
|
|
||||||
<Setter Property="Opacity" Value="{DynamicResource DataGridRowSelectedBackgroundOpacity}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRow:pointerover DataGridRowHeader:selected:focus /template/ Rectangle#BackgroundRectangle">
|
|
||||||
<Setter Property="Fill" Value="{DynamicResource DataGridRowSelectedHoveredBackgroundBrush}" />
|
|
||||||
<Setter Property="Opacity" Value="{DynamicResource DataGridRowSelectedHoveredBackgroundOpacity}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowGroupHeader">
|
|
||||||
<Setter Property="Focusable" Value="False" />
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource DataGridRowGroupHeaderForegroundBrush}" />
|
|
||||||
<Setter Property="Background" Value="{DynamicResource DataGridRowGroupHeaderBackgroundBrush}" />
|
|
||||||
<Setter Property="FontSize" Value="15" />
|
|
||||||
<Setter Property="MinHeight" Value="32" />
|
|
||||||
<Setter Property="Template">
|
|
||||||
<ControlTemplate>
|
|
||||||
<DataGridFrozenGrid Name="PART_Root"
|
|
||||||
MinHeight="{TemplateBinding MinHeight}"
|
|
||||||
ColumnDefinitions="Auto,Auto,Auto,Auto,*"
|
|
||||||
RowDefinitions="*,Auto">
|
|
||||||
|
|
||||||
<Rectangle Name="IndentSpacer"
|
|
||||||
Grid.Column="1" />
|
|
||||||
<ToggleButton Name="ExpanderButton"
|
|
||||||
Grid.Column="2"
|
|
||||||
Width="12"
|
|
||||||
Height="12"
|
|
||||||
Margin="12,0,0,0"
|
|
||||||
BorderBrush="{TemplateBinding BorderBrush}"
|
|
||||||
BorderThickness="{TemplateBinding BorderThickness}"
|
|
||||||
Background="{TemplateBinding Background}"
|
|
||||||
CornerRadius="{TemplateBinding CornerRadius}"
|
|
||||||
Focusable="False"
|
|
||||||
Foreground="{TemplateBinding Foreground}" />
|
|
||||||
|
|
||||||
<StackPanel Grid.Column="3"
|
|
||||||
Orientation="Horizontal"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="12,0,0,0">
|
|
||||||
<TextBlock Name="PropertyNameElement"
|
|
||||||
Margin="4,0,0,0"
|
|
||||||
IsVisible="{TemplateBinding IsPropertyNameVisible}"
|
|
||||||
Foreground="{TemplateBinding Foreground}" />
|
|
||||||
<TextBlock Margin="4,0,0,0"
|
|
||||||
Text="{Binding Key}"
|
|
||||||
Foreground="{TemplateBinding Foreground}" />
|
|
||||||
<TextBlock Name="ItemCountElement"
|
|
||||||
Margin="4,0,0,0"
|
|
||||||
IsVisible="{TemplateBinding IsItemCountVisible}"
|
|
||||||
Foreground="{TemplateBinding Foreground}" />
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<Rectangle x:Name="CurrencyVisual"
|
|
||||||
Grid.ColumnSpan="5"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="Transparent"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCurrencyVisualPrimaryBrush}"
|
|
||||||
StrokeThickness="1" />
|
|
||||||
<Grid x:Name="FocusVisual"
|
|
||||||
Grid.ColumnSpan="5"
|
|
||||||
IsHitTestVisible="False">
|
|
||||||
<Rectangle HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="Transparent"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCellFocusVisualPrimaryBrush}"
|
|
||||||
StrokeThickness="2" />
|
|
||||||
<Rectangle Margin="2"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
Fill="Transparent"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
Stroke="{DynamicResource DataGridCellFocusVisualSecondaryBrush}"
|
|
||||||
StrokeThickness="1" />
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<DataGridRowHeader Name="PART_RowHeader"
|
|
||||||
Grid.RowSpan="2"
|
|
||||||
DataGridFrozenGrid.IsFrozen="True" />
|
|
||||||
|
|
||||||
<Rectangle x:Name="PART_BottomGridLine"
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.ColumnSpan="5"
|
|
||||||
Height="1" />
|
|
||||||
</DataGridFrozenGrid>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowGroupHeader /template/ ToggleButton#ExpanderButton">
|
|
||||||
<Setter Property="Template">
|
|
||||||
<ControlTemplate>
|
|
||||||
<Border Grid.Column="0"
|
|
||||||
Width="12"
|
|
||||||
Height="12"
|
|
||||||
Background="Transparent"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
VerticalAlignment="Center">
|
|
||||||
<Path Fill="{TemplateBinding Foreground}"
|
|
||||||
HorizontalAlignment="Right"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Stretch="Uniform" />
|
|
||||||
</Border>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowGroupHeader /template/ ToggleButton#ExpanderButton /template/ Path">
|
|
||||||
<Setter Property="Data" Value="{StaticResource DataGridRowGroupHeaderIconOpenedPath}" />
|
|
||||||
<Setter Property="Stretch" Value="Uniform" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowGroupHeader /template/ ToggleButton#ExpanderButton:checked /template/ Path">
|
|
||||||
<Setter Property="Data" Value="{StaticResource DataGridRowGroupHeaderIconClosedPath}" />
|
|
||||||
<Setter Property="Stretch" Value="UniformToFill" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowGroupHeader /template/ DataGridFrozenGrid#PART_Root">
|
|
||||||
<Setter Property="Background" Value="{Binding $parent[DataGridRowGroupHeader].Background}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRowGroupHeader:pointerover /template/ DataGridFrozenGrid#PART_Root">
|
|
||||||
<Setter Property="Background" Value="{DynamicResource DataGridRowGroupHeaderHoveredBackgroundBrush}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRowGroupHeader:pressed /template/ DataGridFrozenGrid#PART_Root">
|
|
||||||
<Setter Property="Background" Value="{DynamicResource DataGridRowGroupHeaderPressedBackgroundBrush}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGridRowGroupHeader /template/ Rectangle#CurrencyVisual">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRowGroupHeader /template/ Grid#FocusVisual">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGridRowGroupHeader:current /template/ Rectangle#CurrencyVisual">
|
|
||||||
<Setter Property="IsVisible" Value="True" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGrid:focus DataGridRowGroupHeader:current /template/ Grid#FocusVisual">
|
|
||||||
<Setter Property="IsVisible" Value="True" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGrid">
|
|
||||||
<Setter Property="RowBackground" Value="Transparent" />
|
|
||||||
<Setter Property="AlternatingRowBackground" Value="Transparent" />
|
|
||||||
<Setter Property="HeadersVisibility" Value="Column" />
|
|
||||||
<Setter Property="HorizontalScrollBarVisibility" Value="Auto" />
|
|
||||||
<Setter Property="VerticalScrollBarVisibility" Value="Auto" />
|
|
||||||
<Setter Property="SelectionMode" Value="Extended" />
|
|
||||||
<Setter Property="GridLinesVisibility" Value="None" />
|
|
||||||
<Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource DataGridGridLinesBrush}" />
|
|
||||||
<Setter Property="VerticalGridLinesBrush" Value="{DynamicResource DataGridGridLinesBrush}" />
|
|
||||||
<Setter Property="DropLocationIndicatorTemplate">
|
|
||||||
<Template>
|
|
||||||
<Rectangle Fill="{DynamicResource DataGridDropLocationIndicatorBackground}"
|
|
||||||
Width="2" />
|
|
||||||
</Template>
|
|
||||||
</Setter>
|
|
||||||
<Setter Property="Template">
|
|
||||||
<ControlTemplate>
|
|
||||||
<Border x:Name="DataGridBorder"
|
|
||||||
Background="{TemplateBinding Background}"
|
|
||||||
BorderBrush="{TemplateBinding BorderBrush}"
|
|
||||||
BorderThickness="{TemplateBinding BorderThickness}"
|
|
||||||
CornerRadius="{TemplateBinding CornerRadius}">
|
|
||||||
<Grid ColumnDefinitions="Auto,*,Auto" RowDefinitions="Auto,*,Auto,Auto">
|
|
||||||
<Grid.Resources>
|
|
||||||
<ControlTemplate x:Key="TopLeftHeaderTemplate"
|
|
||||||
TargetType="DataGridColumnHeader">
|
|
||||||
<Grid x:Name="TopLeftHeaderRoot"
|
|
||||||
RowDefinitions="*,*,Auto">
|
|
||||||
<Border Grid.RowSpan="2"
|
|
||||||
BorderThickness="0,0,1,0"
|
|
||||||
BorderBrush="{DynamicResource DataGridGridLinesBrush}" />
|
|
||||||
<Rectangle Grid.RowSpan="2"
|
|
||||||
VerticalAlignment="Bottom"
|
|
||||||
StrokeThickness="1"
|
|
||||||
Height="1"
|
|
||||||
Fill="{DynamicResource DataGridGridLinesBrush}" />
|
|
||||||
</Grid>
|
|
||||||
</ControlTemplate>
|
|
||||||
<ControlTemplate x:Key="TopRightHeaderTemplate"
|
|
||||||
TargetType="DataGridColumnHeader">
|
|
||||||
<Grid x:Name="RootElement" />
|
|
||||||
</ControlTemplate>
|
|
||||||
</Grid.Resources>
|
|
||||||
|
|
||||||
<DataGridColumnHeader Name="PART_TopLeftCornerHeader"
|
|
||||||
Template="{StaticResource TopLeftHeaderTemplate}" />
|
|
||||||
<DataGridColumnHeadersPresenter Name="PART_ColumnHeadersPresenter"
|
|
||||||
Grid.Column="1"
|
|
||||||
Grid.ColumnSpan="2" />
|
|
||||||
<!--<DataGridColumnHeader Name="PART_TopRightCornerHeader"
|
|
||||||
Grid.Column="2"
|
|
||||||
Template="{StaticResource TopRightHeaderTemplate}" />-->
|
|
||||||
<Rectangle Name="PART_ColumnHeadersAndRowsSeparator"
|
|
||||||
Grid.ColumnSpan="3"
|
|
||||||
VerticalAlignment="Bottom"
|
|
||||||
Height="1"
|
|
||||||
Fill="{DynamicResource DataGridGridLinesBrush}" />
|
|
||||||
|
|
||||||
<DataGridRowsPresenter Name="PART_RowsPresenter"
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.RowSpan="2"
|
|
||||||
Grid.ColumnSpan="3">
|
|
||||||
<DataGridRowsPresenter.GestureRecognizers>
|
|
||||||
<ScrollGestureRecognizer CanHorizontallyScroll="True" CanVerticallyScroll="True" />
|
|
||||||
</DataGridRowsPresenter.GestureRecognizers>
|
|
||||||
</DataGridRowsPresenter>
|
|
||||||
<Rectangle Name="PART_BottomRightCorner"
|
|
||||||
Fill="{DynamicResource DataGridScrollBarsSeparatorBackground}"
|
|
||||||
Grid.Column="2"
|
|
||||||
Grid.Row="2" />
|
|
||||||
<!--<Rectangle Name="BottomLeftCorner"
|
|
||||||
Fill="{DynamicResource DataGridScrollBarsSeparatorBackground}"
|
|
||||||
Grid.Row="2"
|
|
||||||
Grid.ColumnSpan="2" />-->
|
|
||||||
<ScrollBar Name="PART_VerticalScrollbar"
|
|
||||||
Orientation="Vertical"
|
|
||||||
Grid.Column="2"
|
|
||||||
Grid.Row="1"
|
|
||||||
Width="{DynamicResource ScrollBarSize}" />
|
|
||||||
|
|
||||||
<Grid Grid.Column="1"
|
|
||||||
Grid.Row="2"
|
|
||||||
ColumnDefinitions="Auto,*">
|
|
||||||
<Rectangle Name="PART_FrozenColumnScrollBarSpacer" />
|
|
||||||
<ScrollBar Name="PART_HorizontalScrollbar"
|
|
||||||
Grid.Column="1"
|
|
||||||
Orientation="Horizontal"
|
|
||||||
Height="{DynamicResource ScrollBarSize}" />
|
|
||||||
</Grid>
|
|
||||||
<Border x:Name="PART_DisabledVisualElement"
|
|
||||||
Grid.ColumnSpan="3"
|
|
||||||
Grid.RowSpan="4"
|
|
||||||
IsHitTestVisible="False"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"
|
|
||||||
CornerRadius="2"
|
|
||||||
Background="{DynamicResource DataGridDisabledVisualElementBackground}"
|
|
||||||
IsVisible="{Binding !$parent[DataGrid].IsEnabled}" />
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="DataGrid:empty-columns /template/ DataGridColumnHeader#PART_TopLeftCornerHeader">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGrid:empty-columns /template/ DataGridColumnHeadersPresenter#PART_ColumnHeadersPresenter">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="DataGrid:empty-columns /template/ Rectangle#PART_ColumnHeadersAndRowsSeparator">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
</Styles>
|
|
||||||
@ -1,6 +1,7 @@
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Media;
|
using Avalonia.Media;
|
||||||
using Avalonia.Media.Imaging;
|
using Avalonia.Media.Imaging;
|
||||||
|
using Avalonia.VisualTree;
|
||||||
using LibationAvalonia.Dialogs;
|
using LibationAvalonia.Dialogs;
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@ -13,7 +14,8 @@ namespace LibationAvalonia
|
|||||||
=> GetBrushFromResources(name, Brushes.Transparent);
|
=> GetBrushFromResources(name, Brushes.Transparent);
|
||||||
public static IBrush GetBrushFromResources(string name, IBrush defaultBrush)
|
public static IBrush GetBrushFromResources(string name, IBrush defaultBrush)
|
||||||
{
|
{
|
||||||
if (App.Current.Styles.TryGetResource(name, out var value) && value is IBrush brush)
|
//TODO: use ThemeVariant
|
||||||
|
if (App.Current.Styles.TryGetResource(name, null, out var value) && value is IBrush brush)
|
||||||
return brush;
|
return brush;
|
||||||
return defaultBrush;
|
return defaultBrush;
|
||||||
}
|
}
|
||||||
@ -21,7 +23,7 @@ namespace LibationAvalonia
|
|||||||
public static Task<DialogResult> ShowDialogAsync(this DialogWindow dialogWindow, Window owner = null)
|
public static Task<DialogResult> ShowDialogAsync(this DialogWindow dialogWindow, Window owner = null)
|
||||||
=> dialogWindow.ShowDialog<DialogResult>(owner ?? App.MainWindow);
|
=> dialogWindow.ShowDialog<DialogResult>(owner ?? App.MainWindow);
|
||||||
|
|
||||||
public static Window GetParentWindow(this IControl control) => control.VisualRoot as Window;
|
public static Window GetParentWindow(this Control control) => control.GetVisualRoot() as Window;
|
||||||
|
|
||||||
|
|
||||||
private static Bitmap defaultImage;
|
private static Bitmap defaultImage;
|
||||||
|
|||||||
@ -5,7 +5,7 @@ namespace LibationAvalonia.Controls
|
|||||||
{
|
{
|
||||||
public class DataGridCheckBoxColumnExt : DataGridCheckBoxColumn
|
public class DataGridCheckBoxColumnExt : DataGridCheckBoxColumn
|
||||||
{
|
{
|
||||||
protected override IControl GenerateEditingElementDirect(DataGridCell cell, object dataItem)
|
protected override Control GenerateEditingElementDirect(DataGridCell cell, object dataItem)
|
||||||
{
|
{
|
||||||
//Only SeriesEntry types have three-state checks, individual LibraryEntry books are binary.
|
//Only SeriesEntry types have three-state checks, individual LibraryEntry books are binary.
|
||||||
var ele = base.GenerateEditingElementDirect(cell, dataItem) as CheckBox;
|
var ele = base.GenerateEditingElementDirect(cell, dataItem) as CheckBox;
|
||||||
|
|||||||
@ -18,7 +18,7 @@ namespace LibationAvalonia.Controls
|
|||||||
BindingTarget = MyRatingCellEditor.RatingProperty;
|
BindingTarget = MyRatingCellEditor.RatingProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IControl GenerateElement(DataGridCell cell, object dataItem)
|
protected override Control GenerateElement(DataGridCell cell, object dataItem)
|
||||||
{
|
{
|
||||||
var myRatingElement = new MyRatingCellEditor
|
var myRatingElement = new MyRatingCellEditor
|
||||||
{
|
{
|
||||||
@ -41,7 +41,7 @@ namespace LibationAvalonia.Controls
|
|||||||
return myRatingElement;
|
return myRatingElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IControl GenerateEditingElementDirect(DataGridCell cell, object dataItem)
|
protected override Control GenerateEditingElementDirect(DataGridCell cell, object dataItem)
|
||||||
{
|
{
|
||||||
var myRatingElement = new MyRatingCellEditor
|
var myRatingElement = new MyRatingCellEditor
|
||||||
{
|
{
|
||||||
@ -57,12 +57,12 @@ namespace LibationAvalonia.Controls
|
|||||||
return myRatingElement;
|
return myRatingElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override object PrepareCellForEdit(IControl editingElement, RoutedEventArgs editingEventArgs)
|
protected override object PrepareCellForEdit(Control editingElement, RoutedEventArgs editingEventArgs)
|
||||||
=> editingElement is MyRatingCellEditor myRating
|
=> editingElement is MyRatingCellEditor myRating
|
||||||
? myRating.Rating
|
? myRating.Rating
|
||||||
: DefaultRating;
|
: DefaultRating;
|
||||||
|
|
||||||
protected override void CancelCellEdit(IControl editingElement, object uneditedValue)
|
protected override void CancelCellEdit(Control editingElement, object uneditedValue)
|
||||||
{
|
{
|
||||||
if (editingElement is MyRatingCellEditor myRating)
|
if (editingElement is MyRatingCellEditor myRating)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -6,7 +6,7 @@ namespace LibationAvalonia.Controls
|
|||||||
{
|
{
|
||||||
public partial class DataGridTemplateColumnExt : DataGridTemplateColumn
|
public partial class DataGridTemplateColumnExt : DataGridTemplateColumn
|
||||||
{
|
{
|
||||||
protected override IControl GenerateElement(DataGridCell cell, object dataItem)
|
protected override Control GenerateElement(DataGridCell cell, object dataItem)
|
||||||
{
|
{
|
||||||
cell?.AttachContextMenu();
|
cell?.AttachContextMenu();
|
||||||
return base.GenerateElement(cell, dataItem);
|
return base.GenerateElement(cell, dataItem);
|
||||||
|
|||||||
@ -97,12 +97,7 @@ namespace LibationAvalonia.Controls
|
|||||||
|
|
||||||
var selectedFolders = await (VisualRoot as Window).StorageProvider.OpenFolderPickerAsync(options);
|
var selectedFolders = await (VisualRoot as Window).StorageProvider.OpenFolderPickerAsync(options);
|
||||||
|
|
||||||
customStates.CustomDir =
|
customStates.CustomDir = selectedFolders.SingleOrDefault()?.Path?.LocalPath ?? customStates.CustomDir;
|
||||||
selectedFolders
|
|
||||||
.SingleOrDefault()?.
|
|
||||||
TryGetUri(out var uri) is true
|
|
||||||
? uri.LocalPath
|
|
||||||
: customStates.CustomDir;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckStates_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
private void CheckStates_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||||
@ -180,10 +175,5 @@ namespace LibationAvalonia.Controls
|
|||||||
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -90,10 +90,5 @@ namespace LibationAvalonia.Controls
|
|||||||
get => GetValue(SubDirectoryProperty);
|
get => GetValue(SubDirectoryProperty);
|
||||||
set => SetValue(SubDirectoryProperty, value);
|
set => SetValue(SubDirectoryProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,10 +29,5 @@ namespace LibationAvalonia.Controls
|
|||||||
get { return GetValue(LabelProperty); }
|
get { return GetValue(LabelProperty); }
|
||||||
set { SetValue(LabelProperty, value); }
|
set { SetValue(LabelProperty, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,10 +33,5 @@ namespace LibationAvalonia.Controls
|
|||||||
this.Cursor = Cursor.Default;
|
this.Cursor = Cursor.Default;
|
||||||
base.OnPointerExited(e);
|
base.OnPointerExited(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,10 +26,5 @@ namespace LibationAvalonia.Controls
|
|||||||
|
|
||||||
base.OnPointerWheelChanged(e);
|
base.OnPointerWheelChanged(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -129,16 +129,16 @@ namespace LibationAvalonia.Dialogs
|
|||||||
|
|
||||||
string audibleAppDataDir = GetAudibleCliAppDataPath();
|
string audibleAppDataDir = GetAudibleCliAppDataPath();
|
||||||
if (Directory.Exists(audibleAppDataDir))
|
if (Directory.Exists(audibleAppDataDir))
|
||||||
openFileDialogOptions.SuggestedStartLocation = new BclStorageFolder(audibleAppDataDir);
|
openFileDialogOptions.SuggestedStartLocation = await StorageProvider.TryGetFolderFromPathAsync(audibleAppDataDir);
|
||||||
|
|
||||||
var selectedFiles = await StorageProvider.OpenFilePickerAsync(openFileDialogOptions);
|
var selectedFiles = await StorageProvider.OpenFilePickerAsync(openFileDialogOptions);
|
||||||
var selectedFile = selectedFiles.SingleOrDefault();
|
var selectedFile = selectedFiles.SingleOrDefault()?.TryGetLocalPath();
|
||||||
|
|
||||||
if (selectedFile?.TryGetUri(out var uri) is not true) return;
|
if (selectedFile is null) return;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var jsonText = File.ReadAllText(uri.LocalPath);
|
var jsonText = File.ReadAllText(selectedFile);
|
||||||
var mkbAuth = Mkb79Auth.FromJson(jsonText);
|
var mkbAuth = Mkb79Auth.FromJson(jsonText);
|
||||||
var account = await mkbAuth.ToAccountAsync();
|
var account = await mkbAuth.ToAccountAsync();
|
||||||
|
|
||||||
@ -159,7 +159,7 @@ namespace LibationAvalonia.Dialogs
|
|||||||
{
|
{
|
||||||
await MessageBox.ShowAdminAlert(
|
await MessageBox.ShowAdminAlert(
|
||||||
this,
|
this,
|
||||||
$"An error occurred while importing an account from:\r\n{uri.LocalPath}\r\n\r\nIs the file encrypted?",
|
$"An error occurred while importing an account from:\r\n{selectedFile}\r\n\r\nIs the file encrypted?",
|
||||||
"Error Importing Account",
|
"Error Importing Account",
|
||||||
ex);
|
ex);
|
||||||
}
|
}
|
||||||
@ -196,12 +196,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
public async void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
public async void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
=> await SaveAndCloseAsync();
|
=> await SaveAndCloseAsync();
|
||||||
|
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void persist(AccountsSettings accountsSettings)
|
private void persist(AccountsSettings accountsSettings)
|
||||||
{
|
{
|
||||||
var existingAccounts = accountsSettings.Accounts;
|
var existingAccounts = accountsSettings.Accounts;
|
||||||
@ -293,20 +287,20 @@ namespace LibationAvalonia.Dialogs
|
|||||||
string audibleAppDataDir = GetAudibleCliAppDataPath();
|
string audibleAppDataDir = GetAudibleCliAppDataPath();
|
||||||
|
|
||||||
if (Directory.Exists(audibleAppDataDir))
|
if (Directory.Exists(audibleAppDataDir))
|
||||||
options.SuggestedStartLocation = new BclStorageFolder(audibleAppDataDir);
|
options.SuggestedStartLocation = await StorageProvider.TryGetFolderFromPathAsync(audibleAppDataDir);
|
||||||
|
|
||||||
var selectedFile = await StorageProvider.SaveFilePickerAsync(options);
|
var selectedFile = (await StorageProvider.SaveFilePickerAsync(options))?.TryGetLocalPath();
|
||||||
|
|
||||||
if (selectedFile?.TryGetUri(out var uri) is not true) return;
|
if (selectedFile is null) return;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var mkbAuth = Mkb79Auth.FromAccount(account);
|
var mkbAuth = Mkb79Auth.FromAccount(account);
|
||||||
var jsonText = mkbAuth.ToJson();
|
var jsonText = mkbAuth.ToJson();
|
||||||
|
|
||||||
File.WriteAllText(uri.LocalPath, jsonText);
|
File.WriteAllText(selectedFile, jsonText);
|
||||||
|
|
||||||
await MessageBox.Show(this, $"Successfully exported {account.AccountName} to\r\n\r\n{uri.LocalPath}", "Success!");
|
await MessageBox.Show(this, $"Successfully exported {account.AccountName} to\r\n\r\n{selectedFile}", "Success!");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -63,11 +63,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
=> SaveAndClose();
|
=> SaveAndClose();
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class BookDetailsDialogViewModel : ViewModelBase
|
private class BookDetailsDialogViewModel : ViewModelBase
|
||||||
{
|
{
|
||||||
public class liberatedComboBoxItem
|
public class liberatedComboBoxItem
|
||||||
|
|||||||
@ -172,23 +172,23 @@ namespace LibationAvalonia.Dialogs
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var selectedFile = await StorageProvider.SaveFilePickerAsync(saveFileDialog);
|
var selectedFile = (await StorageProvider.SaveFilePickerAsync(saveFileDialog))?.TryGetLocalPath();
|
||||||
|
|
||||||
if (selectedFile?.TryGetUri(out var uri) is not true) return;
|
if (selectedFile is null) return;
|
||||||
|
|
||||||
var ext = System.IO.Path.GetExtension(uri.LocalPath).ToLowerInvariant();
|
var ext = System.IO.Path.GetExtension(selectedFile).ToLowerInvariant();
|
||||||
|
|
||||||
switch (ext)
|
switch (ext)
|
||||||
{
|
{
|
||||||
case ".xlsx":
|
case ".xlsx":
|
||||||
default:
|
default:
|
||||||
await Task.Run(() => RecordExporter.ToXlsx(uri.LocalPath, records));
|
await Task.Run(() => RecordExporter.ToXlsx(selectedFile, records));
|
||||||
break;
|
break;
|
||||||
case ".csv":
|
case ".csv":
|
||||||
await Task.Run(() => RecordExporter.ToCsv(uri.LocalPath, records));
|
await Task.Run(() => RecordExporter.ToCsv(selectedFile, records));
|
||||||
break;
|
break;
|
||||||
case ".json":
|
case ".json":
|
||||||
await Task.Run(() => RecordExporter.ToJson(uri.LocalPath, libraryBook, records));
|
await Task.Run(() => RecordExporter.ToJson(selectedFile, libraryBook, records));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,11 +52,5 @@ namespace LibationAvalonia.Dialogs
|
|||||||
{
|
{
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -170,10 +170,5 @@ namespace LibationAvalonia.Dialogs
|
|||||||
public char Character => string.IsNullOrEmpty(_characterToReplace) ? default : _characterToReplace[0];
|
public char Character => string.IsNullOrEmpty(_characterToReplace) ? default : _characterToReplace[0];
|
||||||
public bool IsDefault { get; private set; }
|
public bool IsDefault { get; private set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,6 @@
|
|||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Name="userEditTbox"
|
Name="userEditTbox"
|
||||||
FontFamily="{Binding FontFamily}"
|
|
||||||
Text="{Binding UserTemplateText, Mode=TwoWay}" />
|
Text="{Binding UserTemplateText, Mode=TwoWay}" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@ -75,7 +75,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
private class EditTemplateViewModel : ViewModels.ViewModelBase
|
private class EditTemplateViewModel : ViewModels.ViewModelBase
|
||||||
{
|
{
|
||||||
private readonly Configuration config;
|
private readonly Configuration config;
|
||||||
public FontFamily FontFamily { get; } = FontManager.Current.DefaultFontFamilyName;
|
|
||||||
public InlineCollection Inlines { get; } = new();
|
public InlineCollection Inlines { get; } = new();
|
||||||
public ITemplateEditor TemplateEditor { get; }
|
public ITemplateEditor TemplateEditor { get; }
|
||||||
public EditTemplateViewModel(Configuration configuration, ITemplateEditor templates)
|
public EditTemplateViewModel(Configuration configuration, ITemplateEditor templates)
|
||||||
@ -91,7 +90,7 @@ namespace LibationAvalonia.Dialogs
|
|||||||
.Cast<TemplateTags>()
|
.Cast<TemplateTags>()
|
||||||
.Select(
|
.Select(
|
||||||
t => new Tuple<string, string, string>(
|
t => new Tuple<string, string, string>(
|
||||||
$"<{t.TagName.Replace("->", "-\x200C>").Replace("<-", "<\x200C-")}>",
|
$"<{t.TagName}>",
|
||||||
t.Description,
|
t.Description,
|
||||||
t.DefaultValue)
|
t.DefaultValue)
|
||||||
)
|
)
|
||||||
|
|||||||
@ -20,12 +20,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
DataContext = _bitmapHolder;
|
DataContext = _bitmapHolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetCoverBytes(byte[] cover)
|
public void SetCoverBytes(byte[] cover)
|
||||||
{
|
{
|
||||||
_bitmapHolder.CoverImage = AvaloniaUtils.TryLoadImageOrDefault(cover);
|
_bitmapHolder.CoverImage = AvaloniaUtils.TryLoadImageOrDefault(cover);
|
||||||
@ -36,7 +30,7 @@ namespace LibationAvalonia.Dialogs
|
|||||||
var options = new FilePickerSaveOptions
|
var options = new FilePickerSaveOptions
|
||||||
{
|
{
|
||||||
Title = $"Save Sover Image",
|
Title = $"Save Sover Image",
|
||||||
SuggestedStartLocation = new Avalonia.Platform.Storage.FileIO.BclStorageFolder(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)),
|
SuggestedStartLocation = await StorageProvider.TryGetFolderFromPathAsync(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)),
|
||||||
SuggestedFileName = PictureFileName,
|
SuggestedFileName = PictureFileName,
|
||||||
DefaultExtension = "jpg",
|
DefaultExtension = "jpg",
|
||||||
ShowOverwritePrompt = true,
|
ShowOverwritePrompt = true,
|
||||||
@ -50,17 +44,17 @@ namespace LibationAvalonia.Dialogs
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var selectedFile = await StorageProvider.SaveFilePickerAsync(options);
|
var selectedFile = (await StorageProvider.SaveFilePickerAsync(options))?.TryGetLocalPath();
|
||||||
|
|
||||||
if (selectedFile?.TryGetUri(out var uri) is not true) return;
|
if (selectedFile is null) return;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_bitmapHolder.CoverImage.Save(uri.LocalPath);
|
_bitmapHolder.CoverImage.Save(selectedFile);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Serilog.Log.Logger.Error(ex, $"Failed to save picture to {uri.LocalPath}");
|
Serilog.Log.Logger.Error(ex, $"Failed to save picture to {selectedFile}");
|
||||||
await MessageBox.Show(this, $"An error was encountered while trying to save the picture\r\n\r\n{ex.Message}", "Failed to save picture", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
|
await MessageBox.Show(this, $"An error was encountered while trying to save the picture\r\n\r\n{ex.Message}", "Failed to save picture", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,10 +48,5 @@ namespace LibationAvalonia.Dialogs
|
|||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
Close(DialogResult);
|
Close(DialogResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,10 +12,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
DataContext = this;
|
DataContext = this;
|
||||||
}
|
}
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
=> SaveAndClose();
|
=> SaveAndClose();
|
||||||
|
|||||||
@ -46,10 +46,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
SelectedItem = BookStatuses[0] as liberatedComboBoxItem;
|
SelectedItem = BookStatuses[0] as liberatedComboBoxItem;
|
||||||
DataContext = this;
|
DataContext = this;
|
||||||
}
|
}
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
=> SaveAndClose();
|
=> SaveAndClose();
|
||||||
|
|||||||
@ -70,12 +70,12 @@ namespace LibationAvalonia.Dialogs
|
|||||||
{
|
{
|
||||||
Title = "Select the folder to search for audiobooks",
|
Title = "Select the folder to search for audiobooks",
|
||||||
AllowMultiple = false,
|
AllowMultiple = false,
|
||||||
SuggestedStartLocation = new BclStorageFolder(Configuration.Instance.Books.PathWithoutPrefix)
|
SuggestedStartLocation = await StorageProvider.TryGetFolderFromPathAsync(Configuration.Instance.Books.PathWithoutPrefix)
|
||||||
};
|
};
|
||||||
|
|
||||||
var selectedFolder = await StorageProvider.OpenFolderPickerAsync(folderPicker);
|
var selectedFolder = (await StorageProvider.OpenFolderPickerAsync(folderPicker))?.SingleOrDefault()?.TryGetLocalPath();
|
||||||
|
|
||||||
if (selectedFolder.FirstOrDefault().TryGetUri(out var uri) is not true || !Directory.Exists(uri.LocalPath))
|
if (selectedFolder is null || !Directory.Exists(selectedFolder))
|
||||||
{
|
{
|
||||||
await CancelAndCloseAsync();
|
await CancelAndCloseAsync();
|
||||||
return;
|
return;
|
||||||
@ -83,7 +83,7 @@ namespace LibationAvalonia.Dialogs
|
|||||||
|
|
||||||
using var context = DbContexts.GetContext();
|
using var context = DbContexts.GetContext();
|
||||||
|
|
||||||
await foreach (var book in AudioFileStorage.FindAudiobooksAsync(uri.LocalPath, tokenSource.Token))
|
await foreach (var book in AudioFileStorage.FindAudiobooksAsync(selectedFolder, tokenSource.Token))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@ -12,11 +12,6 @@ namespace LibationAvalonia.Dialogs.Login
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override Task SaveAndCloseAsync()
|
protected override Task SaveAndCloseAsync()
|
||||||
{
|
{
|
||||||
Serilog.Log.Logger.Information("Approve button clicked");
|
Serilog.Log.Logger.Information("Approve button clicked");
|
||||||
|
|||||||
@ -49,11 +49,6 @@ namespace LibationAvalonia.Dialogs.Login
|
|||||||
Opened += (_, _) => (string.IsNullOrEmpty(password) ? passwordBox : captchaBox).Focus();
|
Opened += (_, _) => (string.IsNullOrEmpty(password) ? passwordBox : captchaBox).Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task SaveAndCloseAsync()
|
protected override async Task SaveAndCloseAsync()
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(_viewModel.Password))
|
if (string.IsNullOrWhiteSpace(_viewModel.Password))
|
||||||
|
|||||||
@ -31,12 +31,6 @@ namespace LibationAvalonia.Dialogs.Login
|
|||||||
DataContext = this;
|
DataContext = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected override Task SaveAndCloseAsync()
|
protected override Task SaveAndCloseAsync()
|
||||||
{
|
{
|
||||||
Serilog.Log.Logger.Information("Submit button clicked: {@DebugInfo}", new { email = Account?.AccountId?.ToMask(), passwordLength = Password?.Length });
|
Serilog.Log.Logger.Information("Submit button clicked: {@DebugInfo}", new { email = Account?.AccountId?.ToMask(), passwordLength = Password?.Length });
|
||||||
|
|||||||
@ -36,10 +36,5 @@ namespace LibationAvalonia.Dialogs.Login
|
|||||||
LoginMethod = LoginMethod.External;
|
LoginMethod = LoginMethod.External;
|
||||||
await SaveAndCloseAsync();
|
await SaveAndCloseAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,10 +40,6 @@ namespace LibationAvalonia.Dialogs.Login
|
|||||||
Account = account;
|
Account = account;
|
||||||
DataContext = this;
|
DataContext = this;
|
||||||
}
|
}
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task SaveAndCloseAsync()
|
protected override async Task SaveAndCloseAsync()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -65,11 +65,6 @@ namespace LibationAvalonia.Dialogs.Login
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task SaveAndCloseAsync()
|
protected override async Task SaveAndCloseAsync()
|
||||||
{
|
{
|
||||||
var selected = Values.CheckedButton;
|
var selected = Values.CheckedButton;
|
||||||
|
|||||||
@ -60,11 +60,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OkButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
public void OkButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
SaveAndClose();
|
SaveAndClose();
|
||||||
|
|||||||
@ -17,11 +17,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void CancelAndClose() => Close(DialogResult.None);
|
protected override void CancelAndClose() => Close(DialogResult.None);
|
||||||
|
|
||||||
protected override void SaveAndClose() { }
|
protected override void SaveAndClose() { }
|
||||||
|
|||||||
@ -26,6 +26,10 @@ namespace LibationAvalonia.Dialogs
|
|||||||
public ScanAccountsDialog()
|
public ScanAccountsDialog()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
this.HideMinMaxBtns();
|
||||||
|
this.Opened += ScanAccountsDialog_Opened;
|
||||||
|
|
||||||
LoadAccounts();
|
LoadAccounts();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,13 +49,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
DataContext = this;
|
DataContext = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
this.HideMinMaxBtns();
|
|
||||||
this.Opened += ScanAccountsDialog_Opened;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ScanAccountsDialog_Opened(object sender, System.EventArgs e)
|
private void ScanAccountsDialog_Opened(object sender, System.EventArgs e)
|
||||||
{
|
{
|
||||||
this.FindControl<Button>(nameof(ImportButton)).Focus();
|
this.FindControl<Button>(nameof(ImportButton)).Focus();
|
||||||
|
|||||||
@ -12,6 +12,8 @@ namespace LibationAvalonia.Dialogs
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
this.HideMinMaxBtns();
|
||||||
|
|
||||||
StringFields = @"
|
StringFields = @"
|
||||||
Search for wizard of oz:
|
Search for wizard of oz:
|
||||||
title:oz
|
title:oz
|
||||||
@ -52,12 +54,5 @@ for the ID field
|
|||||||
DataContext = this;
|
DataContext = this;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
|
|
||||||
this.HideMinMaxBtns();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,11 +29,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
DataContext = settingsDisp = new(config);
|
DataContext = settingsDisp = new(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task SaveAndCloseAsync()
|
protected override async Task SaveAndCloseAsync()
|
||||||
{
|
{
|
||||||
if (!await settingsDisp.SaveSettingsAsync(config))
|
if (!await settingsDisp.SaveSettingsAsync(config))
|
||||||
|
|||||||
@ -30,10 +30,5 @@ namespace LibationAvalonia.Dialogs
|
|||||||
IsReturningUser = true;
|
IsReturningUser = true;
|
||||||
Close(DialogResult.OK);
|
Close(DialogResult.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,11 +15,6 @@ namespace LibationAvalonia.Dialogs
|
|||||||
DataContext = this;
|
DataContext = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
=> SaveAndClose();
|
=> SaveAndClose();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -97,13 +97,13 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Avalonia" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia.Diagnostics" Version="11.0.0-preview6" Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'" />
|
||||||
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="Avalonia.Desktop" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="Avalonia.Diagnostics" Version="11.0.0-preview4 " />
|
<PackageReference Include="Avalonia.Controls.ItemsRepeater" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="Avalonia.ReactiveUI" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia.Desktop" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.0-preview4" />
|
<PackageReference Include="Avalonia.ReactiveUI" Version="11.0.0-preview6" />
|
||||||
<PackageReference Include="XamlNameReferenceGenerator" Version="1.6.1" />
|
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.0-preview6" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@ -7,7 +7,7 @@ namespace LibationAvalonia
|
|||||||
{
|
{
|
||||||
public class ViewLocator : IDataTemplate
|
public class ViewLocator : IDataTemplate
|
||||||
{
|
{
|
||||||
public IControl Build(object data)
|
public Control Build(object data)
|
||||||
{
|
{
|
||||||
var name = data.GetType().FullName!.Replace("ViewModel", "View");
|
var name = data.GetType().FullName!.Replace("ViewModel", "View");
|
||||||
var type = Type.GetType(name);
|
var type = Type.GetType(name);
|
||||||
|
|||||||
@ -20,7 +20,7 @@ namespace LibationAvalonia.Views
|
|||||||
var options = new FilePickerSaveOptions
|
var options = new FilePickerSaveOptions
|
||||||
{
|
{
|
||||||
Title = "Where to export Library",
|
Title = "Where to export Library",
|
||||||
SuggestedStartLocation = new Avalonia.Platform.Storage.FileIO.BclStorageFolder(Configuration.Instance.Books.PathWithoutPrefix),
|
SuggestedStartLocation = await StorageProvider.TryGetFolderFromPathAsync(Configuration.Instance.Books.PathWithoutPrefix),
|
||||||
SuggestedFileName = $"Libation Library Export {DateTime.Now:yyyy-MM-dd}",
|
SuggestedFileName = $"Libation Library Export {DateTime.Now:yyyy-MM-dd}",
|
||||||
DefaultExtension = "xlsx",
|
DefaultExtension = "xlsx",
|
||||||
ShowOverwritePrompt = true,
|
ShowOverwritePrompt = true,
|
||||||
@ -46,26 +46,26 @@ namespace LibationAvalonia.Views
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var selectedFile = await StorageProvider.SaveFilePickerAsync(options);
|
var selectedFile = (await StorageProvider.SaveFilePickerAsync(options))?.TryGetLocalPath();
|
||||||
|
|
||||||
if (selectedFile?.TryGetUri(out var uri) is not true) return;
|
if (selectedFile is null) return;
|
||||||
|
|
||||||
var ext = FileUtility.GetStandardizedExtension(System.IO.Path.GetExtension(uri.LocalPath));
|
var ext = FileUtility.GetStandardizedExtension(System.IO.Path.GetExtension(selectedFile));
|
||||||
switch (ext)
|
switch (ext)
|
||||||
{
|
{
|
||||||
case ".xlsx": // xlsx
|
case ".xlsx": // xlsx
|
||||||
default:
|
default:
|
||||||
LibraryExporter.ToXlsx(uri.LocalPath);
|
LibraryExporter.ToXlsx(selectedFile);
|
||||||
break;
|
break;
|
||||||
case ".csv": // csv
|
case ".csv": // csv
|
||||||
LibraryExporter.ToCsv(uri.LocalPath);
|
LibraryExporter.ToCsv(selectedFile);
|
||||||
break;
|
break;
|
||||||
case ".json": // json
|
case ".json": // json
|
||||||
LibraryExporter.ToJson(uri.LocalPath);
|
LibraryExporter.ToJson(selectedFile);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
await MessageBox.Show("Library exported to:\r\n" + uri.LocalPath, "Library Exported");
|
await MessageBox.Show("Library exported to:\r\n" + selectedFile, "Library Exported");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -23,10 +23,6 @@ namespace LibationAvalonia.Views
|
|||||||
this.DataContext = _viewModel = new MainWindowViewModel();
|
this.DataContext = _viewModel = new MainWindowViewModel();
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
#if DEBUG
|
|
||||||
this.AttachDevTools();
|
|
||||||
#endif
|
|
||||||
FindAllControls();
|
|
||||||
|
|
||||||
// eg: if one of these init'd productsGrid, then another can't reliably subscribe to it
|
// eg: if one of these init'd productsGrid, then another can't reliably subscribe to it
|
||||||
Configure_BackupCounts();
|
Configure_BackupCounts();
|
||||||
@ -70,18 +66,7 @@ namespace LibationAvalonia.Views
|
|||||||
_viewModel.ProductsDisplay.BindToGrid(dbBooks);
|
_viewModel.ProductsDisplay.BindToGrid(dbBooks);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnLoad() => Load?.Invoke(this, EventArgs.Empty);
|
public void OnLoad() => Load?.Invoke(this, EventArgs.Empty);
|
||||||
public void OnLibraryLoaded(List<LibraryBook> initialLibrary) => LibraryLoaded?.Invoke(this, initialLibrary);
|
public void OnLibraryLoaded(List<LibraryBook> initialLibrary) => LibraryLoaded?.Invoke(this, initialLibrary);
|
||||||
|
|
||||||
private void FindAllControls()
|
|
||||||
{
|
|
||||||
quickFiltersToolStripMenuItem = this.FindControl<MenuItem>(nameof(quickFiltersToolStripMenuItem));
|
|
||||||
productsDisplay = this.FindControl<ProductsDisplay>(nameof(productsDisplay));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,10 +41,5 @@ namespace LibationAvalonia.Views
|
|||||||
=> PositionButtonClicked?.Invoke(DataItem, QueuePosition.OneDown);
|
=> PositionButtonClicked?.Invoke(DataItem, QueuePosition.OneDown);
|
||||||
public void MoveLast_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
public void MoveLast_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||||
=> PositionButtonClicked?.Invoke(DataItem, QueuePosition.Last);
|
=> PositionButtonClicked?.Invoke(DataItem, QueuePosition.Last);
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -94,11 +94,6 @@ namespace LibationAvalonia.Views
|
|||||||
if (e.Key == Avalonia.Input.Key.Enter && sender is Avalonia.Input.IInputElement input) input.Focus();
|
if (e.Key == Avalonia.Input.Key.Enter && sender is Avalonia.Input.IInputElement input) input.Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Control event handlers
|
#region Control event handlers
|
||||||
|
|
||||||
private async void ProcessBookControl2_CancelButtonClicked(ProcessBookViewModel item)
|
private async void ProcessBookControl2_CancelButtonClicked(ProcessBookViewModel item)
|
||||||
|
|||||||
@ -30,6 +30,7 @@
|
|||||||
<Setter Property="HorizontalAlignment" Value="Stretch"/>
|
<Setter Property="HorizontalAlignment" Value="Stretch"/>
|
||||||
<Setter Property="TextWrapping" Value="Wrap"/>
|
<Setter Property="TextWrapping" Value="Wrap"/>
|
||||||
<Setter Property="Padding" Value="4"/>
|
<Setter Property="Padding" Value="4"/>
|
||||||
|
<Setter Property="FontSize" Value="12"/>
|
||||||
</Style>
|
</Style>
|
||||||
</DataGrid.Styles>
|
</DataGrid.Styles>
|
||||||
|
|
||||||
@ -80,7 +81,7 @@
|
|||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<Panel Opacity="{Binding Liberate.Opacity}" Background="{Binding Liberate.BackgroundBrush}">
|
<Panel Opacity="{Binding Liberate.Opacity}" Background="{Binding Liberate.BackgroundBrush}">
|
||||||
<TextBlock Text="{Binding Title}" />
|
<TextBlock FontSize="14" Text="{Binding Title}" />
|
||||||
</Panel>
|
</Panel>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</DataGridTemplateColumn.CellTemplate>
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
|||||||
@ -29,6 +29,7 @@ namespace LibationAvalonia.Views
|
|||||||
public ProductsDisplay()
|
public ProductsDisplay()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
DataGridContextMenus.CellContextMenuStripNeeded += ProductsGrid_CellContextMenuStripNeeded;
|
||||||
|
|
||||||
if (Design.IsDesignMode)
|
if (Design.IsDesignMode)
|
||||||
{
|
{
|
||||||
@ -74,14 +75,6 @@ namespace LibationAvalonia.Views
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
AvaloniaXamlLoader.Load(this);
|
|
||||||
|
|
||||||
productsGrid = this.FindControl<DataGrid>(nameof(productsGrid));
|
|
||||||
DataGridContextMenus.CellContextMenuStripNeeded += ProductsGrid_CellContextMenuStripNeeded;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Cell Context Menu
|
#region Cell Context Menu
|
||||||
|
|
||||||
public void ProductsGrid_CellContextMenuStripNeeded(object sender, DataGridCellContextMenuStripNeededEventArgs args)
|
public void ProductsGrid_CellContextMenuStripNeeded(object sender, DataGridCellContextMenuStripNeededEventArgs args)
|
||||||
@ -163,22 +156,24 @@ namespace LibationAvalonia.Views
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var window = this.GetParentWindow();
|
||||||
|
|
||||||
var openFileDialogOptions = new FilePickerOpenOptions
|
var openFileDialogOptions = new FilePickerOpenOptions
|
||||||
{
|
{
|
||||||
Title = $"Locate the audio file for '{entry.Book.Title}'",
|
Title = $"Locate the audio file for '{entry.Book.Title}'",
|
||||||
AllowMultiple = false,
|
AllowMultiple = false,
|
||||||
SuggestedStartLocation = new Avalonia.Platform.Storage.FileIO.BclStorageFolder(Configuration.Instance.Books.PathWithoutPrefix),
|
SuggestedStartLocation = await window.StorageProvider.TryGetFolderFromPathAsync(Configuration.Instance.Books.PathWithoutPrefix),
|
||||||
FileTypeFilter = new FilePickerFileType[]
|
FileTypeFilter = new FilePickerFileType[]
|
||||||
{
|
{
|
||||||
new("All files (*.*)") { Patterns = new[] { "*" } },
|
new("All files (*.*)") { Patterns = new[] { "*" } },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var selectedFiles = await this.GetParentWindow().StorageProvider.OpenFilePickerAsync(openFileDialogOptions);
|
var selectedFiles = await window.StorageProvider.OpenFilePickerAsync(openFileDialogOptions);
|
||||||
var selectedFile = selectedFiles.SingleOrDefault();
|
var selectedFile = selectedFiles.SingleOrDefault()?.TryGetLocalPath();
|
||||||
|
|
||||||
if (selectedFile?.TryGetUri(out var uri) is true)
|
if (selectedFile is not null)
|
||||||
FilePathCache.Insert(entry.AudibleProductId, uri.LocalPath);
|
FilePathCache.Insert(entry.AudibleProductId, selectedFile);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@ -369,7 +364,8 @@ namespace LibationAvalonia.Views
|
|||||||
|
|
||||||
//Expanding and collapsing reset the list, which will cause focus to shift
|
//Expanding and collapsing reset the list, which will cause focus to shift
|
||||||
//to the topright cell. Reset focus onto the clicked button's cell.
|
//to the topright cell. Reset focus onto the clicked button's cell.
|
||||||
(sender as Button).Parent?.Focus();
|
var parentControl = (sender as Button).Parent as Control;
|
||||||
|
parentControl?.Focus();
|
||||||
}
|
}
|
||||||
else if (button.DataContext is ILibraryBookEntry lbEntry)
|
else if (button.DataContext is ILibraryBookEntry lbEntry)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -61,6 +61,11 @@
|
|||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<Panel>
|
<Panel>
|
||||||
|
<Panel.Styles>
|
||||||
|
<Style Selector="TextBlock">
|
||||||
|
<Setter Property="FontSize" Value="13"/>
|
||||||
|
</Style>
|
||||||
|
</Panel.Styles>
|
||||||
<Button
|
<Button
|
||||||
Padding="0"
|
Padding="0"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user