Browse Source

Add style snapshotting and context menus to copy property values.

pull/5537/head
Dariusz Komosinski 5 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 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
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;

4
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
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());
}
}
}

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
{
@ -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);
}
}
}

22
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
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);
}
}
}

Loading…
Cancel
Save