Browse Source

Add style snapshotting and context menus to copy property values.

pull/5537/head
Dariusz Komosinski 6 years ago
parent
commit
161b9374a5
  1. 32
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs
  2. 8
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs
  3. 4
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassViewModel.cs
  4. 10
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/ResourceSetterViewModel.cs
  5. 26
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs
  6. 22
      src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml
  7. 10
      src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs

32
src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs

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

8
src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs

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

4
src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassesViewModel.cs → src/Avalonia.Diagnostics/Diagnostics/ViewModels/PseudoClassViewModel.cs

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

10
src/Avalonia.Diagnostics/Diagnostics/ViewModels/ResourceSetterViewModel.cs

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

26
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 internal class SetterViewModel : ViewModelBase
{ {
@ -31,5 +33,27 @@
IsActive = true; IsActive = true;
IsVisible = 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);
}
} }
} }

22
src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml

@ -152,8 +152,13 @@
</Grid> </Grid>
<Grid Grid.Row="2" Margin="4" RowDefinitions="Auto,Auto"> <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> </Grid>
<ScrollViewer Grid.Row="3" HorizontalScrollBarVisibility="Disabled"> <ScrollViewer Grid.Row="3" HorizontalScrollBarVisibility="Disabled">
@ -195,6 +200,13 @@
<DataTemplate DataType="vm:ResourceSetterViewModel"> <DataTemplate DataType="vm:ResourceSetterViewModel">
<Panel Opacity="{Binding IsActive, Converter={StaticResource BoolToOpacity}}" IsVisible="{Binding IsVisible}" HorizontalAlignment="Left"> <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"> <StackPanel Orientation="Horizontal" Spacing="2" HorizontalAlignment="Left">
<TextBlock Text="{Binding Name}" FontWeight="SemiBold" /> <TextBlock Text="{Binding Name}" FontWeight="SemiBold" />
<TextBlock Text=":" /> <TextBlock Text=":" />
@ -210,6 +222,12 @@
<DataTemplate DataType="vm:SetterViewModel"> <DataTemplate DataType="vm:SetterViewModel">
<Panel Opacity="{Binding IsActive, Converter={StaticResource BoolToOpacity}}" IsVisible="{Binding IsVisible}" HorizontalAlignment="Left"> <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"> <StackPanel Orientation="Horizontal" Spacing="2">
<TextBlock Text="{Binding Name}" FontWeight="SemiBold" /> <TextBlock Text="{Binding Name}" FontWeight="SemiBold" />
<TextBlock Text=":" /> <TextBlock Text=":" />

10
src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs

@ -90,6 +90,16 @@ namespace Avalonia.Diagnostics.Views
var vm = (MainViewModel)DataContext; var vm = (MainViewModel)DataContext;
vm.SelectControl((IControl)control); 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);
}
} }
} }

Loading…
Cancel
Save