diff options
author | Eric Maupin <ermaup@microsoft.com> | 2018-02-21 01:11:54 +0300 |
---|---|---|
committer | Eric Maupin <ermaup@microsoft.com> | 2018-02-27 21:11:49 +0300 |
commit | 3c2834ff3dc85af9d6d41b996b7c07de0ebe2d85 (patch) | |
tree | 4322cc4e1ddcf1602d5b36e04925e11f4689126c /Xamarin.PropertyEditing.Windows | |
parent | b60c70298654f4f8ed9b3d5cd2846ac8cbaacdfa (diff) |
[Win] Clean up brush selection
This moves brush type logic to the VM, fixes some bugs in selection and
makes material selection set a value for consistency.
Diffstat (limited to 'Xamarin.PropertyEditing.Windows')
5 files changed, 47 insertions, 166 deletions
diff --git a/Xamarin.PropertyEditing.Windows/BrushChoiceTemplateSelector.cs b/Xamarin.PropertyEditing.Windows/BrushChoiceTemplateSelector.cs index 03b591e..29d50a0 100644 --- a/Xamarin.PropertyEditing.Windows/BrushChoiceTemplateSelector.cs +++ b/Xamarin.PropertyEditing.Windows/BrushChoiceTemplateSelector.cs @@ -1,5 +1,9 @@ +using System; +using System.Collections.Generic; using System.Windows; using System.Windows.Controls; +using Xamarin.PropertyEditing.Drawing; +using Xamarin.PropertyEditing.ViewModels; namespace Xamarin.PropertyEditing.Windows { @@ -33,15 +37,19 @@ namespace Xamarin.PropertyEditing.Windows if (item == null) return base.SelectTemplate (item, container); - if (item is ChoiceItem choiceItem) { - var choice = choiceItem.Value as string; - if (choice == BrushTabbedEditorControl.None) return NoBrushTemplate; - if (choice == BrushTabbedEditorControl.Solid) return SolidBrushTemplate; - if (choice == BrushTabbedEditorControl.Resource) return ResourceBrushTemplate; - if (choice == BrushTabbedEditorControl.MaterialDesign) return MaterialDesignBrushTemplate; + if (item is KeyValuePair<string, Type> choiceItem) { + if (choiceItem.Value == null) + return NoBrushTemplate; + if (choiceItem.Value == typeof(CommonSolidBrush)) + return SolidBrushTemplate; + if (choiceItem.Value == typeof(Resource)) + return ResourceBrushTemplate; + if (choiceItem.Value == typeof(MaterialColorScale)) + return MaterialDesignBrushTemplate; } return base.SelectTemplate (item, container); } + } } diff --git a/Xamarin.PropertyEditing.Windows/BrushEditorControl.cs b/Xamarin.PropertyEditing.Windows/BrushEditorControl.cs index 61adbdf..1a72053 100644 --- a/Xamarin.PropertyEditing.Windows/BrushEditorControl.cs +++ b/Xamarin.PropertyEditing.Windows/BrushEditorControl.cs @@ -3,7 +3,6 @@ using System.Linq; using System.Windows; using System.Windows.Controls.Primitives; using System.Windows.Input; -using Xamarin.PropertyEditing.ViewModels; namespace Xamarin.PropertyEditing.Windows { @@ -29,11 +28,9 @@ namespace Xamarin.PropertyEditing.Windows this.brushTabs = this.brushBoxPopup.Child?.GetDescendants<BrushTabbedEditorControl>().FirstOrDefault(); this.brushBoxPopup.PlacementTarget = this.brushBoxButton.FindParent<PropertyPresenter>(); - this.brushBoxPopup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(PlacePopup); + this.brushBoxPopup.CustomPopupPlacementCallback = PlacePopup; this.brushBoxPopup.Opened += (s, e) => { this.brushTabs?.FocusFirstChild (); - // Need to refresh the tabs and their value manually - this.brushTabs?.SelectTabFromBrush (); }; this.brushBoxPopup.Closed += (s, e) => { this.brushBoxButton.Focus (); @@ -56,7 +53,5 @@ namespace Xamarin.PropertyEditing.Windows private ButtonBase brushBoxButton; private Popup brushBoxPopup; private BrushTabbedEditorControl brushTabs; - - private BrushPropertyViewModel ViewModel => DataContext as BrushPropertyViewModel; } } diff --git a/Xamarin.PropertyEditing.Windows/BrushTabbedEditorControl.cs b/Xamarin.PropertyEditing.Windows/BrushTabbedEditorControl.cs index ebd9312..96486d4 100644 --- a/Xamarin.PropertyEditing.Windows/BrushTabbedEditorControl.cs +++ b/Xamarin.PropertyEditing.Windows/BrushTabbedEditorControl.cs @@ -16,7 +16,6 @@ namespace Xamarin.PropertyEditing.Windows public BrushTabbedEditorControl () { DefaultStyleKey = typeof (BrushTabbedEditorControl); - DataContextChanged += OnDataContextChanged; } public override void OnApplyTemplate () @@ -40,37 +39,11 @@ namespace Xamarin.PropertyEditing.Windows if (this.resourceBrushEditor == null) throw new InvalidOperationException ($"{nameof (BrushTabbedEditorControl)} is missing a child ResourceBrushEditorControl named \"resourceBrushEditor\""); - StorePreviousBrush (); - SelectTabFromBrush (); - if (ViewModel.MaterialDesign == null) { this.brushChoice.Items.Filter = o => ((ChoiceItem)o).Name != "materialDesignTab"; } - - this.brushChoice.SelectedItemChanged += (s, e) => { - if (ViewModel == null) return; - StorePreviousBrush (); - switch ((string)((ChoiceItem)(this.brushChoice.SelectedItem)).Value) { - case none: - if (ViewModel.Value != null) ViewModel.Value = null; - break; - case solid: - ViewModel.Value = ViewModel.Solid?.PreviousSolidBrush ?? new CommonSolidBrush (new CommonColor (0, 0, 0)); - ViewModel.Solid.CommitLastColor (); - ViewModel.Solid.CommitHue (); - break; - case resource: - break; - case materialDesign: - ViewModel.Value = ViewModel.Solid?.PreviousSolidBrush ?? new CommonSolidBrush (new CommonColor (0, 0, 0)); - break; - } - ShowSelectedTab (); - }; - + /* this.brushChoice.KeyUp += (s, e) => { - if (ViewModel == null) return; - StorePreviousBrush (); switch (e.Key) { case Key.N: e.Handled = true; @@ -94,24 +67,14 @@ namespace Xamarin.PropertyEditing.Windows break; // TODO: add G, T, etc. for the other brush types when they are available. } - }; + };*/ } - public static readonly string None = none; - public static readonly string Solid = solid; - public static readonly string Resource = resource; - public static readonly string MaterialDesign = materialDesign; - internal void FocusFirstChild () { this.brushChoice?.FocusSelectedItem (); } - private const string none = nameof (none); - private const string solid = nameof (solid); - private const string resource = nameof (resource); - private const string materialDesign = nameof (materialDesign); - private ChoiceControl brushChoice; private Expander advancedPropertyPanel; private SolidBrushEditorControl solidBrushEditor; @@ -119,93 +82,5 @@ namespace Xamarin.PropertyEditing.Windows private MaterialDesignColorEditorControl materialDesignColorEditor; private BrushPropertyViewModel ViewModel => DataContext as BrushPropertyViewModel; - - private void OnDataContextChanged (object sender, DependencyPropertyChangedEventArgs e) - { - if (e.OldValue is INotifyPropertyChanged inpc) { - inpc.PropertyChanged -= OnContextPropertyChanged; - } - - if (e.NewValue is INotifyPropertyChanged newInpc) { - newInpc.PropertyChanged += OnContextPropertyChanged; - } - - SelectTabFromBrush(); - } - - private void OnContextPropertyChanged (object sender, PropertyChangedEventArgs e) - { - SelectTabFromBrush(); - } - - private void StorePreviousBrush () - { - if (ViewModel == null) return; - if (ViewModel.Value is CommonSolidBrush solidBrush) { - ViewModel.Solid.PreviousSolidBrush = solidBrush; - } - } - - internal void SelectTabFromBrush () - { - if (this.brushChoice == null) - return; - - if (ViewModel?.MaterialDesign != null && (ViewModel.MaterialDesign.NormalColor.HasValue || ViewModel.MaterialDesign.AccentColor.HasValue)) { - this.brushChoice.SelectedValue = materialDesign; - } else { - switch (ViewModel?.Value) { - case null: - this.brushChoice.SelectedValue = none; - break; - case CommonSolidBrush _: - switch (ViewModel.ValueSource) { - case ValueSource.Local: - this.brushChoice.SelectedValue = solid; - break; - case ValueSource.Resource: - this.brushChoice.SelectedValue = resource; - break; - default: - this.brushChoice.SelectedValue = solid; - break; - } - - break; - } - } - - ShowSelectedTab (); - } - - private void ShowSelectedTab() - { - switch ((string)((ChoiceItem)(this.brushChoice.SelectedItem)).Value) { - case none: - this.advancedPropertyPanel.Visibility = Visibility.Collapsed; - this.solidBrushEditor.Visibility = Visibility.Collapsed; - this.materialDesignColorEditor.Visibility = Visibility.Collapsed; - this.resourceBrushEditor.Visibility = Visibility.Collapsed; - break; - case solid: - this.advancedPropertyPanel.Visibility = Visibility.Visible; - this.solidBrushEditor.Visibility = Visibility.Visible; - this.materialDesignColorEditor.Visibility = Visibility.Collapsed; - this.resourceBrushEditor.Visibility = Visibility.Collapsed; - break; - case materialDesign: - this.advancedPropertyPanel.Visibility = Visibility.Visible; - this.solidBrushEditor.Visibility = Visibility.Collapsed; - this.materialDesignColorEditor.Visibility = Visibility.Visible; - this.resourceBrushEditor.Visibility = Visibility.Collapsed; - break; - case resource: - this.advancedPropertyPanel.Visibility = Visibility.Collapsed; - this.solidBrushEditor.Visibility = Visibility.Collapsed; - this.materialDesignColorEditor.Visibility = Visibility.Collapsed; - this.resourceBrushEditor.Visibility = Visibility.Visible; - break; - } - } } } diff --git a/Xamarin.PropertyEditing.Windows/PropertyPresenter.cs b/Xamarin.PropertyEditing.Windows/PropertyPresenter.cs index bdebbb7..cb1dc55 100644 --- a/Xamarin.PropertyEditing.Windows/PropertyPresenter.cs +++ b/Xamarin.PropertyEditing.Windows/PropertyPresenter.cs @@ -56,16 +56,6 @@ namespace Xamarin.PropertyEditing.Windows set { SetValue (ShowPropertyButtonProperty, value); } } - protected override Size ArrangeOverride (Size arrangeBounds) - { - return base.ArrangeOverride (arrangeBounds); - } - - protected override Size MeasureOverride (Size constraint) - { - return base.MeasureOverride (constraint); - } - private void OnLoaded (object sender, RoutedEventArgs e) { IsSubProperty = this.FindParentUnless<PropertyPresenter, PropertyEditorPanel>() != null; diff --git a/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml b/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml index 4793645..5345dfd 100644 --- a/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml +++ b/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml @@ -5,6 +5,7 @@ xmlns:options="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" xmlns:vm="clr-namespace:Xamarin.PropertyEditing.ViewModels;assembly=Xamarin.PropertyEditing" xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" + xmlns:core="clr-namespace:Xamarin.PropertyEditing;assembly=Xamarin.PropertyEditing" xmlns:prop="clr-namespace:Xamarin.PropertyEditing.Properties;assembly=Xamarin.PropertyEditing" xmlns:system="clr-namespace:System;assembly=mscorlib"> @@ -562,35 +563,40 @@ </Setter> </Style> + <Style x:Key="BrushChoiceItem" TargetType="RadioButton" BasedOn="{StaticResource ChoiceControlItem}"> + <Setter Property="GroupName" Value="brushChoiceType" /> + <Setter Property="MinHeight" Value="20" /> + <Setter Property="MinWidth" Value="20" /> + <Setter Property="ToolTip" Value="{Binding Key,Mode=OneTime}" /> + <Setter Property="AutomationProperties.Name" Value="{Binding Key,Mode=OneTime}" /> + <Setter Property="AutomationProperties.HelpText" Value="{Binding Key,Mode=OneTime}" /> + </Style> + <local:BrushChoiceTemplateSelector x:Key="BrushChoiceTemplateSelector"> <local:BrushChoiceTemplateSelector.NoBrushTemplate> <DataTemplate> - <RadioButton Style="{DynamicResource ChoiceControlItem}" MinHeight="20" MinWidth="20" - GroupName="{Binding Name,RelativeSource={RelativeSource FindAncestor,AncestorType=local:ChoiceControl},Mode=OneTime}"> + <RadioButton Style="{DynamicResource BrushChoiceItem}"> <ContentControl ContentTemplate="{DynamicResource BrushChoiceNoBrushIcon}"/> </RadioButton> </DataTemplate> </local:BrushChoiceTemplateSelector.NoBrushTemplate> <local:BrushChoiceTemplateSelector.SolidBrushTemplate> <DataTemplate> - <RadioButton Style="{DynamicResource ChoiceControlItem}" MinHeight="20" MinWidth="20" - GroupName="{Binding Name,RelativeSource={RelativeSource FindAncestor,AncestorType=local:ChoiceControl},Mode=OneTime}"> + <RadioButton Style="{DynamicResource BrushChoiceItem}"> <ContentControl ContentTemplate="{DynamicResource BrushChoiceSolidBrushIcon}"/> </RadioButton> </DataTemplate> </local:BrushChoiceTemplateSelector.SolidBrushTemplate> <local:BrushChoiceTemplateSelector.MaterialDesignBrushTemplate> <DataTemplate> - <RadioButton Style="{DynamicResource ChoiceControlItem}" MinHeight="20" MinWidth="20" - GroupName="{Binding Name,RelativeSource={RelativeSource FindAncestor,AncestorType=local:ChoiceControl},Mode=OneTime}"> + <RadioButton Style="{DynamicResource BrushChoiceItem}"> <ContentControl ContentTemplate="{DynamicResource BrushChoiceMaterialDesignIcon}"/> </RadioButton> </DataTemplate> </local:BrushChoiceTemplateSelector.MaterialDesignBrushTemplate> <local:BrushChoiceTemplateSelector.ResourceBrushTemplate> <DataTemplate> - <RadioButton Style="{DynamicResource ChoiceControlItem}" MinHeight="20" MinWidth="20" - GroupName="{Binding Name,RelativeSource={RelativeSource FindAncestor,AncestorType=local:ChoiceControl},Mode=OneTime}"> + <RadioButton Style="{DynamicResource BrushChoiceItem}"> <ContentControl ContentTemplate="{DynamicResource BrushChoiceResourceBrushIcon}"/> </RadioButton> </DataTemplate> @@ -604,15 +610,10 @@ <StackPanel> <Border Padding="8,10,8,4"> <StackPanel> - <local:ChoiceControl x:Name="brushChoice" ItemTemplateSelector="{StaticResource BrushChoiceTemplateSelector}" ItemTemplate="{x:Null}" HorizontalAlignment="Stretch"> - <local:ChoiceItem Value="{x:Static local:BrushTabbedEditorControl.None}" Name="noBrushTab" Tooltip="{x:Static prop:Resources.NoBrush}"/> - <local:ChoiceItem Value="{x:Static local:BrushTabbedEditorControl.Solid}" Name="solidColorTab" Tooltip="{x:Static prop:Resources.SolidBrush}"/> - <local:ChoiceItem Value="{x:Static local:BrushTabbedEditorControl.MaterialDesign}" Name="materialDesignTab" Tooltip="{x:Static prop:Resources.MaterialDesignColorBrush}"/> - <local:ChoiceItem Value="{x:Static local:BrushTabbedEditorControl.Resource}" Name="resourceColorTab" Tooltip="{x:Static prop:Resources.ResourceBrush}"/> - </local:ChoiceControl> - <local:SolidBrushEditorControl x:Name="solidBrushEditor"/> - <local:ResourceBrushEditorControl x:Name="resourceBrushEditor"/> - <local:MaterialDesignColorEditorControl x:Name="materialDesignColorEditor" AccentColor="{Binding MaterialDesign.AccentColor}" NormalColor="{Binding MaterialDesign.NormalColor}" Visibility="Collapsed"/> + <local:ChoiceControl x:Name="brushChoice" SelectedValue="{Binding SelectedBrushType,Mode=TwoWay}" SelectedValuePath="Value" ItemsSource="{Binding BrushTypes,Mode=OneTime}" ItemTemplateSelector="{StaticResource BrushChoiceTemplateSelector}" ItemTemplate="{x:Null}" HorizontalAlignment="Stretch" /> + <local:SolidBrushEditorControl x:Name="solidBrushEditor" Visibility="Collapsed" /> + <local:ResourceBrushEditorControl x:Name="resourceBrushEditor" Visibility="Collapsed" /> + <local:MaterialDesignColorEditorControl x:Name="materialDesignColorEditor" AccentColor="{Binding MaterialDesign.AccentColor}" NormalColor="{Binding MaterialDesign.NormalColor}" Visibility="Collapsed" /> </StackPanel> </Border> <Border Padding="1" Visibility="{Binding TargetPlatform.SupportsBrushOpacity, Mode=OneTime, Converter={StaticResource BoolToVisibilityConverter}}"> @@ -631,10 +632,22 @@ </Expander> </Border> </StackPanel> + <ControlTemplate.Triggers> + <DataTrigger Binding="{Binding SelectedBrushType}" Value="{x:Type drawing:CommonSolidBrush}"> + <Setter TargetName="solidBrushEditor" Property="Visibility" Value="Visible" /> + </DataTrigger> + <DataTrigger Binding="{Binding SelectedBrushType}" Value="{x:Type core:Resource}"> + <Setter TargetName="resourceBrushEditor" Property="Visibility" Value="Visible" /> + </DataTrigger> + <DataTrigger Binding="{Binding SelectedBrushType}" Value="{x:Type vm:MaterialColorScale}"> + <Setter TargetName="materialDesignColorEditor" Property="Visibility" Value="Visible" /> + </DataTrigger> + </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> + <Style TargetType="local:ResourceBrushEditorControl"> <Setter Property="Template"> <Setter.Value> |