Browse Source

Add style snapshotting and context menus to copy property values.

Dariusz Komosinski 4 years ago
parent
commit
161b9374a5

+ 26 - 6
src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs

@@ -20,6 +20,7 @@ namespace Avalonia.Diagnostics.ViewModels
         private readonly IDictionary<object, List<PropertyViewModel>> _propertyIndex;
         private AvaloniaPropertyViewModel _selectedProperty;
         private string _styleFilter;
+        private bool _snapshotStyles;
 
         public ControlDetailsViewModel(TreePageViewModel treePage, IVisual control)
         {
@@ -53,7 +54,7 @@ namespace Avalonia.Diagnostics.ViewModels
             }
 
             AppliedStyles = new ObservableCollection<StyleViewModel>();
-            PseudoClasses = new ObservableCollection<PseudoClassesViewModel>();
+            PseudoClasses = new ObservableCollection<PseudoClassViewModel>();
 
             if (control is StyledElement styledElement)
             {
@@ -65,7 +66,7 @@ namespace Avalonia.Diagnostics.ViewModels
                 {
                     foreach (var className in classAttribute.PseudoClasses)
                     {
-                        PseudoClasses.Add(new PseudoClassesViewModel(className, styledElement));
+                        PseudoClasses.Add(new PseudoClassViewModel(className, styledElement));
                     }
                 }
 
@@ -133,7 +134,7 @@ namespace Avalonia.Diagnostics.ViewModels
 
         public ObservableCollection<StyleViewModel> AppliedStyles { get; }
 
-        public ObservableCollection<PseudoClassesViewModel> PseudoClasses { get; }
+        public ObservableCollection<PseudoClassViewModel> PseudoClasses { get; }
 
         public AvaloniaPropertyViewModel SelectedProperty
         {
@@ -146,7 +147,13 @@ namespace Avalonia.Diagnostics.ViewModels
             get => _styleFilter;
             set => RaiseAndSetIfChanged(ref _styleFilter, value);
         }
-        
+
+        public bool SnapshotStyles
+        {
+            get => _snapshotStyles;
+            set => RaiseAndSetIfChanged(ref _snapshotStyles, value);
+        }
+
         public ControlLayoutViewModel Layout { get; }
 
         protected override void OnPropertyChanged(PropertyChangedEventArgs e)
@@ -157,6 +164,13 @@ namespace Avalonia.Diagnostics.ViewModels
             {
                 UpdateStyleFilters();
             }
+            else if (e.PropertyName == nameof(SnapshotStyles))
+            {
+                if (!SnapshotStyles)
+                {
+                    UpdateStyles();
+                }
+            }
         }
 
         private void UpdateStyleFilters()
@@ -258,12 +272,18 @@ namespace Avalonia.Diagnostics.ViewModels
                 }
             }
 
-            UpdateStyles();
+            if (!SnapshotStyles)
+            {
+                UpdateStyles();
+            }
         }
 
         private void OnClassesChanged(object sender, NotifyCollectionChangedEventArgs e)
         {
-            UpdateStyles();
+            if (!SnapshotStyles)
+            {
+                UpdateStyles();
+            }
         }
 
         private void UpdateStyles()

+ 8 - 0
src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs

@@ -163,6 +163,14 @@ namespace Avalonia.Diagnostics.ViewModels
             tree?.SelectControl(control);
         }
 
+        public void EnableSnapshotStyles(bool enable)
+        {
+            if (Content is TreePageViewModel treeVm && treeVm.Details != null)
+            {
+                treeVm.Details.SnapshotStyles = enable;
+            }
+        }
+
         public void Dispose()
         {
             KeyboardDevice.Instance.PropertyChanged -= KeyboardPropertyChanged;

+ 2 - 2
src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassesViewModel.cs → src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassViewModel.cs

@@ -2,14 +2,14 @@
 
 namespace Avalonia.Diagnostics.ViewModels
 {
-    internal class PseudoClassesViewModel : ViewModelBase
+    internal class PseudoClassViewModel : ViewModelBase
     {
         private readonly IPseudoClasses _pseudoClasses;
         private readonly StyledElement _source;
         private bool _isActive;
         private bool _isUpdating;
 
-        public PseudoClassesViewModel(string name, StyledElement source)
+        public PseudoClassViewModel(string name, StyledElement source)
         {
             Name = name;
             _source = source;

+ 10 - 0
src/Avalonia.Diagnostics/Diagnostics/ViewModels/ResourceSetterViewModel.cs

@@ -13,5 +13,15 @@ namespace Avalonia.Diagnostics.ViewModels
             Key = resourceKey;
             Tint = isDynamic ? Brushes.Orange : Brushes.Brown;
         }
+
+        public void CopyResourceKey()
+        {
+            if (Key is null)
+            {
+                return;
+            }
+
+            CopyToClipboard(Key.ToString());
+        }
     }
 }

+ 25 - 1
src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs

@@ -1,4 +1,6 @@
-namespace Avalonia.Diagnostics.ViewModels
+using Avalonia.Input.Platform;
+
+namespace Avalonia.Diagnostics.ViewModels
 {
     internal class SetterViewModel : ViewModelBase
     {
@@ -31,5 +33,27 @@
             IsActive = true;
             IsVisible = true;
         }
+
+        public void CopyValue()
+        {
+            if (Value is null)
+            {
+                return;
+            }
+
+            CopyToClipboard(Value.ToString());
+        }
+
+        public void CopyPropertyName()
+        {
+            CopyToClipboard(Property.Name);
+        }
+
+        protected static void CopyToClipboard(string value)
+        {
+            var clipboard = AvaloniaLocator.Current.GetService<IClipboard>();
+
+            clipboard?.SetTextAsync(value);
+        }
     }
 }

