feat: add generic thickness/cornerradius converter.
This commit is contained in:
90
src/Ursa/Converters/CornerRadiusConverter.cs
Normal file
90
src/Ursa/Converters/CornerRadiusConverter.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using System.Globalization;
|
||||
using Avalonia;
|
||||
using Avalonia.Data.Converters;
|
||||
|
||||
namespace Ursa.Converters;
|
||||
|
||||
[Flags]
|
||||
public enum CornerRadiusPosition
|
||||
{
|
||||
TopLeft = 1,
|
||||
TopRight = 2,
|
||||
BottomLeft = 4,
|
||||
BottomRight = 8,
|
||||
Top = 3,
|
||||
Left = 5,
|
||||
Right = 10,
|
||||
Bottom = 12,
|
||||
}
|
||||
|
||||
public class CornerRadiusIncludeConverter: IValueConverter
|
||||
{
|
||||
public static CornerRadiusIncludeConverter TopLeft { get; } = new( CornerRadiusPosition.TopLeft );
|
||||
public static CornerRadiusIncludeConverter TopRight { get; } = new( CornerRadiusPosition.TopRight );
|
||||
public static CornerRadiusIncludeConverter BottomLeft { get; } = new( CornerRadiusPosition.BottomLeft );
|
||||
public static CornerRadiusIncludeConverter BottomRight { get; } = new( CornerRadiusPosition.BottomRight );
|
||||
public static CornerRadiusIncludeConverter Top { get; } = new( CornerRadiusPosition.Top );
|
||||
public static CornerRadiusIncludeConverter Left { get; } = new( CornerRadiusPosition.Left );
|
||||
public static CornerRadiusIncludeConverter Right { get; } = new( CornerRadiusPosition.Right );
|
||||
public static CornerRadiusIncludeConverter Bottom { get; } = new( CornerRadiusPosition.Bottom );
|
||||
|
||||
private readonly CornerRadiusPosition _position;
|
||||
|
||||
public CornerRadiusIncludeConverter(CornerRadiusPosition position)
|
||||
{
|
||||
_position = position;
|
||||
}
|
||||
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is CornerRadius r)
|
||||
{
|
||||
double topLeft = _position.HasFlag(CornerRadiusPosition.TopLeft) ? r.TopLeft : 0;
|
||||
double topRight = _position.HasFlag(CornerRadiusPosition.TopRight) ? r.TopRight : 0;
|
||||
double bottomLeft = _position.HasFlag(CornerRadiusPosition.BottomLeft) ? r.BottomLeft : 0;
|
||||
double bottomRight = _position.HasFlag(CornerRadiusPosition.BottomRight) ? r.BottomRight : 0;
|
||||
return new CornerRadius(topLeft, topRight, bottomRight, bottomLeft);
|
||||
}
|
||||
return AvaloniaProperty.UnsetValue;
|
||||
}
|
||||
|
||||
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
public class CornerRadiusExcludeConverter : IValueConverter
|
||||
{
|
||||
public static CornerRadiusExcludeConverter TopLeft { get; } = new( CornerRadiusPosition.TopLeft );
|
||||
public static CornerRadiusExcludeConverter TopRight { get; } = new( CornerRadiusPosition.TopRight );
|
||||
public static CornerRadiusExcludeConverter BottomLeft { get; } = new( CornerRadiusPosition.BottomLeft );
|
||||
public static CornerRadiusExcludeConverter BottomRight { get; } = new( CornerRadiusPosition.BottomRight );
|
||||
public static CornerRadiusExcludeConverter Top { get; } = new( CornerRadiusPosition.Top );
|
||||
public static CornerRadiusExcludeConverter Left { get; } = new( CornerRadiusPosition.Left );
|
||||
public static CornerRadiusExcludeConverter Right { get; } = new( CornerRadiusPosition.Right );
|
||||
public static CornerRadiusExcludeConverter Bottom { get; } = new( CornerRadiusPosition.Bottom );
|
||||
|
||||
private readonly CornerRadiusPosition _position;
|
||||
|
||||
public CornerRadiusExcludeConverter(CornerRadiusPosition position)
|
||||
{
|
||||
_position = position;
|
||||
}
|
||||
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is CornerRadius r)
|
||||
{
|
||||
double topLeft = _position.HasFlag(CornerRadiusPosition.TopLeft) ? 0 : r.TopLeft;
|
||||
double topRight = _position.HasFlag(CornerRadiusPosition.TopRight) ? 0 : r.TopRight;
|
||||
double bottomLeft = _position.HasFlag(CornerRadiusPosition.BottomLeft) ? 0 : r.BottomLeft;
|
||||
double bottomRight = _position.HasFlag(CornerRadiusPosition.BottomRight) ? 0 : r.BottomRight;
|
||||
return new CornerRadius(topLeft, topRight, bottomRight, bottomLeft);
|
||||
}
|
||||
return AvaloniaProperty.UnsetValue;
|
||||
}
|
||||
|
||||
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
91
src/Ursa/Converters/ThicknessConverter.cs
Normal file
91
src/Ursa/Converters/ThicknessConverter.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
using System.Globalization;
|
||||
using Avalonia;
|
||||
using Avalonia.Data.Converters;
|
||||
|
||||
namespace Ursa.Converters;
|
||||
|
||||
[Flags]
|
||||
public enum ThicknessPosition
|
||||
{
|
||||
Left = 1,
|
||||
Top = 2,
|
||||
Right = 4,
|
||||
Bottom = 8,
|
||||
TopLeft = 3,
|
||||
TopRight = 6,
|
||||
BottomLeft = 9,
|
||||
BottomRight = 12,
|
||||
}
|
||||
|
||||
public class ThicknessExcludeConverter: IValueConverter
|
||||
{
|
||||
public static ThicknessExcludeConverter Left { get; } = new( ThicknessPosition.Left );
|
||||
public static ThicknessExcludeConverter Top { get; } = new( ThicknessPosition.Top );
|
||||
public static ThicknessExcludeConverter Right { get; } = new( ThicknessPosition.Right );
|
||||
public static ThicknessExcludeConverter Bottom { get; } = new( ThicknessPosition.Bottom );
|
||||
public static ThicknessExcludeConverter TopLeft { get; } = new( ThicknessPosition.TopLeft );
|
||||
public static ThicknessExcludeConverter TopRight { get; } = new( ThicknessPosition.TopRight );
|
||||
public static ThicknessExcludeConverter BottomLeft { get; } = new( ThicknessPosition.BottomLeft );
|
||||
public static ThicknessExcludeConverter BottomRight { get; } = new( ThicknessPosition.BottomRight );
|
||||
|
||||
private readonly ThicknessPosition _position;
|
||||
public ThicknessExcludeConverter(ThicknessPosition position)
|
||||
{
|
||||
_position = position;
|
||||
}
|
||||
|
||||
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is Thickness t)
|
||||
{
|
||||
double left = _position.HasFlag(ThicknessPosition.Left) ? 0d: t.Left;
|
||||
double top = _position.HasFlag(ThicknessPosition.Top) ? 0d : t.Top;
|
||||
double right = _position.HasFlag(ThicknessPosition.Right) ? 0d : t.Right;
|
||||
double bottom = _position.HasFlag(ThicknessPosition.Bottom) ? 0d : t.Bottom;
|
||||
|
||||
return new Thickness(left, top, right, bottom);
|
||||
}
|
||||
return AvaloniaProperty.UnsetValue;
|
||||
}
|
||||
|
||||
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
public class ThicknessIncludeConverter: IValueConverter
|
||||
{
|
||||
public static ThicknessIncludeConverter Left { get; } = new( ThicknessPosition.Left );
|
||||
public static ThicknessIncludeConverter Top { get; } = new( ThicknessPosition.Top );
|
||||
public static ThicknessIncludeConverter Right { get; } = new( ThicknessPosition.Right );
|
||||
public static ThicknessIncludeConverter Bottom { get; } = new( ThicknessPosition.Bottom );
|
||||
public static ThicknessIncludeConverter TopLeft { get; } = new( ThicknessPosition.TopLeft );
|
||||
public static ThicknessIncludeConverter TopRight { get; } = new( ThicknessPosition.TopRight );
|
||||
public static ThicknessIncludeConverter BottomLeft { get; } = new( ThicknessPosition.BottomLeft );
|
||||
public static ThicknessIncludeConverter BottomRight { get; } = new( ThicknessPosition.BottomRight );
|
||||
|
||||
private readonly ThicknessPosition _position;
|
||||
public ThicknessIncludeConverter(ThicknessPosition position)
|
||||
{
|
||||
_position = position;
|
||||
}
|
||||
|
||||
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is Thickness t)
|
||||
{
|
||||
var left = _position.HasFlag(ThicknessPosition.Left) ? t.Left : 0d;
|
||||
var top = _position.HasFlag(ThicknessPosition.Top) ? t.Top : 0d;
|
||||
var right = _position.HasFlag(ThicknessPosition.Right) ? t.Right : 0d;
|
||||
var bottom = _position.HasFlag(ThicknessPosition.Bottom) ? t.Bottom : 0d;
|
||||
return new Thickness(left, top, right, bottom);
|
||||
}
|
||||
return AvaloniaProperty.UnsetValue;
|
||||
}
|
||||
|
||||
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user