diff --git a/GSS2.UI.Core/Converters/EqualsConverter.cs b/GSS2.UI.Core/Converters/EqualsConverter.cs new file mode 100644 index 0000000..e14e961 --- /dev/null +++ b/GSS2.UI.Core/Converters/EqualsConverter.cs @@ -0,0 +1,46 @@ +using System.Globalization; + +using Avalonia.Data.Converters; + +namespace GSS2.UI.Core.Converters; + +public class EqualsConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is null && parameter is null) + return true; + + if (value is null || parameter is null) + return false; + + var valueType = value.GetType(); + var paramType = parameter.GetType(); + + if (valueType == paramType) + return value == parameter; + + if (parameter is string ps) + return value switch + { + byte v => byte.TryParse(ps, out var p) && v == p, + short v => short.TryParse(ps, out var p) && v == p, + ushort v => ushort.TryParse(ps, out var p) && v == p, + int v => int.TryParse(ps, out var p) && v == p, + uint v => uint.TryParse(ps, out var p) && v == p, + long v => long.TryParse(ps, out var p) && v == p, + ulong v => ulong.TryParse(ps, out var p) && v == p, + float v => float.TryParse(ps, out var p) && v == p, + double v => double.TryParse(ps, out var p) && v == p, + decimal v => decimal.TryParse(ps, out var p) && v == p, + _ => false + }; + + return false; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/GSS2.UI.Core/Converters/GreaterThenConverter.cs b/GSS2.UI.Core/Converters/GreaterThenConverter.cs new file mode 100644 index 0000000..e96824c --- /dev/null +++ b/GSS2.UI.Core/Converters/GreaterThenConverter.cs @@ -0,0 +1,58 @@ +using System.Globalization; + +using Avalonia.Data.Converters; + +namespace GSS2.UI.Core.Converters; + +public class GreaterThanConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is null && parameter is null) + return true; + + if (value is null || parameter is null) + return false; + + var valueType = value.GetType(); + var paramType = parameter.GetType(); + + if (valueType == paramType) + { + var greaterThan = valueType.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name.EndsWith("op_GreaterThan")); + if (greaterThan is not null) + { + try + { + return greaterThan.Invoke(null, [value, parameter]); + } + catch + { } + } + } + + if (parameter is string ps) + return value switch + { + byte v => byte.TryParse(ps, out var p) && v > p, + short v => short.TryParse(ps, out var p) && v > p, + ushort v => ushort.TryParse(ps, out var p) && v > p, + int v => int.TryParse(ps, out var p) && v > p, + uint v => uint.TryParse(ps, out var p) && v > p, + long v => long.TryParse(ps, out var p) && v > p, + ulong v => ulong.TryParse(ps, out var p) && v > p, + float v => float.TryParse(ps, out var p) && v > p, + double v => double.TryParse(ps, out var p) && v > p, + decimal v => decimal.TryParse(ps, out var p) && v > p, + _ => false + }; + + return false; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/GSS2.UI.Core/Converters/GreaterThenOrEqualConverter.cs b/GSS2.UI.Core/Converters/GreaterThenOrEqualConverter.cs new file mode 100644 index 0000000..f6e75ae --- /dev/null +++ b/GSS2.UI.Core/Converters/GreaterThenOrEqualConverter.cs @@ -0,0 +1,58 @@ +using System.Globalization; + +using Avalonia.Data.Converters; + +namespace GSS2.UI.Core.Converters; + +public class GreaterThenOrEqualConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is null && parameter is null) + return true; + + if (value is null || parameter is null) + return false; + + var valueType = value.GetType(); + var paramType = parameter.GetType(); + + if (valueType == paramType) + { + var greaterThanOrEqual = valueType.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name.EndsWith("op_GreaterThanOrEqual")); + if (greaterThanOrEqual is not null) + { + try + { + return greaterThanOrEqual.Invoke(null, [value, parameter]); + } + catch + { } + } + } + + if (parameter is string ps) + return value switch + { + byte v => byte.TryParse(ps, out var p) && v >= p, + short v => short.TryParse(ps, out var p) && v >= p, + ushort v => ushort.TryParse(ps, out var p) && v >= p, + int v => int.TryParse(ps, out var p) && v >= p, + uint v => uint.TryParse(ps, out var p) && v >= p, + long v => long.TryParse(ps, out var p) && v >= p, + ulong v => ulong.TryParse(ps, out var p) && v >= p, + float v => float.TryParse(ps, out var p) && v >= p, + double v => double.TryParse(ps, out var p) && v >= p, + decimal v => decimal.TryParse(ps, out var p) && v >= p, + _ => false + }; + + return false; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/GSS2.UI.Core/Converters/LessThenConverter.cs b/GSS2.UI.Core/Converters/LessThenConverter.cs new file mode 100644 index 0000000..243890e --- /dev/null +++ b/GSS2.UI.Core/Converters/LessThenConverter.cs @@ -0,0 +1,58 @@ +using System.Globalization; + +using Avalonia.Data.Converters; + +namespace GSS2.UI.Core.Converters; + +public class LessThenConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is null && parameter is null) + return true; + + if (value is null || parameter is null) + return false; + + var valueType = value.GetType(); + var paramType = parameter.GetType(); + + if (valueType == paramType) + { + var lessThan = valueType.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name.EndsWith("op_LessThan")); + if (lessThan is not null) + { + try + { + return lessThan.Invoke(null, [value, parameter]); + } + catch + { } + } + } + + if (parameter is string ps) + return value switch + { + byte v => byte.TryParse(ps, out var p) && v < p, + short v => short.TryParse(ps, out var p) && v < p, + ushort v => ushort.TryParse(ps, out var p) && v < p, + int v => int.TryParse(ps, out var p) && v < p, + uint v => uint.TryParse(ps, out var p) && v < p, + long v => long.TryParse(ps, out var p) && v < p, + ulong v => ulong.TryParse(ps, out var p) && v < p, + float v => float.TryParse(ps, out var p) && v < p, + double v => double.TryParse(ps, out var p) && v < p, + decimal v => decimal.TryParse(ps, out var p) && v < p, + _ => false + }; + + return false; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/GSS2.UI.Core/Converters/LessThenOrEqualConverter.cs b/GSS2.UI.Core/Converters/LessThenOrEqualConverter.cs new file mode 100644 index 0000000..51f6721 --- /dev/null +++ b/GSS2.UI.Core/Converters/LessThenOrEqualConverter.cs @@ -0,0 +1,58 @@ +using System.Globalization; + +using Avalonia.Data.Converters; + +namespace GSS2.UI.Core.Converters; + +public class LessThenOrEqualConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is null && parameter is null) + return true; + + if (value is null || parameter is null) + return false; + + var valueType = value.GetType(); + var paramType = parameter.GetType(); + + if (valueType == paramType) + { + var lessThanOrEqual = valueType.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name.EndsWith("op_LessThanOrEqual")); + if (lessThanOrEqual is not null) + { + try + { + return lessThanOrEqual.Invoke(null, [value, parameter]); + } + catch + { } + } + } + + if (parameter is string ps) + return value switch + { + byte v => byte.TryParse(ps, out var p) && v <= p, + short v => short.TryParse(ps, out var p) && v <= p, + ushort v => ushort.TryParse(ps, out var p) && v <= p, + int v => int.TryParse(ps, out var p) && v <= p, + uint v => uint.TryParse(ps, out var p) && v <= p, + long v => long.TryParse(ps, out var p) && v <= p, + ulong v => ulong.TryParse(ps, out var p) && v <= p, + float v => float.TryParse(ps, out var p) && v <= p, + double v => double.TryParse(ps, out var p) && v <= p, + decimal v => decimal.TryParse(ps, out var p) && v <= p, + _ => false + }; + + return false; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/GSS2.UI.Core/Converters/NotEqualsConverter.cs b/GSS2.UI.Core/Converters/NotEqualsConverter.cs new file mode 100644 index 0000000..154ecfe --- /dev/null +++ b/GSS2.UI.Core/Converters/NotEqualsConverter.cs @@ -0,0 +1,46 @@ +using System.Globalization; + +using Avalonia.Data.Converters; + +namespace GSS2.UI.Core.Converters; + +public class NotEqualsConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is null && parameter is null) + return false; + + if (value is null || parameter is null) + return true; + + var valueType = value.GetType(); + var paramType = parameter.GetType(); + + if (valueType == paramType) + return value != parameter; + + if (parameter is string ps) + return value switch + { + byte v => !(byte.TryParse(ps, out var p) && v == p), + short v => !(short.TryParse(ps, out var p) && v == p), + ushort v => !(ushort.TryParse(ps, out var p) && v == p), + int v => !(int.TryParse(ps, out var p) && v == p), + uint v => !(uint.TryParse(ps, out var p) && v == p), + long v => !(long.TryParse(ps, out var p) && v == p), + ulong v => !(ulong.TryParse(ps, out var p) && v == p), + float v => !(float.TryParse(ps, out var p) && v == p), + double v => !(double.TryParse(ps, out var p) && v == p), + decimal v => !(decimal.TryParse(ps, out var p) && v == p), + _ => true + }; + + return true; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file