Refactor IconProvider

This commit is contained in:
chinboy
2025-12-03 10:44:16 +08:00
parent ed63178273
commit 2d751b5dab
852 changed files with 1950 additions and 1768 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
<PropertyGroup>
<NoWarn>$(NoWarn);CS7035</NoWarn>
<AvaloniaVersion>11.3.9</AvaloniaVersion>
<AtomUIVersion>5.1.2-build.2</AtomUIVersion>
<AtomUIVersion>5.1.2-build.3</AtomUIVersion>
<AtomUINativeVersion>1.0.1</AtomUINativeVersion>
<AtomUIGalleryVersion>5.1.2</AtomUIGalleryVersion>
</PropertyGroup>
@@ -1,4 +1,3 @@
using System.Diagnostics;
using System.Reflection;
using AtomUI.Controls;
@@ -14,27 +13,17 @@ public class GalleryDesktopIconProvider : IconProvider<DesktopIconKind>
: base(kind)
{
}
protected override Icon GetIcon(DesktopIconKind kind)
protected override Type GetTypeForKind(DesktopIconKind kind)
{
try
var typeName = $"AtomUIGallery.Icons.Desktop.{kind.ToString()}";
var type = Type.GetType(typeName)
?? Assembly.GetExecutingAssembly().GetType(typeName);
if (type == null)
{
var fullTypeName = $"AtomUIGallery.Icons.Desktop.{kind.ToString()}";
var type = Type.GetType(fullTypeName)
?? Assembly.GetExecutingAssembly().GetType(fullTypeName);
if (type == null)
{
throw new InvalidOperationException($"{fullTypeName} not exist");
}
var icon = (Icon?)Activator.CreateInstance(type);
Debug.Assert(icon != null);
return icon;
}
catch (Exception ex)
{
throw new InvalidOperationException($"create icon {kind.ToString()} failed", ex);
throw new InvalidOperationException($"Type {typeName} does not exist");
}
return type;
}
}
@@ -28,6 +28,11 @@
<Setter Property="FillBrush" Value="{DynamicResource {x:Static atom:SharedTokenKey.ColorInfoBg}}" />
</Style>
<Style Selector="^[IconTheme=MultiColor]">
<Setter Property="StrokeBrush" Value="{DynamicResource {x:Static atom:SharedTokenKey.ColorIcon}}" />
<Setter Property="FillBrush" Value="{DynamicResource {x:Static atom:SharedTokenKey.ColorPrimary}}" />
</Style>
<Setter Property="SecondaryFillBrush" Value="{DynamicResource {x:Static atom:IconTokenKey.SecondaryFillColor}}" />
<Setter Property="SecondaryStrokeBrush" Value="{DynamicResource {x:Static atom:IconTokenKey.SecondaryStrokeColor}}" />
<Setter Property="FillAnimationDuration" Value="{DynamicResource {x:Static atom:SharedTokenKey.MotionDurationMid}}" />
+2 -1
View File
@@ -23,5 +23,6 @@ public enum IconBrushType
Fill,
SecondaryStroke,
SecondaryFill,
Fallback
Fallback,
None
}
+39 -20
View File
@@ -169,8 +169,8 @@ public abstract class Icon : PathIcon, ICustomHitTest, IMotionAwareControl
private Animation? _animation;
private CancellationTokenSource? _animationCancellationTokenSource;
private readonly IBrush?[] _brushes = new IBrush[5];
private readonly Pen?[] _pens = new Pen?[5];
protected readonly IBrush?[] DrawBrushes = new IBrush[5];
protected readonly Pen?[] DrawPens = new Pen?[5];
static Icon()
{
@@ -195,17 +195,28 @@ public abstract class Icon : PathIcon, ICustomHitTest, IMotionAwareControl
var secondaryFillIndex = (int)IconBrushType.SecondaryFill;
var fallbackIndex = (int)IconBrushType.Fallback;
_brushes[strokeIndex] = StrokeBrush;
_brushes[fillIndex] = FillBrush;
_brushes[secondaryStrokeIndex] = SecondaryStrokeBrush;
_brushes[secondaryFillIndex] = SecondaryFillBrush;
_brushes[fallbackIndex] = FallbackBrush;
var strokeBrush = ProcessBrush(StrokeBrush);
var fillBrush = ProcessBrush(FillBrush);
var secondaryStrokeBrush = ProcessBrush(SecondaryStrokeBrush);
var secondaryFillBrush = ProcessBrush(SecondaryFillBrush);
var fallbackBrush = ProcessBrush(FallbackBrush);
_pens[strokeIndex] = new Pen(StrokeBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
_pens[fillIndex] = new Pen(FillBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
_pens[secondaryStrokeIndex] = new Pen(SecondaryStrokeBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
_pens[secondaryFillIndex] = new Pen(SecondaryFillBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
_pens[fallbackIndex] = new Pen(FallbackBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
DrawBrushes[strokeIndex] = strokeBrush;
DrawBrushes[fillIndex] = fillBrush;
DrawBrushes[secondaryStrokeIndex] = secondaryStrokeBrush;
DrawBrushes[secondaryFillIndex] = secondaryFillBrush;
DrawBrushes[fallbackIndex] = fallbackBrush;
DrawPens[strokeIndex] = new Pen(strokeBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
DrawPens[fillIndex] = new Pen(fillBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
DrawPens[secondaryStrokeIndex] = new Pen(secondaryStrokeBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
DrawPens[secondaryFillIndex] = new Pen(secondaryFillBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
DrawPens[fallbackIndex] = new Pen(fallbackBrush, StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
}
protected virtual IBrush? ProcessBrush(IBrush? brush)
{
return brush;
}
private void ConfigureTransitions(bool force)
@@ -298,14 +309,18 @@ public abstract class Icon : PathIcon, ICustomHitTest, IMotionAwareControl
private void HandleBrushChanged(IconBrushType brushType, IBrush? brush)
{
if (brushType == IconBrushType.None)
{
return;
}
var brushIndex = (int)brushType;
_brushes[brushIndex] = brush;
_pens[brushIndex] = new Pen(_brushes[brushIndex], StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
DrawBrushes[brushIndex] = ProcessBrush(brush);
DrawPens[brushIndex] = new Pen(DrawBrushes[brushIndex], StrokeWidth, lineCap: StrokeLineCap, lineJoin: StrokeLineJoin);
}
private void HandleStrokeWidthChanged(double strokeWidth)
{
foreach (var pen in _pens)
foreach (var pen in DrawPens)
{
if (pen != null)
{
@@ -316,7 +331,7 @@ public abstract class Icon : PathIcon, ICustomHitTest, IMotionAwareControl
private void HandleLineCapChanged(PenLineCap lineCap)
{
foreach (var pen in _pens)
foreach (var pen in DrawPens)
{
if (pen != null)
{
@@ -327,7 +342,7 @@ public abstract class Icon : PathIcon, ICustomHitTest, IMotionAwareControl
private void HandleLineJoinChanged(PenLineJoin lineJoin)
{
foreach (var pen in _pens)
foreach (var pen in DrawPens)
{
if (pen != null)
{
@@ -467,10 +482,14 @@ public abstract class Icon : PathIcon, ICustomHitTest, IMotionAwareControl
return true;
}
internal IBrush? FindIconBrush(IconBrushType brushType)
public virtual IBrush? FindIconBrush(IconBrushType brushType)
{
if (brushType == IconBrushType.None)
{
return null;
}
var index = (int)brushType;
Debug.Assert(index >= 0 && index < _brushes.Length);
return _brushes[index];
Debug.Assert(index >= 0 && index < DrawBrushes.Length);
return DrawBrushes[index];
}
}
+73 -2
View File
@@ -1,4 +1,5 @@
using System.Diagnostics;
using System.Linq.Expressions;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
@@ -7,7 +8,20 @@ namespace AtomUI.Controls;
public abstract class IconProvider<TIconKind> : MarkupExtension
where TIconKind : Enum
{
public TIconKind? Kind { get; set; }
private TIconKind? _kind;
public TIconKind? Kind
{
get => _kind;
set
{
if (!EqualityComparer<TIconKind?>.Default.Equals(_kind, value))
{
_kind = value;
NotifyKindChanged();
}
}
}
public IBrush? StrokeBrush { get; set; }
public IBrush? FillBrush { get; set; }
@@ -26,6 +40,10 @@ public abstract class IconProvider<TIconKind> : MarkupExtension
{
Kind = kind;
}
protected virtual void NotifyKindChanged()
{
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
@@ -70,5 +88,58 @@ public abstract class IconProvider<TIconKind> : MarkupExtension
return icon;
}
protected abstract Icon GetIcon(TIconKind kind);
protected virtual Icon GetIcon(TIconKind kind)
{
try
{
var enumType = typeof(TIconKind);
var creator = IconProviderCache.GetOrAddCreator(
enumType,
kind,
value => GetTypeForKind((TIconKind)value),
CreateFactory);
var icon = creator();
Debug.Assert(icon != null);
return icon;
}
catch (Exception ex)
{
throw new InvalidOperationException($"Create icon {kind} failed", ex);
}
}
protected abstract Type GetTypeForKind(TIconKind kind);
protected virtual Func<Icon> CreateFactory(Type type)
{
try
{
var constructor = type.GetConstructor(Type.EmptyTypes);
if (constructor == null)
{
throw new InvalidOperationException(
$"No parameterless constructor found for {type.Name}");
}
var newExpr = Expression.New(constructor);
var lambda = Expression.Lambda<Func<Icon>>(newExpr);
return lambda.Compile();
}
catch (Exception ex)
{
Debug.WriteLine($"Failed to create expression tree for {type.Name}: {ex.Message}");
return () => (Icon)Activator.CreateInstance(type)!;
}
}
public static void ClearCache()
{
IconProviderCache.ClearCache(typeof(TIconKind));
}
public static void ClearAllCache()
{
IconProviderCache.ClearAllCache();
}
}
@@ -0,0 +1,49 @@
using System.Collections.Concurrent;
namespace AtomUI.Controls;
internal static class IconProviderCache
{
private static readonly ConcurrentDictionary<Type, ConcurrentDictionary<object, Type>> TypeCache =
new();
private static readonly ConcurrentDictionary<Type, ConcurrentDictionary<object, Func<Icon>>> CreatorCache =
new();
private static readonly ConcurrentDictionary<Type, Func<Icon>> TypeToCreator =
new();
public static Type GetOrAddType(Type enumType, object enumValue, Func<object, Type> typeFactory)
{
var cache = TypeCache.GetOrAdd(enumType,
_ => new ConcurrentDictionary<object, Type>());
return cache.GetOrAdd(enumValue, typeFactory);
}
public static Func<Icon> GetOrAddCreator(Type enumType, object enumValue,
Func<object, Type> typeFactory, Func<Type, Func<Icon>> creatorFactory)
{
var cache = CreatorCache.GetOrAdd(enumType,
_ => new ConcurrentDictionary<object, Func<Icon>>());
return cache.GetOrAdd(enumValue, value =>
{
var type = GetOrAddType(enumType, value, typeFactory);
return TypeToCreator.GetOrAdd(type, creatorFactory);
});
}
public static void ClearCache(Type enumType)
{
TypeCache.TryRemove(enumType, out _);
CreatorCache.TryRemove(enumType, out _);
}
public static void ClearAllCache()
{
TypeCache.Clear();
CreatorCache.Clear();
TypeToCreator.Clear();
}
}
+74 -20
View File
@@ -91,7 +91,7 @@ public static class TransformParser
TransformFunction function,
in TransformOperations.Builder builder)
{
static UnitValue ParseValue(ReadOnlySpan<char> part, TransformFunction function)
static UnitValue ParseValue(ReadOnlySpan<char> part, int index, TransformFunction function)
{
int unitIndex = -1;
@@ -138,7 +138,21 @@ public static class TransformParser
{
if (unit == Unit.None)
{
unit = Unit.Radian;
if (function == TransformFunction.Rotate)
{
if (index == 0)
{
unit = Unit.Degree;
}
else
{
unit = Unit.Pixel;
}
}
else
{
unit = Unit.Degree;
}
}
}
return new UnitValue(unit, value);
@@ -160,13 +174,13 @@ public static class TransformParser
var leftPart = part.Slice(0, separatorIndex).Trim();
var rightPart = part.Slice(separatorIndex + 1, part.Length - separatorIndex - 1).Trim();
leftValue = ParseValue(leftPart, function);
rightValue = ParseValue(rightPart, function);
leftValue = ParseValue(leftPart, 0, function);
rightValue = ParseValue(rightPart, 1, function);
return 2;
}
leftValue = ParseValue(part, function);
leftValue = ParseValue(part, 0, function);
return 1;
}
@@ -174,7 +188,7 @@ public static class TransformParser
static int ParseCommaDelimitedValues(ReadOnlySpan<char> part, in Span<UnitValue> outValues, TransformFunction function)
{
int valueIndex = 0;
int paramPos = 0;
while (true)
{
if (valueIndex >= outValues.Length)
@@ -182,6 +196,7 @@ public static class TransformParser
throw new FormatException("Too many provided values.");
}
part = part.Trim();
var separatorIndex = part.IndexOf(',');
if (separatorIndex == -1)
{
@@ -192,7 +207,7 @@ public static class TransformParser
{
if (!part.IsWhiteSpace())
{
outValues[valueIndex++] = ParseValue(part, function);
outValues[valueIndex++] = ParseValue(part, paramPos++, function);
}
break;
@@ -200,7 +215,7 @@ public static class TransformParser
var valuePart = part.Slice(0, separatorIndex).Trim();
outValues[valueIndex++] = ParseValue(valuePart, function);
outValues[valueIndex++] = ParseValue(valuePart, paramPos++, function);
part = part.Slice(separatorIndex + 1, part.Length - separatorIndex - 1);
}
@@ -270,20 +285,54 @@ public static class TransformParser
}
case TransformFunction.Rotate:
{
var angle = UnitValue.Zero;
UnitValue _ = default;
Span<UnitValue> values = stackalloc UnitValue[3];
int count = ParseCommaDelimitedValues(functionPart, in values, function);
int count = ParseValuePair(functionPart, function, ref angle, ref _);
if (count != 1)
if (count != 1 && count != 3)
{
ThrowFormatInvalidValueCount(function, 1);
ThrowFormatInvalidValueCount(function, 1, 3);
}
VerifyZeroOrAngle(function, in values[0]);
VerifyZeroOrAngle(function, in angle);
builder.AppendRotate(ToRadians(in angle));
if (count == 1)
{
builder.AppendRotate(ToRadians(in values[0]));
}
else if (count == 3)
{
var angle = values[0];
var centerX = values[1];
var centerY = values[2];
// 验证中心坐标是否有单位
if (centerX.Unit != Unit.None && centerX.Unit != Unit.Pixel)
{
ThrowFormatInvalidValue(function, in centerX);
}
if (centerY.Unit != Unit.None && centerY.Unit != Unit.Pixel)
{
ThrowFormatInvalidValue(function, in centerY);
}
double angleRad = ToRadians(in angle);
// 计算旋转矩阵(绕指定点旋转)
// M = T(cx, cy) × R(angle) × T(-cx, -cy)
double cos = Math.Cos(angleRad);
double sin = Math.Sin(angleRad);
double dx = centerX.Value * (1 - cos) + centerY.Value * sin;
double dy = centerY.Value * (1 - cos) - centerX.Value * sin;
var matrix = new Matrix(
cos, -sin, // M11, M12
sin, cos, // M21, M22
dx, dy // OffsetX, OffsetY
);
builder.AppendMatrix(matrix);
}
break;
}
case TransformFunction.Translate:
@@ -385,9 +434,14 @@ public static class TransformParser
throw new FormatException($"Invalid value {value.Value} {unitString} for {function}");
}
private static void ThrowFormatInvalidValueCount(TransformFunction function, int count)
private static void ThrowFormatInvalidValueCount(TransformFunction function, int expectedCount)
{
throw new FormatException($"Invalid format. {function} expects {count} value(s).");
throw new FormatException($"Invalid format. {function} expects {expectedCount} value(s).");
}
private static void ThrowFormatInvalidValueCount(TransformFunction function, int minCount, int maxCount)
{
throw new FormatException($"Invalid format. {function} expects between {minCount} and {maxCount} values.");
}
private static Unit ParseUnit(in ReadOnlySpan<char> part)
@@ -1,4 +1,3 @@
using System.Diagnostics;
using System.Reflection;
using AtomUI.Controls;
@@ -14,26 +13,16 @@ public class AntDesignIconProvider : IconProvider<AntDesignIconKind>
{
}
protected override Icon GetIcon(AntDesignIconKind kind)
protected override Type GetTypeForKind(AntDesignIconKind kind)
{
try
var typeName = $"AtomUI.Icons.AntDesign.{kind.ToString()}";
var type = Type.GetType(typeName)
?? Assembly.GetExecutingAssembly().GetType(typeName);
if (type == null)
{
var fullTypeName = $"AtomUI.Icons.AntDesign.{kind.ToString()}";
var type = Type.GetType(fullTypeName)
?? Assembly.GetExecutingAssembly().GetType(fullTypeName);
if (type == null)
{
throw new InvalidOperationException($"{fullTypeName} not exist");
}
var icon = (Icon?)Activator.CreateInstance(type);
Debug.Assert(icon != null);
return icon;
}
catch (Exception ex)
{
throw new InvalidOperationException($"create icon {kind.ToString()} failed", ex);
throw new InvalidOperationException($"Type {typeName} does not exist");
}
return type;
}
}
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;
@@ -1,5 +1,5 @@
// This code is auto generated. Do not modify.
// Generated Date: 2025-11-28
// Generated Date: 2025-12-02
using Avalonia;
using System;

Some files were not shown because too many files have changed in this diff Show More