From ea9a0ae96bc7a3f6216849afe692b539f8f3bbfb Mon Sep 17 00:00:00 2001 From: Bertrand Le Roy Date: Tue, 31 Oct 2017 14:54:08 -0700 Subject: Move the solid brush editor to a tab, add a tab for no brush, and make the brush editor abstract enough to accommodate for any type of brush in the future --- .../SolidBrushPropertyViewModelTests.cs | 4 +- .../MockedSampleControlButton.cs | 6 +- .../BrushEditorControl.cs | 57 +++++++++++++ .../EditorPropertySelector.cs | 2 +- .../SolidBrushEditorControl.cs | 6 +- .../Themes/Resources.xaml | 28 +++++++ .../Themes/VS.Dark.xaml | 2 + .../Themes/VS.Light.xaml | 2 + .../Xamarin.PropertyEditing.Windows.csproj | 1 + Xamarin.PropertyEditing/BrushPropertyInfo.cs | 39 +++++++++ Xamarin.PropertyEditing/Drawing/CommonBrush.cs | 8 +- .../Drawing/CommonGradientBrush.cs | 7 +- .../Drawing/CommonImageBrush.cs | 2 +- .../Drawing/CommonLinearGradientBrush.cs | 2 +- .../Drawing/CommonRadialGradientBrush.cs | 2 +- .../Drawing/CommonSolidBrush.cs | 2 +- Xamarin.PropertyEditing/Drawing/CommonTileBrush.cs | 7 +- .../Properties/Resources.Designer.cs | 18 +++++ Xamarin.PropertyEditing/Properties/Resources.resx | 8 ++ Xamarin.PropertyEditing/SolidBrushPropertyInfo.cs | 39 --------- .../ViewModels/BrushPropertyViewModel.cs | 84 +++++++++++++++++++ .../ViewModels/PropertiesViewModel.cs | 2 +- .../ViewModels/SolidBrushPropertyViewModel.cs | 93 ---------------------- .../Xamarin.PropertyEditing.csproj | 3 +- 24 files changed, 262 insertions(+), 162 deletions(-) create mode 100644 Xamarin.PropertyEditing.Windows/BrushEditorControl.cs create mode 100644 Xamarin.PropertyEditing/BrushPropertyInfo.cs delete mode 100644 Xamarin.PropertyEditing/SolidBrushPropertyInfo.cs delete mode 100644 Xamarin.PropertyEditing/ViewModels/SolidBrushPropertyViewModel.cs diff --git a/Xamarin.PropertyEditing.Tests/SolidBrushPropertyViewModelTests.cs b/Xamarin.PropertyEditing.Tests/SolidBrushPropertyViewModelTests.cs index ebd4a19..f209c84 100644 --- a/Xamarin.PropertyEditing.Tests/SolidBrushPropertyViewModelTests.cs +++ b/Xamarin.PropertyEditing.Tests/SolidBrushPropertyViewModelTests.cs @@ -12,7 +12,7 @@ namespace Xamarin.PropertyEditing.Tests { protected override CommonBrush GetRandomTestValue (Random rand) { - var color = rand.NextColor(); + CommonColor color = rand.NextColor(); var colorSpace = rand.NextString (); var opacity = rand.NextDouble (); @@ -31,7 +31,7 @@ namespace Xamarin.PropertyEditing.Tests mockProperty.As().SetupGet (pi => pi.ColorSpaces).Returns (SampleColorSpaces); var mockEditor = new Mock (); - var vm = new SolidBrushPropertyViewModel(mockProperty.Object, new[] { mockEditor.Object }); + var vm = new BrushPropertyViewModel(mockProperty.Object, new[] { mockEditor.Object }); Assert.That (vm.ColorSpaces, new CollectionEquivalentConstraint (SampleColorSpaces)); } } diff --git a/Xamarin.PropertyEditing.Windows.Standalone/MockedSampleControlButton.cs b/Xamarin.PropertyEditing.Windows.Standalone/MockedSampleControlButton.cs index 4341af8..b9303ea 100644 --- a/Xamarin.PropertyEditing.Windows.Standalone/MockedSampleControlButton.cs +++ b/Xamarin.PropertyEditing.Windows.Standalone/MockedSampleControlButton.cs @@ -8,10 +8,10 @@ namespace Xamarin.PropertyEditing.Windows.Standalone public MockedSampleControlButton () : base (new MockSampleControl ()) { // TODO: Move the declaration of this property to MockSampleControl once SolidBrush is supported on both platforms. - var brushPropertyInfo = new SolidBrushPropertyInfo ("SolidBrush", "Windows Only", true, + var brushPropertyInfo = new BrushPropertyInfo ("SolidBrush", "Windows Only", true, new[] { "RGB", "sRGB" }); - MockedControl.AddProperty (brushPropertyInfo); - MockedControl.SetValue(brushPropertyInfo, + MockedControl.AddProperty (brushPropertyInfo); + MockedControl.SetValue(brushPropertyInfo, new CommonSolidBrush(20, 120, 220, 240, "sRGB")); } } diff --git a/Xamarin.PropertyEditing.Windows/BrushEditorControl.cs b/Xamarin.PropertyEditing.Windows/BrushEditorControl.cs new file mode 100644 index 0000000..1a0399e --- /dev/null +++ b/Xamarin.PropertyEditing.Windows/BrushEditorControl.cs @@ -0,0 +1,57 @@ +using System.Windows.Controls; +using Xamarin.PropertyEditing.Drawing; +using Xamarin.PropertyEditing.ViewModels; + +namespace Xamarin.PropertyEditing.Windows +{ + public class BrushEditorControl : PropertyEditorControl + { + public BrushEditorControl() + { + DefaultStyleKey = typeof (BrushEditorControl); + } + + BrushPropertyViewModel ViewModel => DataContext as BrushPropertyViewModel; + + TabControl tabs; + TabItem noBrushTab; + TabItem solidColorTab; + + public override void OnApplyTemplate () + { + base.OnApplyTemplate (); + + tabs = GetTemplateChild ("brushTabs") as TabControl; + noBrushTab = GetTemplateChild ("noBrushTab") as TabItem; + solidColorTab = GetTemplateChild ("solidColorTab") as TabItem; + + if (ViewModel.Value == null) { + tabs.SelectedItem = noBrushTab; + } + else if (ViewModel.Value is CommonSolidBrush solidBrush) { + tabs.SelectedItem = solidColorTab; + } + + tabs.SelectionChanged += (s, e) => { + if (ViewModel == null) return; + if (tabs.Items[tabs.SelectedIndex] is TabItem tab) { + StorePreviousBrush (); + if (tab == noBrushTab) { + ViewModel.Value = null; + } + else if (tab == solidColorTab) { + ViewModel.Value = ViewModel.PreviousSolidBrush ?? new CommonSolidBrush (new CommonColor (0, 0, 0)); + } + } + }; + } + + void StorePreviousBrush() + { + if (ViewModel == null) return; + if (ViewModel.Value is CommonSolidBrush solidBrush) { + ViewModel.PreviousSolidBrush = solidBrush; + } + } + } +} diff --git a/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs b/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs index a8ba861..e9b8209 100644 --- a/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs +++ b/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs @@ -106,7 +106,7 @@ namespace Xamarin.PropertyEditing.Windows { typeof(PropertyViewModel), typeof(ThicknessEditorControl) }, { typeof(PropertyViewModel), typeof(ThicknessEditorControl) }, { typeof(PredefinedValuesViewModel<>), typeof(EnumEditorControl) }, - { typeof(SolidBrushPropertyViewModel), typeof(SolidBrushEditorControl) } + { typeof(BrushPropertyViewModel), typeof(BrushEditorControl) }, }; } } diff --git a/Xamarin.PropertyEditing.Windows/SolidBrushEditorControl.cs b/Xamarin.PropertyEditing.Windows/SolidBrushEditorControl.cs index 4ca3403..9190c47 100644 --- a/Xamarin.PropertyEditing.Windows/SolidBrushEditorControl.cs +++ b/Xamarin.PropertyEditing.Windows/SolidBrushEditorControl.cs @@ -15,12 +15,14 @@ namespace Xamarin.PropertyEditing.Windows ComboBox colorSpacePicker; - SolidBrushPropertyViewModel ViewModel => DataContext as SolidBrushPropertyViewModel; + BrushPropertyViewModel ViewModel => DataContext as BrushPropertyViewModel; public override void OnApplyTemplate () { base.OnApplyTemplate (); + if (ViewModel == null) return; + colorSpacePicker = (ComboBox)GetTemplateChild ("colorSpacePicker"); if (ViewModel.ColorSpaces == null || ViewModel.ColorSpaces.Count == 0) { colorSpacePicker.Visibility = Visibility.Collapsed; @@ -30,7 +32,7 @@ namespace Xamarin.PropertyEditing.Windows // Handle color space changes colorSpacePicker.SelectionChanged += (s, e) => { if (ViewModel != null && ViewModel.Value != null) { - ViewModel.Value = new CommonSolidBrush (ViewModel.Value.Color, (string)e.AddedItems[0]); + ViewModel.Value = new CommonSolidBrush (ViewModel.Color, (string)e.AddedItems[0]); } }; } diff --git a/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml b/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml index 558c2a2..b1d2e7c 100644 --- a/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml +++ b/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml @@ -326,6 +326,34 @@ + +