Browse Source

Adding support for regex filter of devtools properties

pull/4529/head
Luis von der Eltz 6 years ago
parent
commit
86aad32bee
  1. 31
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs
  2. 34
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs
  3. 45
      src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml

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

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions;
using Avalonia.Collections; using Avalonia.Collections;
using Avalonia.VisualTree; using Avalonia.VisualTree;
@ -12,12 +13,13 @@ namespace Avalonia.Diagnostics.ViewModels
private readonly IVisual _control; private readonly IVisual _control;
private readonly IDictionary<object, List<PropertyViewModel>> _propertyIndex; private readonly IDictionary<object, List<PropertyViewModel>> _propertyIndex;
private AvaloniaPropertyViewModel _selectedProperty; private AvaloniaPropertyViewModel _selectedProperty;
private string _propertyFilter;
public ControlDetailsViewModel(IVisual control, string propertyFilter) public ControlDetailsViewModel(TreePageViewModel treePage, IVisual control)
{ {
_control = control; _control = control;
TreePage = treePage;
var properties = GetAvaloniaProperties(control) var properties = GetAvaloniaProperties(control)
.Concat(GetClrProperties(control)) .Concat(GetClrProperties(control))
.OrderBy(x => x, PropertyComparer.Instance) .OrderBy(x => x, PropertyComparer.Instance)
@ -25,7 +27,6 @@ namespace Avalonia.Diagnostics.ViewModels
.ToList(); .ToList();
_propertyIndex = properties.GroupBy(x => x.Key).ToDictionary(x => x.Key, x => x.ToList()); _propertyIndex = properties.GroupBy(x => x.Key).ToDictionary(x => x.Key, x => x.ToList());
_propertyFilter = propertyFilter;
var view = new DataGridCollectionView(properties); var view = new DataGridCollectionView(properties);
view.GroupDescriptions.Add(new DataGridPathGroupDescription(nameof(AvaloniaPropertyViewModel.Group))); view.GroupDescriptions.Add(new DataGridPathGroupDescription(nameof(AvaloniaPropertyViewModel.Group)));
@ -43,19 +44,9 @@ namespace Avalonia.Diagnostics.ViewModels
} }
} }
public DataGridCollectionView PropertiesView { get; } public TreePageViewModel TreePage { get; }
public string PropertyFilter public DataGridCollectionView PropertiesView { get; }
{
get => _propertyFilter;
set
{
if (RaiseAndSetIfChanged(ref _propertyFilter, value))
{
PropertiesView.Refresh();
}
}
}
public AvaloniaPropertyViewModel SelectedProperty public AvaloniaPropertyViewModel SelectedProperty
{ {
@ -137,9 +128,15 @@ namespace Avalonia.Diagnostics.ViewModels
private bool FilterProperty(object arg) private bool FilterProperty(object arg)
{ {
if (!string.IsNullOrWhiteSpace(PropertyFilter) && arg is PropertyViewModel property) if (!string.IsNullOrWhiteSpace(TreePage.PropertyFilter) && arg is PropertyViewModel property)
{ {
return property.Name.IndexOf(PropertyFilter, StringComparison.OrdinalIgnoreCase) != -1; if (TreePage.UseRegexFilter)
{
var regex = new Regex(TreePage.PropertyFilter);
return regex.IsMatch(property.Name);
}
return property.Name.IndexOf(TreePage.PropertyFilter, StringComparison.OrdinalIgnoreCase) != -1;
} }
return true; return true;

34
src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs

@ -8,7 +8,8 @@ namespace Avalonia.Diagnostics.ViewModels
{ {
private TreeNode _selectedNode; private TreeNode _selectedNode;
private ControlDetailsViewModel _details; private ControlDetailsViewModel _details;
private string _propertyFilter; private string _propertyFilter = string.Empty;
private bool _useRegexFilter;
public TreePageViewModel(TreeNode[] nodes) public TreePageViewModel(TreeNode[] nodes)
{ {
@ -34,15 +35,10 @@ namespace Avalonia.Diagnostics.ViewModels
get => _selectedNode; get => _selectedNode;
private set private set
{ {
if (Details != null)
{
_propertyFilter = Details.PropertyFilter;
}
if (RaiseAndSetIfChanged(ref _selectedNode, value)) if (RaiseAndSetIfChanged(ref _selectedNode, value))
{ {
Details = value != null ? Details = value != null ?
new ControlDetailsViewModel(value.Visual, _propertyFilter) : new ControlDetailsViewModel(this, value.Visual) :
null; null;
} }
} }
@ -62,6 +58,30 @@ namespace Avalonia.Diagnostics.ViewModels
} }
} }
public string PropertyFilter
{
get => _propertyFilter;
set
{
if (RaiseAndSetIfChanged(ref _propertyFilter, value))
{
Details.PropertiesView.Refresh();
}
}
}
public bool UseRegexFilter
{
get => _useRegexFilter;
set
{
if (RaiseAndSetIfChanged(ref _useRegexFilter, value))
{
Details.PropertiesView.Refresh();
}
}
}
public void Dispose() public void Dispose()
{ {
foreach (var node in Nodes) foreach (var node in Nodes)

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

@ -2,24 +2,31 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="clr-namespace:Avalonia.Diagnostics.Converters" xmlns:conv="clr-namespace:Avalonia.Diagnostics.Converters"
x:Class="Avalonia.Diagnostics.Views.ControlDetailsView"> x:Class="Avalonia.Diagnostics.Views.ControlDetailsView">
<Grid ColumnDefinitions="*"> <Grid ColumnDefinitions="*,Auto" RowDefinitions="Auto,*">
<DockPanel Grid.Column="0">
<TextBox DockPanel.Dock="Top" <TextBox Grid.Row="0" Grid.Column="0"
BorderThickness="0" BorderThickness="0"
Text="{Binding PropertyFilter}" Text="{Binding TreePage.PropertyFilter}"
Watermark="Filter properties"/> Watermark="Filter properties" />
<DataGrid Items="{Binding PropertiesView}"
BorderThickness="0" <CheckBox Grid.Row="0"
RowBackground="Transparent" Grid.Column="1"
SelectedItem="{Binding SelectedProperty, Mode=TwoWay}" Content="Regex"
CanUserResizeColumns="true"> IsChecked="{Binding TreePage.UseRegexFilter}"/>
<DataGrid.Columns>
<DataGridTextColumn Header="Property" Binding="{Binding Name}" IsReadOnly="True"/> <DataGrid Items="{Binding PropertiesView}"
<DataGridTextColumn Header="Value" Binding="{Binding Value}"/> Grid.Row="1" Grid.ColumnSpan="2"
<DataGridTextColumn Header="Type" Binding="{Binding Type}"/> BorderThickness="0"
<DataGridTextColumn Header="Priority" Binding="{Binding Priority}" IsReadOnly="True"/> RowBackground="Transparent"
</DataGrid.Columns> SelectedItem="{Binding SelectedProperty, Mode=TwoWay}"
</DataGrid> CanUserResizeColumns="true">
</DockPanel> <DataGrid.Columns>
<DataGridTextColumn Header="Property" Binding="{Binding Name}" IsReadOnly="True" />
<DataGridTextColumn Header="Value" Binding="{Binding Value}" />
<DataGridTextColumn Header="Type" Binding="{Binding Type}" />
<DataGridTextColumn Header="Priority" Binding="{Binding Priority}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
</Grid> </Grid>
</UserControl> </UserControl>

Loading…
Cancel
Save