Browse Source

Handle non Control-derived classes in DevTools.

Previously DevTools expected all controls to be derived from `Control`
which isn't necessarily always the case.
pull/969/head
Steven Kirk 9 years ago
parent
commit
859e748605
  1. 10
      src/Avalonia.Diagnostics/ViewModels/ControlDetailsViewModel.cs
  2. 46
      src/Avalonia.Diagnostics/ViewModels/TreeNode.cs
  3. 7
      src/Avalonia.Diagnostics/ViewModels/VisualTreeNode.cs

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

@ -3,19 +3,19 @@
using System.Collections.Generic;
using System.Linq;
using Avalonia.Controls;
using Avalonia.VisualTree;
using ReactiveUI;
namespace Avalonia.Diagnostics.ViewModels
{
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)
.Select(x => new PropertyDetails(control, x))
Properties = AvaloniaPropertyRegistry.Instance.GetRegistered(avaloniaObject)
.Select(x => new PropertyDetails(avaloniaObject, x))
.OrderBy(x => x.IsAttached)
.ThenBy(x => x.Name);
}

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

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

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.
using Avalonia.Controls;
using Avalonia.Styling;
using Avalonia.VisualTree;
using ReactiveUI;
@ -10,7 +11,7 @@ namespace Avalonia.Diagnostics.ViewModels
internal class VisualTreeNode : TreeNode
{
public VisualTreeNode(IVisual visual, TreeNode parent)
: base((Control)visual, parent)
: base(visual, parent)
{
var host = visual as IVisualTreeHost;
@ -23,9 +24,9 @@ namespace Avalonia.Diagnostics.ViewModels
Children = new ReactiveList<VisualTreeNode>(new[] { new VisualTreeNode(host.Root, this) });
}
if (Control != null)
if ((Control is IStyleable styleable))
{
IsInTemplate = Control.TemplatedParent != null;
IsInTemplate = styleable.TemplatedParent != null;
}
}

Loading…
Cancel
Save