diff --git a/src/Ursa.Themes.Semi/Controls/DualBadge.axaml b/src/Ursa.Themes.Semi/Controls/DualBadge.axaml index 4cfb62f..af0c658 100644 --- a/src/Ursa.Themes.Semi/Controls/DualBadge.axaml +++ b/src/Ursa.Themes.Semi/Controls/DualBadge.axaml @@ -1,7 +1,8 @@  + xmlns:u="https://irihi.tech/ursa" + xmlns:converters="clr-namespace:Ursa.Converters;assembly=Ursa"> @@ -30,10 +31,9 @@ Name="{x:Static u:DualBadge.PART_Icon}" Width="14" Height="14" - Margin="2 0 0 0" IsVisible="{TemplateBinding Icon,Converter={x:Static ObjectConverters.IsNotNull}}" Foreground="{TemplateBinding IconForeground}" - Padding="{TemplateBinding Padding}" + Margin="{TemplateBinding Padding, Converter={x:Static converters:ThicknessExcludeConverter.Right}}" Content="{TemplateBinding Icon}" ContentTemplate="{TemplateBinding IconTemplate}" /> @@ -84,7 +84,6 @@ BasedOn="{StaticResource {x:Type u:DualBadge}}" TargetType="u:DualBadge"> - - + \ No newline at end of file diff --git a/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj b/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj index 5bb0d73..88fc18f 100644 --- a/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj +++ b/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj @@ -1,6 +1,6 @@ - + netstandard2.0 @@ -13,11 +13,11 @@ - + - + diff --git a/src/Ursa/Converters/CornerRadiusConverter.cs b/src/Ursa/Converters/CornerRadiusConverter.cs new file mode 100644 index 0000000..a5e041a --- /dev/null +++ b/src/Ursa/Converters/CornerRadiusConverter.cs @@ -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(); + } +} \ No newline at end of file diff --git a/src/Ursa/Converters/ThicknessConverter.cs b/src/Ursa/Converters/ThicknessConverter.cs new file mode 100644 index 0000000..6073cf0 --- /dev/null +++ b/src/Ursa/Converters/ThicknessConverter.cs @@ -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(); + } +} \ No newline at end of file diff --git a/src/Ursa/Ursa.csproj b/src/Ursa/Ursa.csproj index 01a32db..a6c5201 100644 --- a/src/Ursa/Ursa.csproj +++ b/src/Ursa/Ursa.csproj @@ -1,6 +1,6 @@ - + netstandard2.0 @@ -13,7 +13,7 @@ - +