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