+ 20 - 2
src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml

@@ -152,8 +152,13 @@
       </Grid>
 
       <Grid Grid.Row="2" Margin="4" RowDefinitions="Auto,Auto">
-        <TextBlock Grid.Row="0" Text="Styles"  />
-        <TextBox Grid.Row="1" Margin="2" Watermark="Filter" Text="{Binding StyleFilter}" />
+
+        <Grid Grid.Row="0" Margin="2" ColumnDefinitions="Auto,*,Auto">
+          <TextBlock Grid.Column="0" Text="Styles"  />
+          <ToggleButton Margin="2,0,0,0" Grid.Column="2" ToolTip.Tip="Snapshot current styles (Alt+S/Alt+D to enable/disable within debugged window)" Content="Snapshot" IsChecked="{Binding SnapshotStyles}" />
+        </Grid>
+
+        <TextBox Grid.Row="1" Margin="2" Grid.Column="0" Watermark="Filter" Text="{Binding StyleFilter}" />
       </Grid>
 
         <ScrollViewer Grid.Row="3" HorizontalScrollBarVisibility="Disabled">
@@ -195,6 +200,13 @@
 
                       <DataTemplate DataType="vm:ResourceSetterViewModel">
                         <Panel Opacity="{Binding IsActive, Converter={StaticResource BoolToOpacity}}" IsVisible="{Binding IsVisible}" HorizontalAlignment="Left">
+                          <Panel.ContextMenu>
+                            <ContextMenu>
+                              <MenuItem Header="Copy property name" Command="{Binding CopyPropertyName} "/>
+                              <MenuItem Header="Copy value" Command="{Binding CopyValue} "/>
+                              <MenuItem Header="Copy resource key" Command="{Binding CopyResourceKey}" />
+                            </ContextMenu>
+                          </Panel.ContextMenu>
                           <StackPanel Orientation="Horizontal" Spacing="2" HorizontalAlignment="Left">
                             <TextBlock Text="{Binding Name}" FontWeight="SemiBold" />
                             <TextBlock Text=":" />
@@ -210,6 +222,12 @@
 
                       <DataTemplate DataType="vm:SetterViewModel">
                         <Panel Opacity="{Binding IsActive, Converter={StaticResource BoolToOpacity}}" IsVisible="{Binding IsVisible}" HorizontalAlignment="Left">
+                          <Panel.ContextMenu>
+                            <ContextMenu>
+                              <MenuItem Header="Copy property name" Command="{Binding CopyPropertyName} "/>
+                              <MenuItem Header="Copy value" Command="{Binding CopyValue} "/>
+                            </ContextMenu>
+                          </Panel.ContextMenu>
                           <StackPanel Orientation="Horizontal" Spacing="2">
                             <TextBlock Text="{Binding Name}" FontWeight="SemiBold" />
                             <TextBlock Text=":" />

+ 10 - 0
src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs

@@ -90,6 +90,16 @@ namespace Avalonia.Diagnostics.Views
                     var vm = (MainViewModel)DataContext;
                     vm.SelectControl((IControl)control);
                 }
+            } 
+            else if (e.Modifiers == RawInputModifiers.Alt)
+            {
+                if (e.Key == Key.S || e.Key == Key.D)
+                {
+                    var enable = e.Key == Key.S;
+
+                    var vm = (MainViewModel)DataContext;
+                    vm.EnableSnapshotStyles(enable);
+                }
             }
         }