From 161b9374a59a9631f2b2bfa976a0bf4eba21e457 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Fri, 26 Feb 2021 00:27:30 +0100 Subject: [PATCH] Add style snapshotting and context menus to copy property values. --- .../ViewModels/ControlDetailsViewModel.cs | 32 +++++++++++++++---- .../Diagnostics/ViewModels/MainViewModel.cs | 8 +++++ ...esViewModel.cs => PseudoClassViewModel.cs} | 4 +-- .../ViewModels/ResourceSetterViewModel.cs | 10 ++++++ .../Diagnostics/ViewModels/SetterViewModel.cs | 26 ++++++++++++++- .../Diagnostics/Views/ControlDetailsView.xaml | 22 +++++++++++-- .../Diagnostics/Views/MainWindow.xaml.cs | 10 ++++++ 7 files changed, 101 insertions(+), 11 deletions(-) rename src/Avalonia.Diagnostics/Diagnostics/ViewModels/{PseudoClassesViewModel.cs => PseudoClassViewModel.cs} (88%) diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs index e6758d680c..19eb14ba06 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs @@ -20,6 +20,7 @@ namespace Avalonia.Diagnostics.ViewModels private readonly IDictionary> _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(); - PseudoClasses = new ObservableCollection(); + PseudoClasses = new ObservableCollection(); 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 AppliedStyles { get; } - public ObservableCollection PseudoClasses { get; } + public ObservableCollection 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() diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs index bf7d0e232a..3049431361 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs +++ b/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; diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassesViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassViewModel.cs similarity index 88% rename from src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassesViewModel.cs rename to src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassViewModel.cs index dd2452333e..69126c2e2f 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassesViewModel.cs +++ b/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; diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ResourceSetterViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ResourceSetterViewModel.cs index fedfa1c0b4..a82e13fcfa 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ResourceSetterViewModel.cs +++ b/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()); + } } } diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs index 691817ccd1..e835f5a878 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs +++ b/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(); + + clipboard?.SetTextAsync(value); + } } } diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml b/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml index 7b5fbbfb22..c7a52a5a5f 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml +++ b/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml @@ -152,8 +152,13 @@ - - + + + + + + + @@ -195,6 +200,13 @@ + + + + + + + @@ -210,6 +222,12 @@ + + + + + + diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs b/src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs index c4f9185728..330121321a 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs +++ b/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); + } } }