76 lines
2.3 KiB
C#
76 lines
2.3 KiB
C#
|
|
// Licensed to the .NET Foundation under one or more agreements.
|
||
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||
|
|
|
||
|
|
using System.ComponentModel;
|
||
|
|
using System.Globalization;
|
||
|
|
using Microsoft.Maui.Graphics;
|
||
|
|
using SkiaSharp;
|
||
|
|
|
||
|
|
namespace Microsoft.Maui.Platform.Linux.Converters;
|
||
|
|
|
||
|
|
public class SKPointTypeConverter : TypeConverter
|
||
|
|
{
|
||
|
|
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
|
||
|
|
{
|
||
|
|
return sourceType == typeof(string) || sourceType == typeof(Point) || base.CanConvertFrom(context, sourceType);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override bool CanConvertTo(ITypeDescriptorContext? context, Type? destinationType)
|
||
|
|
{
|
||
|
|
return destinationType == typeof(string) || destinationType == typeof(Point) || base.CanConvertTo(context, destinationType);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
|
||
|
|
{
|
||
|
|
if (value is Point point)
|
||
|
|
{
|
||
|
|
return new SKPoint((float)point.X, (float)point.Y);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (value is string str)
|
||
|
|
{
|
||
|
|
return ParsePoint(str);
|
||
|
|
}
|
||
|
|
|
||
|
|
return base.ConvertFrom(context, culture, value);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override object? ConvertTo(ITypeDescriptorContext? context, CultureInfo? culture, object? value, Type destinationType)
|
||
|
|
{
|
||
|
|
if (value is SKPoint point)
|
||
|
|
{
|
||
|
|
if (destinationType == typeof(string))
|
||
|
|
{
|
||
|
|
return $"{point.X},{point.Y}";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (destinationType == typeof(Point))
|
||
|
|
{
|
||
|
|
return new Point(point.X, point.Y);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return base.ConvertTo(context, culture, value, destinationType);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static SKPoint ParsePoint(string str)
|
||
|
|
{
|
||
|
|
if (string.IsNullOrWhiteSpace(str))
|
||
|
|
{
|
||
|
|
return SKPoint.Empty;
|
||
|
|
}
|
||
|
|
|
||
|
|
str = str.Trim();
|
||
|
|
var parts = str.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||
|
|
|
||
|
|
if (parts.Length == 2 &&
|
||
|
|
float.TryParse(parts[0], NumberStyles.Float, CultureInfo.InvariantCulture, out var x) &&
|
||
|
|
float.TryParse(parts[1], NumberStyles.Float, CultureInfo.InvariantCulture, out var y))
|
||
|
|
{
|
||
|
|
return new SKPoint(x, y);
|
||
|
|
}
|
||
|
|
|
||
|
|
return SKPoint.Empty;
|
||
|
|
}
|
||
|
|
}
|