From 3427e7a8095f0176232bcffd80c5877d106099f1 Mon Sep 17 00:00:00 2001 From: Carl de Billy Date: Wed, 29 Apr 2020 16:20:42 -0400 Subject: [PATCH] feat(converter): Added CornerRadiusFilterConvert & CornerRadiusToThicknessConverter Those 2 converters are part of WinUI. --- .../Primitives/CornerRadiusFilterConverter.cs | 78 +++++++++++++++++++ .../Primitives/CornerRadiusFilterKind.cs | 13 ++++ .../CornerRadiusToThicknessConverter.cs | 59 ++++++++++++++ .../CornerRadiusToThicknessConverterKind.cs | 10 +++ .../CornerRadius_themeresources.xaml | 34 ++++++++ 5 files changed, 194 insertions(+) create mode 100644 src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusFilterConverter.cs create mode 100644 src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusFilterKind.cs create mode 100644 src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusToThicknessConverter.cs create mode 100644 src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusToThicknessConverterKind.cs create mode 100644 src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadius_themeresources.xaml diff --git a/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusFilterConverter.cs b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusFilterConverter.cs new file mode 100644 index 000000000000..29269f662fb4 --- /dev/null +++ b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusFilterConverter.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace Microsoft.UI.Xaml.Controls.Primitives +{ + public partial class CornerRadiusFilterConverter : DependencyObject, IValueConverter + { + public static readonly DependencyProperty FilterProperty = DependencyProperty.Register( + "Filter", typeof(CornerRadiusFilterKind), typeof(CornerRadiusFilterConverter), new PropertyMetadata(CornerRadiusFilterKind.None)); + + public CornerRadiusFilterKind Filter + { + get { return (CornerRadiusFilterKind)GetValue(FilterProperty); } + set { SetValue(FilterProperty, value); } + } + + + private static CornerRadius Convert(CornerRadius radius, CornerRadiusFilterKind filterKind) + { + var result = radius; + + switch (filterKind) + { + case CornerRadiusFilterKind.Top: + result.BottomLeft = 0; + result.BottomRight = 0; + break; + case CornerRadiusFilterKind.Right: + result.TopLeft = 0; + result.BottomLeft = 0; + break; + case CornerRadiusFilterKind.Bottom: + result.TopLeft = 0; + result.TopRight = 0; + break; + case CornerRadiusFilterKind.Left: + result.TopRight = 0; + result.BottomRight = 0; + break; + } + + return result; + } + + private static double GetDoubleValue(CornerRadius radius, CornerRadiusFilterKind filterKind) + => + filterKind switch + { + CornerRadiusFilterKind.TopLeftValue => radius.TopLeft, + CornerRadiusFilterKind.BottomRightValue => radius.BottomRight, + _ => 0d + }; + + public object Convert(object value, Type targetType, object parameter, string language) + { + var filter = Filter; + + if (value is CornerRadius cornerRadius) + { + if (filter == CornerRadiusFilterKind.TopLeftValue || filter == CornerRadiusFilterKind.BottomRightValue) + { + return GetDoubleValue(cornerRadius, filter); + } + return Convert(cornerRadius, filter); + } + + return null; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotSupportedException(); + } + } +} diff --git a/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusFilterKind.cs b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusFilterKind.cs new file mode 100644 index 000000000000..9ac7673ebf3e --- /dev/null +++ b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusFilterKind.cs @@ -0,0 +1,13 @@ +namespace Microsoft.UI.Xaml.Controls.Primitives +{ + public enum CornerRadiusFilterKind + { + None, + Top, + Right, + Bottom, + Left, + TopLeftValue, + BottomRightValue + } +} diff --git a/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusToThicknessConverter.cs b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusToThicknessConverter.cs new file mode 100644 index 000000000000..6ecdf7d925df --- /dev/null +++ b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusToThicknessConverter.cs @@ -0,0 +1,59 @@ +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace Microsoft.UI.Xaml.Controls.Primitives +{ + public partial class CornerRadiusToThicknessConverter: DependencyObject, IValueConverter + { + public static readonly DependencyProperty ConversionKindProperty = DependencyProperty.Register( + "ConversionKind", typeof(CornerRadiusToThicknessConverterKind), typeof(CornerRadiusToThicknessConverter), new PropertyMetadata(CornerRadiusToThicknessConverterKind.FilterLeftAndRightFromTop)); + + public CornerRadiusToThicknessConverterKind ConversionKind + { + get => (CornerRadiusToThicknessConverterKind)GetValue(ConversionKindProperty); + set => SetValue(ConversionKindProperty, value); + } + + private object Convert(CornerRadius radius, CornerRadiusToThicknessConverterKind filterKind) + { + var result = new Thickness{ }; + + switch (filterKind) + { + case CornerRadiusToThicknessConverterKind.FilterLeftAndRightFromTop: + result.Left = radius.TopLeft; + result.Right = radius.TopRight; + result.Top = 0; + result.Bottom = 0; + break; + case CornerRadiusToThicknessConverterKind.FilterLeftAndRightFromBottom: + result.Left = radius.BottomLeft; + result.Right = radius.BottomRight; + result.Top = 0; + result.Bottom = 0; + break; + case CornerRadiusToThicknessConverterKind.FilterTopAndBottomFromLeft: + result.Left = 0; + result.Right = 0; + result.Top = radius.TopLeft; + result.Bottom = radius.BottomLeft; + break; + case CornerRadiusToThicknessConverterKind.FilterTopAndBottomFromRight: + result.Left = 0; + result.Right = 0; + result.Top = radius.TopRight; + result.Bottom = radius.BottomRight; + break; + } + + return result; + } + + public object Convert(object value, Type targetType, object parameter, string language) + => value is CornerRadius radius ? Convert(radius, ConversionKind) : null; + + public object ConvertBack(object value, Type targetType, object parameter, string language) + => throw new NotSupportedException(); + } +} diff --git a/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusToThicknessConverterKind.cs b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusToThicknessConverterKind.cs new file mode 100644 index 000000000000..ccc3b338ee9d --- /dev/null +++ b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadiusToThicknessConverterKind.cs @@ -0,0 +1,10 @@ +namespace Microsoft.UI.Xaml.Controls.Primitives +{ + public enum CornerRadiusToThicknessConverterKind + { + FilterTopAndBottomFromLeft, + FilterTopAndBottomFromRight, + FilterLeftAndRightFromTop, + FilterLeftAndRightFromBottom, + }; +} diff --git a/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadius_themeresources.xaml b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadius_themeresources.xaml new file mode 100644 index 000000000000..abf0238d974f --- /dev/null +++ b/src/Uno.UI/Microsoft/UI/Xaml/Controls/Primitives/CornerRadius_themeresources.xaml @@ -0,0 +1,34 @@ + + + + + 2,2,2,2 + 4,4,4,4 + + + 2,2,2,2 + 4,4,4,4 + + + 2,2,2,2 + 4,4,4,4 + + + + + + + + + + + + + + + + +