From f10d028558877e2077a438cde693c28492cf6aa5 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Wed, 9 Oct 2024 11:59:23 +0100 Subject: [PATCH] ContentColorPicker WIP --- .../ContentColorPicker.axaml | 33 +++++++++ .../ContentColorPicker/ContentColorPicker.cs | 73 +++++++++++++++++++ .../Themes/ControlResources.axaml | 5 +- 3 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 Toolkit.UI.Controls.Avalonia/ContentColorPicker/ContentColorPicker.axaml create mode 100644 Toolkit.UI.Controls.Avalonia/ContentColorPicker/ContentColorPicker.cs diff --git a/Toolkit.UI.Controls.Avalonia/ContentColorPicker/ContentColorPicker.axaml b/Toolkit.UI.Controls.Avalonia/ContentColorPicker/ContentColorPicker.axaml new file mode 100644 index 0000000..6b893da --- /dev/null +++ b/Toolkit.UI.Controls.Avalonia/ContentColorPicker/ContentColorPicker.axaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/Toolkit.UI.Controls.Avalonia/ContentColorPicker/ContentColorPicker.cs b/Toolkit.UI.Controls.Avalonia/ContentColorPicker/ContentColorPicker.cs new file mode 100644 index 0000000..4084e47 --- /dev/null +++ b/Toolkit.UI.Controls.Avalonia/ContentColorPicker/ContentColorPicker.cs @@ -0,0 +1,73 @@ +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Input; + +namespace Toolkit.UI.Controls.Avalonia; + +public class ContentColorPicker : ContentControl +{ + private Canvas? canvas; + private Border? preview; + + protected override void OnApplyTemplate(TemplateAppliedEventArgs args) + { + base.OnApplyTemplate(args); + + canvas = args.NameScope.Find("Canvas"); + + if (canvas is not null) + { + canvas.PointerMoved += OnPointerMoved; + canvas.PointerExited += OnPointerExited; + canvas.PointerEntered += OnPointerEntered; + } + + preview = args.NameScope.Find("Preview"); + } + + private void OnPointerMoved(object? sender, + PointerEventArgs args) + { + if (canvas is null || preview is null) + { + return; + } + + double relativeX = args.GetPosition(canvas).X; + double relativeY = args.GetPosition(canvas).Y; + + double newX = relativeX < 0 ? 0 : (relativeX > canvas.Bounds.Width ? canvas.Bounds.Width : relativeX); + double newY = relativeY < 0 ? 0 : (relativeY > canvas.Bounds.Height ? canvas.Bounds.Height : relativeY); + + if (newX < 0 || newX > canvas.Bounds.Width || newY < 0 || newY > canvas.Bounds.Height) + { + preview.IsVisible = false; + return; + } + + Canvas.SetLeft(preview, newX); + Canvas.SetTop(preview, newY); + } + + private void OnPointerEntered(object? sender, + PointerEventArgs args) + { + if (preview is null) + { + return; + } + + preview.IsVisible = true; + } + + private void OnPointerExited(object? sender, + PointerEventArgs args) + { + if (preview is null) + { + return; + } + + preview.IsVisible = false; + } +} diff --git a/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml b/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml index b569b2c..9714575 100644 --- a/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml +++ b/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml @@ -35,7 +35,6 @@ - - - @@ -72,7 +69,7 @@ - +