using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; using Avalonia.Media; using DesertPaintCodex.Models; using DesertPaintCodex.Services; namespace DesertPaintCodex.Views { public class PaintSwatchView : UserControl { private static readonly SolidColorBrush NoColor = new(); public static readonly DirectProperty ColorProperty = AvaloniaProperty.RegisterDirect( nameof(Color), o => o.Color, (o, v) => o.Color = v); private PaintColor? _color; public PaintColor? Color { get => _color; set => SetAndRaise(ColorProperty, ref _color, value); } public static readonly StyledProperty ShowNameProperty = AvaloniaProperty.Register(nameof(ShowName)); public bool ShowName { get => GetValue(ShowNameProperty); set => SetValue(ShowNameProperty, value); } private readonly Border _colorSwatch; private readonly TextBlock _hexCode; private readonly TextBlock _colorName; public PaintSwatchView() { InitializeComponent(); _colorSwatch = this.FindControl("ColorSwatch"); _hexCode = this.FindControl("HexCode"); _colorName = this.FindControl("ColorName"); ColorProperty.Changed.AddClassHandler((x, _) => x.UpdateColor()); ShowNameProperty.Changed.AddClassHandler((x, _) => x.UpdateColorName()); UpdateColor(); } private void InitializeComponent() { AvaloniaXamlLoader.Load(this); } private void UpdateColor() { UpdateColorSwatch(); UpdateHexCode(); UpdateColorName(); } private void UpdateColorSwatch() { _colorSwatch.Background = Color == null ? NoColor : new SolidColorBrush(new Color(0xFF, Color.Red, Color.Green, Color.Blue)); } private void UpdateHexCode() { _hexCode.Text = Color?.ToHexString() ?? string.Empty; } private void UpdateColorName() { if (!ShowName) { _colorName.IsVisible = false; } else { _colorName.IsVisible = true; _colorName.Text = Color == null ? "[Unknown]" : PaletteService.FindNearest(Color); } } } }