/ src / modules / cmdpal / Microsoft.CmdPal.UI / Controls / ColorPickerButton.xaml.cs
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  }