Browse Source

show adorner while hovering any part of the control's TreeViewItem in DevTools (#14231)

pull/14243/head
AtomCrafty 3 years ago
committed by GitHub
parent
commit
1c792b294f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 7
      src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml
  2. 41
      src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs

7
src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml

@ -7,13 +7,12 @@
<TreeView Name="tree" <TreeView Name="tree"
BorderThickness="0" BorderThickness="0"
ItemsSource="{Binding Nodes}" ItemsSource="{Binding Nodes}"
SelectedItem="{Binding SelectedNode, Mode=TwoWay}"> SelectedItem="{Binding SelectedNode, Mode=TwoWay}"
PointerMoved="UpdateAdorner">
<TreeView.DataTemplates> <TreeView.DataTemplates>
<TreeDataTemplate DataType="vm:TreeNode" <TreeDataTemplate DataType="vm:TreeNode"
ItemsSource="{Binding Children}"> ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal" Spacing="8" <StackPanel Orientation="Horizontal" Spacing="8">
PointerEntered="AddAdorner"
PointerExited="RemoveAdorner">
<TextBlock Text="{Binding Type}" FontWeight="{Binding FontWeight}"/> <TextBlock Text="{Binding Type}" FontWeight="{Binding FontWeight}"/>
<TextBlock Text="{Binding Classes}"/> <TextBlock Text="{Binding Classes}"/>
<TextBlock Foreground="Gray" Text="{Binding ElementName}"/> <TextBlock Foreground="Gray" Text="{Binding ElementName}"/>

41
src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs

@ -1,14 +1,11 @@
using System;
using System.Diagnostics;
using System.Linq; using System.Linq;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Diagnostics.ViewModels; using Avalonia.Diagnostics.ViewModels;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.LogicalTree;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.VisualTree;
namespace Avalonia.Diagnostics.Views namespace Avalonia.Diagnostics.Views
{ {
@ -16,6 +13,7 @@ namespace Avalonia.Diagnostics.Views
{ {
private readonly Panel _adorner; private readonly Panel _adorner;
private AdornerLayer? _currentLayer; private AdornerLayer? _currentLayer;
private TreeViewItem? _hovered;
private TreeView _tree; private TreeView _tree;
public TreePageView() public TreePageView()
@ -39,6 +37,11 @@ namespace Avalonia.Diagnostics.Views
AdornerLayer.SetIsClipEnabled(_adorner, false); AdornerLayer.SetIsClipEnabled(_adorner, false);
} }
private static Thickness InvertThickness(Thickness input)
{
return new Thickness(-input.Left, -input.Top, -input.Right, -input.Bottom);
}
protected void AddAdorner(object? sender, PointerEventArgs e) protected void AddAdorner(object? sender, PointerEventArgs e)
{ {
var node = (TreeNode?)((Control)sender!).DataContext; var node = (TreeNode?)((Control)sender!).DataContext;
@ -80,11 +83,6 @@ namespace Avalonia.Diagnostics.Views
} }
} }
private static Thickness InvertThickness(Thickness input)
{
return new Thickness(-input.Left, -input.Top, -input.Right, -input.Bottom);
}
protected void RemoveAdorner(object? sender, PointerEventArgs e) protected void RemoveAdorner(object? sender, PointerEventArgs e)
{ {
foreach (var border in _adorner.Children.OfType<Border>()) foreach (var border in _adorner.Children.OfType<Border>())
@ -98,6 +96,31 @@ namespace Avalonia.Diagnostics.Views
_currentLayer = null; _currentLayer = null;
} }
protected void UpdateAdorner(object? sender, PointerEventArgs e)
{
if (e.Source is not StyledElement source)
{
return;
}
var item = source.FindLogicalAncestorOfType<TreeViewItem>();
if (item == _hovered)
{
return;
}
RemoveAdorner(sender, e);
if (item is null || item.TreeViewOwner != _tree)
{
_hovered = null;
return;
}
_hovered = item;
AddAdorner(item, e);
}
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{ {
base.OnPropertyChanged(change); base.OnPropertyChanged(change);

Loading…
Cancel
Save