Skip to content

Commit

Permalink
feat(converter): Added CornerRadiusFilterConvert & CornerRadiusToThic…
Browse files Browse the repository at this point in the history
…knessConverter

Those 2 converters are part of WinUI.
  • Loading branch information
carldebilly committed Jun 16, 2020
1 parent da8eb9f commit 3427e7a
Show file tree
Hide file tree
Showing 5 changed files with 194 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Microsoft.UI.Xaml.Controls.Primitives
{
public enum CornerRadiusFilterKind
{
None,
Top,
Right,
Bottom,
Left,
TopLeftValue,
BottomRightValue
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Microsoft.UI.Xaml.Controls.Primitives
{
public enum CornerRadiusToThicknessConverterKind
{
FilterTopAndBottomFromLeft,
FilterTopAndBottomFromRight,
FilterLeftAndRightFromTop,
FilterLeftAndRightFromBottom,
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<!-- Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT License. See LICENSE in the project root for license information. -->
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:primitives="using:Microsoft.UI.Xaml.Controls.Primitives">
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
<CornerRadius x:Key="ControlCornerRadius">2,2,2,2</CornerRadius>
<CornerRadius x:Key="OverlayCornerRadius">4,4,4,4</CornerRadius>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<CornerRadius x:Key="ControlCornerRadius">2,2,2,2</CornerRadius>
<CornerRadius x:Key="OverlayCornerRadius">4,4,4,4</CornerRadius>
</ResourceDictionary>
<ResourceDictionary x:Key="Light">
<CornerRadius x:Key="ControlCornerRadius">2,2,2,2</CornerRadius>
<CornerRadius x:Key="OverlayCornerRadius">4,4,4,4</CornerRadius>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>

<primitives:CornerRadiusFilterConverter x:Key="TopCornerRadiusFilterConverter" Filter="Top"/>
<primitives:CornerRadiusFilterConverter x:Key="RightCornerRadiusFilterConverter" Filter="Right"/>
<primitives:CornerRadiusFilterConverter x:Key="BottomCornerRadiusFilterConverter" Filter="Bottom"/>
<primitives:CornerRadiusFilterConverter x:Key="LeftCornerRadiusFilterConverter" Filter="Left"/>
<primitives:CornerRadiusFilterConverter x:Key="TopLeftCornerRadiusDoubleValueConverter" Filter="TopLeftValue"/>
<primitives:CornerRadiusFilterConverter x:Key="BottomRightCornerRadiusDoubleValueConverter" Filter="BottomRightValue"/>


<primitives:CornerRadiusToThicknessConverter x:Key="TopThicknessFilterConverter" ConversionKind="FilterLeftAndRightFromTop"/>
<primitives:CornerRadiusToThicknessConverter x:Key="BottomThicknessFilterConverter" ConversionKind="FilterLeftAndRightFromBottom"/>
<primitives:CornerRadiusToThicknessConverter x:Key="LeftThicknessFilterConverter" ConversionKind="FilterTopAndBottomFromLeft"/>
<primitives:CornerRadiusToThicknessConverter x:Key="RightThicknessFilterConverter" ConversionKind="FilterTopAndBottomFromRight"/>

</ResourceDictionary>

0 comments on commit 3427e7a

Please sign in to comment.