adding cachinfo and spinner controls (WIP)

This commit is contained in:
IsWaffle 2023-08-24 22:28:37 -04:00
parent ea771037af
commit d8d442c195
9 changed files with 181 additions and 18 deletions

View File

@ -211,20 +211,4 @@
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style>
<!-- PreCheck Path Styles -->
<Style Selector="Path.passed">
<Setter Property="Data" Value="{StaticResource CircledCheck}"/>
<Setter Property="Fill" Value="Green"/>
</Style>
<Style Selector="Path.failed">
<Setter Property="Data" Value="{StaticResource CircledX}"/>
<Setter Property="Fill" Value="Red"/>
</Style>
<Style Selector="Path.warning">
<Setter Property="Data" Value="{StaticResource CircledWarn}"/>
<Setter Property="Fill" Value="Goldenrod"/>
</Style>
</Styles>

View File

@ -0,0 +1,26 @@
using Avalonia.Data.Converters;
using SPTInstaller.CustomControls;
using System.Globalization;
namespace SPTInstaller.Converters;
public class StatusSpinnerIsProcessingConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (value is not StatusSpinner.SpinnerState state)
return null;
if (parameter is string parm && parm == "invert")
{
return state > 0;
}
return state <= 0;
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
return value;
}
}

View File

@ -0,0 +1,26 @@
using Avalonia.Data.Converters;
using SPTInstaller.CustomControls;
using System.Globalization;
namespace SPTInstaller.Converters;
public class StatusSpinnerIsStateConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (value == null || parameter == null)
return null;
if (value is not StatusSpinner.SpinnerState state)
return null;
if (parameter is not string stateName)
return null;
return state.ToString().ToLower() == stateName.ToLower();
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
return value;
}
}

View File

@ -0,0 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="SPTInstaller.CustomControls.CacheInfo">
Welcome to Avalonia!
</UserControl>

View File

@ -0,0 +1,10 @@
using Avalonia.Controls;
namespace SPTInstaller.CustomControls;
public partial class CacheInfo : UserControl
{
public CacheInfo()
{
InitializeComponent();
}
}

View File

@ -36,7 +36,7 @@
IsVisible="{Binding !IsPending, RelativeSource={RelativeSource AncestorType=UserControl}}">
<Ellipse Fill="White" Height="15" Width="15" Canvas.Top="3" Canvas.Left="3"
/>
<Path Name="iconPath" StrokeThickness="2"
<Path StrokeThickness="2"
Classes.passed="{Binding Passed, RelativeSource={RelativeSource AncestorType=UserControl}}"
>
<Classes.failed>

View File

@ -0,0 +1,77 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:convt="using:SPTInstaller.Converters"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="SPTInstaller.CustomControls.StatusSpinner"
>
<UserControl.Resources>
<convt:StatusSpinnerIsStateConverter x:Key="IsStateConverter"/>
<convt:StatusSpinnerIsProcessingConverter x:Key="IsInProcessingStateConverter"/>
</UserControl.Resources>
<UserControl.Styles>
<Style Selector="Arc.running">
<Setter Property="Stroke" Value="DodgerBlue"/>
</Style>
<Style Selector="Path.ok">
<Setter Property="Data" Value="{StaticResource CircledCheck}"/>
<Setter Property="Fill" Value="Green"/>
</Style>
<Style Selector="Path.warning">
<Setter Property="Data" Value="{StaticResource CircledWarn}"/>
<Setter Property="Fill" Value="Goldenrod"/>
</Style>
<Style Selector="Path.error">
<Setter Property="Data" Value="{StaticResource CircledX}"/>
<Setter Property="Fill" Value="Red"/>
</Style>
<Style Selector="Arc">
<Setter Property="Stroke" Value="Gray"/>
<Setter Property="IsVisible" Value="{Binding State, RelativeSource={RelativeSource AncestorType=UserControl},
Converter={StaticResource ResourceKey=IsInProcessingStateConverter}}"/>
<Style.Animations>
<Animation Duration="0:0:1" IterationCount="Infinite">
<KeyFrame Cue="0%">
<Setter Property="RotateTransform.Angle" Value="0"/>
</KeyFrame>
<KeyFrame Cue="100%">
<Setter Property="RotateTransform.Angle" Value="360"/>
</KeyFrame>
</Animation>
</Style.Animations>
</Style>
</UserControl.Styles>
<Grid>
<Canvas Margin="0 3 0 0" Height="20" Width="20"
IsVisible="{Binding State, RelativeSource={RelativeSource AncestorType=UserControl},
Converter={StaticResource ResourceKey=IsInProcessingStateConverter}, ConverterParameter=invert}">
<Ellipse Fill="White" Height="15" Width="15" Canvas.Top="3" Canvas.Left="3"
/>
<Path StrokeThickness="2"
Classes.ok="{Binding State, RelativeSource={RelativeSource AncestorType=UserControl},
Converter={StaticResource ResourceKey=IsStateConverter},
ConverterParameter=OK}"
Classes.warning="{Binding State, RelativeSource={RelativeSource AncestorType=UserControl},
Converter={StaticResource ResourceKey=IsStateConverter},
ConverterParameter=Warning}"
Classes.error="{Binding State, RelativeSource={RelativeSource AncestorType=UserControl},
Converter={StaticResource ResourceKey=IsStateConverter},
ConverterParameter=Error}"
/>
</Canvas>
<Arc StartAngle="280" SweepAngle="80" Margin="0 3 0 0" StrokeThickness="3"
Width="20" Height="20" VerticalAlignment="Top"
Classes.running="{Binding State, RelativeSource={RelativeSource AncestorType=UserControl},
Converter={StaticResource ResourceKey=IsStateConverter},
ConverterParameter=Running}"
/>
</Grid>
</UserControl>

View File

@ -0,0 +1,31 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.ReactiveUI;
namespace SPTInstaller.CustomControls;
public partial class StatusSpinner : ReactiveUserControl<UserControl>
{
public enum SpinnerState
{
Pending = -1,
Running = 0,
OK = 1,
Warning = 2,
Error = 3,
}
public StatusSpinner()
{
InitializeComponent();
}
public SpinnerState State
{
get => GetValue(StateProperty);
set => SetValue(StateProperty, value);
}
public static readonly StyledProperty<SpinnerState> StateProperty =
AvaloniaProperty.Register<StatusSpinner, SpinnerState>(nameof(State));
}

View File

@ -26,7 +26,7 @@
IsEnabled="{Binding AllowInstall}"
Command="{Binding StartInstallCommand}"
/>
<ItemsControl ItemsSource="{Binding PreChecks}" Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="4" HorizontalAlignment="Center">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
@ -44,6 +44,7 @@
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="3" HorizontalAlignment="Center"
Content="Detailed View"
IsEnabled="{Binding AllowDetailsButton}"