Files

103 lines
4.7 KiB
C#
Raw Permalink Normal View History

using System;
using System.ComponentModel;
using System.Globalization;
using PCL.Core.UI.Animation.Easings;
namespace PCL.Core.UI.Converters;
public class EasingConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) =>
sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
public override bool CanConvertTo(ITypeDescriptorContext? context, Type? destinationType) =>
destinationType == typeof(string) || base.CanConvertTo(context, destinationType);
public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
{
if (value is string s)
{
return s switch
{
"BackEaseIn" => new BackEaseIn(),
"BackEaseOut" => new BackEaseOut(),
"BackEaseInOut" => new BackEaseInOut(),
"BounceEaseIn" => new BounceEaseIn(),
"BounceEaseOut" => new BounceEaseOut(),
"BounceEaseInOut" => new BounceEaseInOut(),
"CircularEaseIn" => new CircularEaseIn(),
"CircularEaseOut" => new CircularEaseOut(),
"CircularEaseInOut" => new CircularEaseInOut(),
"CubicEaseIn" => new CubicEaseIn(),
"CubicEaseOut" => new CubicEaseOut(),
"CubicEaseInOut" => new CubicEaseInOut(),
"ElasticEaseIn" => new ElasticEaseIn(),
"ElasticEaseOut" => new ElasticEaseOut(),
"ElasticEaseInOut" => new ElasticEaseInOut(),
"ExponentialEaseIn" => new ExponentialEaseIn(),
"ExponentialEaseOut" => new ExponentialEaseOut(),
"ExponentialEaseInOut" => new ExponentialEaseInOut(),
"LinearEasing" => new LinearEasing(),
"QuadEaseIn" => new QuadEaseIn(),
"QuadEaseOut" => new QuadEaseOut(),
"QuadEaseInOut" => new QuadEaseInOut(),
"QuarticEaseIn" => new QuarticEaseIn(),
"QuarticEaseOut" => new QuarticEaseOut(),
"QuarticEaseInOut" => new QuarticEaseInOut(),
"QuinticEaseIn" => new QuinticEaseIn(),
"QuinticEaseOut" => new QuinticEaseOut(),
"QuinticEaseInOut" => new QuinticEaseInOut(),
"SineEaseIn" => new SineEaseIn(),
"SineEaseOut" => new SineEaseOut(),
"SineEaseInOut" => new SineEaseInOut(),
_ => throw new NotSupportedException($"不支持的缓动: {s}")
};
}
return base.ConvertFrom(context, culture, value);
}
public override object? ConvertTo(ITypeDescriptorContext? context, CultureInfo? culture, object? value, Type destinationType)
{
if (destinationType == typeof(string) && value is IEasing easing)
{
return easing switch
{
BackEaseIn => "BackEaseIn",
BackEaseOut => "BackEaseOut",
BackEaseInOut => "BackEaseInOut",
BounceEaseIn => "BounceEaseIn",
BounceEaseOut => "BounceEaseOut",
BounceEaseInOut => "BounceEaseInOut",
CircularEaseIn => "CircularEaseIn",
CircularEaseOut => "CircularEaseOut",
CircularEaseInOut => "CircularEaseInOut",
CubicEaseIn => "CubicEaseIn",
CubicEaseOut => "CubicEaseOut",
CubicEaseInOut => "CubicEaseInOut",
ElasticEaseIn => "ElasticEaseIn",
ElasticEaseOut => "ElasticEaseOut",
ElasticEaseInOut => "ElasticEaseInOut",
ExponentialEaseIn => "ExponentialEaseIn",
ExponentialEaseOut => "ExponentialEaseOut",
ExponentialEaseInOut => "ExponentialEaseInOut",
LinearEasing => "LinearEasing",
QuadEaseIn => "QuadEaseIn",
QuadEaseOut => "QuadEaseOut",
QuadEaseInOut => "QuadEaseInOut",
QuarticEaseIn => "QuarticEaseIn",
QuarticEaseOut => "QuarticEaseOut",
QuarticEaseInOut => "QuarticEaseInOut",
QuinticEaseIn => "QuinticEaseIn",
QuinticEaseOut => "QuinticEaseOut",
QuinticEaseInOut => "QuinticEaseInOut",
SineEaseIn => "SineEaseIn",
SineEaseOut => "SineEaseOut",
SineEaseInOut => "SineEaseInOut",
_ => throw new NotSupportedException($"不支持的缓动: {easing.GetType().Name}")
};
}
return base.ConvertTo(context, culture, value, destinationType);
}
}