From 1cedc77ce19e1701facd14101dfc7e5b832d1167 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Sun, 11 Aug 2024 19:11:11 +0800 Subject: [PATCH] feat: complete SimpleColorView. --- .../Pages/ColorPickerDemo.axaml | 10 ++- .../Controls/ColorView.axaml | 73 ++++++++++--------- .../Converters/ColorToTextConverter.cs | 33 +++++++++ .../Converters/HsvColorToTextConverter.cs | 35 +++++++++ .../Converters/ToColorModel.cs | 21 ++++++ 5 files changed, 136 insertions(+), 36 deletions(-) create mode 100644 src/Semi.Avalonia.ColorPicker/Converters/ColorToTextConverter.cs create mode 100644 src/Semi.Avalonia.ColorPicker/Converters/HsvColorToTextConverter.cs create mode 100644 src/Semi.Avalonia.ColorPicker/Converters/ToColorModel.cs diff --git a/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml index 1172cd4..ee27171 100644 --- a/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml @@ -6,7 +6,7 @@ xmlns:controls="using:Avalonia.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - d:DesignHeight="450" + d:DesignHeight="1450" d:DesignWidth="800" mc:Ignorable="d"> @@ -18,6 +18,14 @@ + + + diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml index f934c76..d5ba8df 100644 --- a/src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml +++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml @@ -6,6 +6,7 @@ xmlns:globalization="using:System.Globalization" xmlns:pc="using:Avalonia.Controls.Primitives.Converters" xmlns:primitives="using:Avalonia.Controls.Primitives" + xmlns:cvts="clr-namespace:Semi.Avalonia.ColorPicker.Converters" x:CompileBindings="True"> @@ -13,6 +14,9 @@ + + + + - - - - + + + + - - - - + + + - - - - - - - + IsVisible="{TemplateBinding IsAlphaVisible}" + Value="{Binding #ColorSpectrumAlphaSlider.Value}" /> - Rgba + SelectedValue="Hex"> + HexRgba Hsva + @@ -698,6 +701,6 @@ IsAlphaVisible="True" IsAlphaEnabled="True" ColorModel="Hsva" - HsvColor="hsv(120,1,1,30)" /> + HsvColor="hsv(120,7%,90%)" /> diff --git a/src/Semi.Avalonia.ColorPicker/Converters/ColorToTextConverter.cs b/src/Semi.Avalonia.ColorPicker/Converters/ColorToTextConverter.cs new file mode 100644 index 0000000..7e4364c --- /dev/null +++ b/src/Semi.Avalonia.ColorPicker/Converters/ColorToTextConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Globalization; +using System.Linq; +using Avalonia; +using Avalonia.Data; +using Avalonia.Data.Converters; +using Avalonia.Media; + +namespace Semi.Avalonia.ColorPicker.Converters; + +public class ColorToTextConverter : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is Color color ? $"{color.R},{color.G},{color.B}" : AvaloniaProperty.UnsetValue; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is not string str) return BindingOperations.DoNothing; + var parts = str.Split(','); + if (parts.Length != 3 || parts.Any(string.IsNullOrWhiteSpace)) return BindingOperations.DoNothing; + + if (byte.TryParse(parts[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out var r) && + byte.TryParse(parts[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out var g) && + byte.TryParse(parts[2], NumberStyles.Integer, CultureInfo.InvariantCulture, out var b)) + { + return new Color(0xFF, r, g, b); + } + + return BindingOperations.DoNothing; + } +} \ No newline at end of file diff --git a/src/Semi.Avalonia.ColorPicker/Converters/HsvColorToTextConverter.cs b/src/Semi.Avalonia.ColorPicker/Converters/HsvColorToTextConverter.cs new file mode 100644 index 0000000..4fd9a85 --- /dev/null +++ b/src/Semi.Avalonia.ColorPicker/Converters/HsvColorToTextConverter.cs @@ -0,0 +1,35 @@ +using System; +using System.Globalization; +using System.Linq; +using Avalonia; +using Avalonia.Data; +using Avalonia.Data.Converters; +using Avalonia.Media; + +namespace Semi.Avalonia.ColorPicker.Converters; + +public class HsvColorToTextConverter : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is HsvColor hsvColor + ? $"{Math.Round(hsvColor.H)},{Math.Round(hsvColor.S * 100)},{Math.Round(hsvColor.V * 100)}" + : AvaloniaProperty.UnsetValue; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is not string str) return BindingOperations.DoNothing; + var parts = str.Split(','); + if (parts.Length != 3 || parts.Any(string.IsNullOrWhiteSpace)) return BindingOperations.DoNothing; + + if (double.TryParse(parts[0], NumberStyles.Float, CultureInfo.InvariantCulture, out var h) && + double.TryParse(parts[1], NumberStyles.Float, CultureInfo.InvariantCulture, out var s) && + double.TryParse(parts[2], NumberStyles.Float, CultureInfo.InvariantCulture, out var v)) + { + return new HsvColor(1, h, s / 100, v / 100); + } + + return BindingOperations.DoNothing; + } +} \ No newline at end of file diff --git a/src/Semi.Avalonia.ColorPicker/Converters/ToColorModel.cs b/src/Semi.Avalonia.ColorPicker/Converters/ToColorModel.cs new file mode 100644 index 0000000..d7f21a5 --- /dev/null +++ b/src/Semi.Avalonia.ColorPicker/Converters/ToColorModel.cs @@ -0,0 +1,21 @@ +using System; +using System.Globalization; +using Avalonia.Controls; +using Avalonia.Data.Converters; + +namespace Semi.Avalonia.ColorPicker.Converters; + +public class ToColorModel : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return parameter is "Hex" && value is "Hex" || + parameter is "Rgba" && value is ColorModel.Rgba || + parameter is "Hsva" && value is ColorModel.Hsva; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file