ColorPickerButton.xaml.cs
1 // Copyright (c) Microsoft Corporation 2 // The Microsoft Corporation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Collections.ObjectModel; 6 using ManagedCommon; 7 using Microsoft.UI; 8 using Microsoft.UI.Xaml; 9 using Microsoft.UI.Xaml.Controls; 10 using Windows.UI; 11 12 namespace Microsoft.CmdPal.UI.Controls; 13 14 public sealed partial class ColorPickerButton : UserControl 15 { 16 public static readonly DependencyProperty PaletteColorsProperty = DependencyProperty.Register(nameof(PaletteColors), typeof(ObservableCollection<Color>), typeof(ColorPickerButton), new PropertyMetadata(new ObservableCollection<Color>()))!; 17 18 public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register(nameof(SelectedColor), typeof(Color), typeof(ColorPickerButton), new PropertyMetadata(Colors.Black))!; 19 20 public static readonly DependencyProperty IsAlphaEnabledProperty = DependencyProperty.Register(nameof(IsAlphaEnabled), typeof(bool), typeof(ColorPickerButton), new PropertyMetadata(defaultValue: false))!; 21 22 public static readonly DependencyProperty IsValueEditorEnabledProperty = DependencyProperty.Register(nameof(IsValueEditorEnabled), typeof(bool), typeof(ColorPickerButton), new PropertyMetadata(false))!; 23 24 public static readonly DependencyProperty HasSelectedColorProperty = DependencyProperty.Register(nameof(HasSelectedColor), typeof(bool), typeof(ColorPickerButton), new PropertyMetadata(false))!; 25 26 private Color _selectedColor; 27 28 public Color SelectedColor 29 { 30 get 31 { 32 return _selectedColor; 33 } 34 35 set 36 { 37 if (_selectedColor != value) 38 { 39 _selectedColor = value; 40 SetValue(SelectedColorProperty, value); 41 HasSelectedColor = true; 42 } 43 } 44 } 45 46 public bool HasSelectedColor 47 { 48 get { return (bool)GetValue(HasSelectedColorProperty); } 49 set { SetValue(HasSelectedColorProperty, value); } 50 } 51 52 public bool IsAlphaEnabled 53 { 54 get => (bool)GetValue(IsAlphaEnabledProperty); 55 set => SetValue(IsAlphaEnabledProperty, value); 56 } 57 58 public bool IsValueEditorEnabled 59 { 60 get { return (bool)GetValue(IsValueEditorEnabledProperty); } 61 set { SetValue(IsValueEditorEnabledProperty, value); } 62 } 63 64 public ObservableCollection<Color> PaletteColors 65 { 66 get { return (ObservableCollection<Color>)GetValue(PaletteColorsProperty); } 67 set { SetValue(PaletteColorsProperty, value); } 68 } 69 70 public ColorPickerButton() 71 { 72 this.InitializeComponent(); 73 74 IsEnabledChanged -= ColorPickerButton_IsEnabledChanged; 75 SetEnabledState(); 76 IsEnabledChanged += ColorPickerButton_IsEnabledChanged; 77 } 78 79 private void ColorPickerButton_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 80 { 81 SetEnabledState(); 82 } 83 84 private void SetEnabledState() 85 { 86 if (this.IsEnabled) 87 { 88 ColorPreviewBorder.Opacity = 1; 89 } 90 else 91 { 92 ColorPreviewBorder.Opacity = 0.2; 93 } 94 } 95 96 private void ColorPalette_OnSelectedColorChanged(object? sender, Color? e) 97 { 98 if (e.HasValue) 99 { 100 HasSelectedColor = true; 101 SelectedColor = e.Value; 102 } 103 } 104 105 private void FlyoutBase_OnOpened(object? sender, object e) 106 { 107 if (sender is not Flyout flyout || (flyout.Content as FrameworkElement)?.Parent is not FlyoutPresenter flyoutPresenter) 108 { 109 return; 110 } 111 112 FlyoutRoot!.UpdateLayout(); 113 flyoutPresenter.UpdateLayout(); 114 115 // Logger.LogInfo($"FlyoutBase_OnOpened: {flyoutPresenter}, {FlyoutRoot!.ActualWidth}"); 116 flyoutPresenter.MaxWidth = FlyoutRoot!.ActualWidth; 117 flyoutPresenter.MinWidth = 660; 118 flyoutPresenter.Width = FlyoutRoot!.ActualWidth; 119 } 120 121 private void FlyoutRoot_OnSizeChanged(object sender, SizeChangedEventArgs e) 122 { 123 if ((ColorPickerFlyout!.Content as FrameworkElement)?.Parent is not FlyoutPresenter flyoutPresenter) 124 { 125 return; 126 } 127 128 FlyoutRoot!.UpdateLayout(); 129 flyoutPresenter.UpdateLayout(); 130 131 flyoutPresenter.MaxWidth = FlyoutRoot!.ActualWidth; 132 flyoutPresenter.MinWidth = 660; 133 flyoutPresenter.Width = FlyoutRoot!.ActualWidth; 134 } 135 136 private Thickness ToDropDownPadding(bool hasColor) 137 { 138 return hasColor ? new Thickness(3, 3, 8, 3) : new Thickness(8, 4, 8, 4); 139 } 140 141 private void ResetButton_Click(object sender, RoutedEventArgs e) 142 { 143 HasSelectedColor = false; 144 ColorPickerFlyout?.Hide(); 145 } 146 }