Browse Source

Merge pull request #969 from AvaloniaUI/devtools-ivisual

Handle non Control-derived classes in DevTools.
pull/974/head
Nikita Tsukanov 10 years ago
committed by GitHub
parent
commit
1ade372dc9
  1. 10
      src/Avalonia.Diagnostics/ViewModels/ControlDetailsViewModel.cs
  2. 49
      src/Avalonia.Diagnostics/ViewModels/TreeNode.cs
  3. 4
      src/Avalonia.Diagnostics/ViewModels/TreePageViewModel.cs
  4. 7
      src/Avalonia.Diagnostics/ViewModels/VisualTreeNode.cs
  5. 4
      src/Avalonia.Diagnostics/Views/TreePage.xaml.cs

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

@ -3,19 +3,19 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Avalonia.Controls; using Avalonia.VisualTree;
using ReactiveUI; using ReactiveUI;
namespace Avalonia.Diagnostics.ViewModels namespace Avalonia.Diagnostics.ViewModels
{ {
internal class ControlDetailsViewModel : ReactiveObject internal class ControlDetailsViewModel : ReactiveObject
{ {
public ControlDetailsViewModel(Control control) public ControlDetailsViewModel(IVisual control)
{ {
if (control != null) if (control is AvaloniaObject avaloniaObject)
{ {
Properties = AvaloniaPropertyRegistry.Instance.GetRegistered(control) Properties = AvaloniaPropertyRegistry.Instance.GetRegistered(avaloniaObject)
.Select(x => new PropertyDetails(control, x)) .Select(x => new PropertyDetails(avaloniaObject, x))
.OrderBy(x => x.IsAttached) .OrderBy(x => x.IsAttached)
.ThenBy(x => x.Name); .ThenBy(x => x.Name);
} }

49
src/Avalonia.Diagnostics/ViewModels/TreeNode.cs

@ -5,8 +5,8 @@ using System;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Reactive; using System.Reactive;
using System.Reactive.Linq; using System.Reactive.Linq;
using Avalonia.Controls;
using Avalonia.Styling; using Avalonia.Styling;
using Avalonia.VisualTree;
using ReactiveUI; using ReactiveUI;
namespace Avalonia.Diagnostics.ViewModels namespace Avalonia.Diagnostics.ViewModels
@ -16,32 +16,35 @@ namespace Avalonia.Diagnostics.ViewModels
private string _classes; private string _classes;
private bool _isExpanded; private bool _isExpanded;
public TreeNode(Control control, TreeNode parent) public TreeNode(IVisual visual, TreeNode parent)
{ {
Control = control;
Parent = parent; Parent = parent;
Type = control.GetType().Name; Type = visual.GetType().Name;
Visual = visual;
var classesChanged = Observable.FromEventPattern< if (visual is IStyleable styleable)
NotifyCollectionChangedEventHandler, {
NotifyCollectionChangedEventArgs>( var classesChanged = Observable.FromEventPattern<
x => control.Classes.CollectionChanged += x, NotifyCollectionChangedEventHandler,
x => control.Classes.CollectionChanged -= x) NotifyCollectionChangedEventArgs>(
.TakeUntil(((IStyleable)control).StyleDetach); x => styleable.Classes.CollectionChanged += x,
x => styleable.Classes.CollectionChanged -= x)
.TakeUntil(((IStyleable)styleable).StyleDetach);
classesChanged.Select(_ => Unit.Default) classesChanged.Select(_ => Unit.Default)
.StartWith(Unit.Default) .StartWith(Unit.Default)
.Subscribe(_ => .Subscribe(_ =>
{
if (control.Classes.Count > 0)
{ {
Classes = "(" + string.Join(" ", control.Classes) + ")"; if (styleable.Classes.Count > 0)
} {
else Classes = "(" + string.Join(" ", styleable.Classes) + ")";
{ }
Classes = string.Empty; else
} {
}); Classes = string.Empty;
}
});
}
} }
public IReadOnlyReactiveList<TreeNode> Children public IReadOnlyReactiveList<TreeNode> Children
@ -56,7 +59,7 @@ namespace Avalonia.Diagnostics.ViewModels
private set { this.RaiseAndSetIfChanged(ref _classes, value); } private set { this.RaiseAndSetIfChanged(ref _classes, value); }
} }
public Control Control public IVisual Visual
{ {
get; get;
} }

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

@ -18,7 +18,7 @@ namespace Avalonia.Diagnostics.ViewModels
{ {
Nodes = nodes; Nodes = nodes;
_details = this.WhenAnyValue(x => x.SelectedNode) _details = this.WhenAnyValue(x => x.SelectedNode)
.Select(x => x != null ? new ControlDetailsViewModel(x.Control) : null) .Select(x => x != null ? new ControlDetailsViewModel(x.Visual) : null)
.ToProperty(this, x => x.Details); .ToProperty(this, x => x.Details);
} }
@ -79,7 +79,7 @@ namespace Avalonia.Diagnostics.ViewModels
private TreeNode FindNode(TreeNode node, IControl control) private TreeNode FindNode(TreeNode node, IControl control)
{ {
if (node.Control == control) if (node.Visual == control)
{ {
return node; return node;
} }

7
src/Avalonia.Diagnostics/ViewModels/VisualTreeNode.cs

@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information. // Licensed under the MIT license. See licence.md file in the project root for full license information.
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Styling;
using Avalonia.VisualTree; using Avalonia.VisualTree;
using ReactiveUI; using ReactiveUI;
@ -10,7 +11,7 @@ namespace Avalonia.Diagnostics.ViewModels
internal class VisualTreeNode : TreeNode internal class VisualTreeNode : TreeNode
{ {
public VisualTreeNode(IVisual visual, TreeNode parent) public VisualTreeNode(IVisual visual, TreeNode parent)
: base((Control)visual, parent) : base(visual, parent)
{ {
var host = visual as IVisualTreeHost; var host = visual as IVisualTreeHost;
@ -23,9 +24,9 @@ namespace Avalonia.Diagnostics.ViewModels
Children = new ReactiveList<VisualTreeNode>(new[] { new VisualTreeNode(host.Root, this) }); Children = new ReactiveList<VisualTreeNode>(new[] { new VisualTreeNode(host.Root, this) });
} }
if (Control != null) if ((Visual is IStyleable styleable))
{ {
IsInTemplate = Control.TemplatedParent != null; IsInTemplate = styleable.TemplatedParent != null;
} }
} }

4
src/Avalonia.Diagnostics/Views/TreePage.xaml.cs

@ -23,14 +23,14 @@ namespace Avalonia.Diagnostics.Views
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;
var layer = AdornerLayer.GetAdornerLayer(node.Control); var layer = AdornerLayer.GetAdornerLayer(node.Visual);
if (layer != null) if (layer != null)
{ {
_adorner = new Rectangle _adorner = new Rectangle
{ {
Fill = new SolidColorBrush(0x80a0c5e8), Fill = new SolidColorBrush(0x80a0c5e8),
[AdornerLayer.AdornedElementProperty] = node.Control, [AdornerLayer.AdornedElementProperty] = node.Visual,
}; };
layer.Children.Add(_adorner); layer.Children.Add(_adorner);

Loading…
Cancel
Save