Browse Source

Improve events filter

pull/5991/head
Max Katz 5 years ago
parent
commit
f83d8e55ea
  1. 2
      src/Avalonia.Diagnostics/Diagnostics/Controls/FilterTextBox.cs
  2. 25
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/EventsPageViewModel.cs
  3. 9
      src/Avalonia.Diagnostics/Diagnostics/Views/EventsPageView.xaml

2
src/Avalonia.Diagnostics/Diagnostics/Controls/FilterTextBox.cs

@ -12,13 +12,11 @@ namespace Avalonia.Diagnostics.Controls
o => o.UseRegexFilter, (o, v) => o.UseRegexFilter = v, o => o.UseRegexFilter, (o, v) => o.UseRegexFilter = v,
defaultBindingMode: BindingMode.TwoWay); defaultBindingMode: BindingMode.TwoWay);
public static readonly DirectProperty<FilterTextBox, bool> UseCaseSensitiveFilterProperty = public static readonly DirectProperty<FilterTextBox, bool> UseCaseSensitiveFilterProperty =
AvaloniaProperty.RegisterDirect<FilterTextBox, bool>(nameof(UseCaseSensitiveFilter), AvaloniaProperty.RegisterDirect<FilterTextBox, bool>(nameof(UseCaseSensitiveFilter),
o => o.UseCaseSensitiveFilter, (o, v) => o.UseCaseSensitiveFilter = v, o => o.UseCaseSensitiveFilter, (o, v) => o.UseCaseSensitiveFilter = v,
defaultBindingMode: BindingMode.TwoWay); defaultBindingMode: BindingMode.TwoWay);
public static readonly DirectProperty<FilterTextBox, bool> UseWholeWordFilterProperty = public static readonly DirectProperty<FilterTextBox, bool> UseWholeWordFilterProperty =
AvaloniaProperty.RegisterDirect<FilterTextBox, bool>(nameof(UseWholeWordFilter), AvaloniaProperty.RegisterDirect<FilterTextBox, bool>(nameof(UseWholeWordFilter),
o => o.UseWholeWordFilter, (o, v) => o.UseWholeWordFilter = v, o => o.UseWholeWordFilter, (o, v) => o.UseWholeWordFilter = v,

25
src/Avalonia.Diagnostics/Diagnostics/ViewModels/EventsPageViewModel.cs

@ -23,7 +23,6 @@ namespace Avalonia.Diagnostics.ViewModels
}; };
private readonly MainViewModel _mainViewModel; private readonly MainViewModel _mainViewModel;
private string _eventTypeFilter;
private FiredEvent _selectedEvent; private FiredEvent _selectedEvent;
private EventTreeNodeBase _selectedNode; private EventTreeNodeBase _selectedNode;
@ -37,6 +36,9 @@ namespace Avalonia.Diagnostics.ViewModels
.Select(g => new EventOwnerTreeNode(g.Key, g, this)) .Select(g => new EventOwnerTreeNode(g.Key, g, this))
.ToArray(); .ToArray();
EventsFilter = new FilterViewModel();
EventsFilter.RefreshFilter += (s, e) => UpdateEventFilters();
EnableDefault(); EnableDefault();
} }
@ -58,11 +60,7 @@ namespace Avalonia.Diagnostics.ViewModels
set => RaiseAndSetIfChanged(ref _selectedNode, value); set => RaiseAndSetIfChanged(ref _selectedNode, value);
} }
public string EventTypeFilter public FilterViewModel EventsFilter { get; }
{
get => _eventTypeFilter;
set => RaiseAndSetIfChanged(ref _eventTypeFilter, value);
}
public void Clear() public void Clear()
{ {
@ -125,16 +123,6 @@ namespace Avalonia.Diagnostics.ViewModels
} }
} }
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.PropertyName == nameof(EventTypeFilter))
{
UpdateEventFilters();
}
}
private void EvaluateNodeEnabled(Func<EventTreeNode, bool> eval) private void EvaluateNodeEnabled(Func<EventTreeNode, bool> eval)
{ {
void ProcessNode(EventTreeNodeBase node) void ProcessNode(EventTreeNodeBase node)
@ -161,9 +149,6 @@ namespace Avalonia.Diagnostics.ViewModels
private void UpdateEventFilters() private void UpdateEventFilters()
{ {
var filter = EventTypeFilter;
bool hasFilter = !string.IsNullOrEmpty(filter);
foreach (var node in Nodes) foreach (var node in Nodes)
{ {
FilterNode(node, false); FilterNode(node, false);
@ -171,7 +156,7 @@ namespace Avalonia.Diagnostics.ViewModels
bool FilterNode(EventTreeNodeBase node, bool isParentVisible) bool FilterNode(EventTreeNodeBase node, bool isParentVisible)
{ {
bool matchesFilter = !hasFilter || node.Text.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0; bool matchesFilter = EventsFilter.Filter(node.Text);
bool hasVisibleChild = false; bool hasVisibleChild = false;
if (node.Children != null) if (node.Children != null)

9
src/Avalonia.Diagnostics/Diagnostics/Views/EventsPageView.xaml

@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:Avalonia.Diagnostics.ViewModels" xmlns:vm="clr-namespace:Avalonia.Diagnostics.ViewModels"
xmlns:conv="clr-namespace:Avalonia.Diagnostics.Converters" xmlns:conv="clr-namespace:Avalonia.Diagnostics.Converters"
xmlns:controls="clr-namespace:Avalonia.Diagnostics.Controls"
x:Class="Avalonia.Diagnostics.Views.EventsPageView" x:Class="Avalonia.Diagnostics.Views.EventsPageView"
Margin="2"> Margin="2">
<UserControl.Styles> <UserControl.Styles>
@ -35,7 +36,13 @@
<Grid Grid.Column="0" RowDefinitions="Auto,*,Auto"> <Grid Grid.Column="0" RowDefinitions="Auto,*,Auto">
<TextBox Classes="clearButton" Grid.Row="0" Margin="0,0,0,2" Text="{Binding EventTypeFilter}" Watermark="Search event types" /> <controls:FilterTextBox Grid.Row="0" Margin="0,0,0,2"
DataContext="{Binding EventsFilter}"
Text="{Binding FilterString}"
Watermark="Filter events"
UseCaseSensitiveFilter="{Binding UseCaseSensitiveFilter}"
UseWholeWordFilter="{Binding UseWholeWordFilter}"
UseRegexFilter="{Binding UseRegexFilter}" />
<TreeView Grid.Row="1" Items="{Binding Nodes}" SelectedItem="{Binding SelectedNode, Mode=TwoWay}" > <TreeView Grid.Row="1" Items="{Binding Nodes}" SelectedItem="{Binding SelectedNode, Mode=TwoWay}" >
<TreeView.DataTemplates> <TreeView.DataTemplates>

Loading…
Cancel
Save