From 859e748605673bbb646aeaf3f7395ac5cea3428a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sun, 30 Apr 2017 14:09:41 +0200 Subject: [PATCH] Handle non Control-derived classes in DevTools. Previously DevTools expected all controls to be derived from `Control` which isn't necessarily always the case. --- .../ViewModels/ControlDetailsViewModel.cs | 10 ++-- .../ViewModels/TreeNode.cs | 46 ++++++++++--------- .../ViewModels/VisualTreeNode.cs | 7 +-- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/Avalonia.Diagnostics/ViewModels/ControlDetailsViewModel.cs b/src/Avalonia.Diagnostics/ViewModels/ControlDetailsViewModel.cs index 34cc32972c..0339d724f7 100644 --- a/src/Avalonia.Diagnostics/ViewModels/ControlDetailsViewModel.cs +++ b/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); } diff --git a/src/Avalonia.Diagnostics/ViewModels/TreeNode.cs b/src/Avalonia.Diagnostics/ViewModels/TreeNode.cs index f186304f7b..f9da42c071 100644 --- a/src/Avalonia.Diagnostics/ViewModels/TreeNode.cs +++ b/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 Children @@ -56,7 +60,7 @@ namespace Avalonia.Diagnostics.ViewModels private set { this.RaiseAndSetIfChanged(ref _classes, value); } } - public Control Control + public IVisual Control { get; } diff --git a/src/Avalonia.Diagnostics/ViewModels/VisualTreeNode.cs b/src/Avalonia.Diagnostics/ViewModels/VisualTreeNode.cs index d155572c14..bcbd88b876 100644 --- a/src/Avalonia.Diagnostics/ViewModels/VisualTreeNode.cs +++ b/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(new[] { new VisualTreeNode(host.Root, this) }); } - if (Control != null) + if ((Control is IStyleable styleable)) { - IsInTemplate = Control.TemplatedParent != null; + IsInTemplate = styleable.TemplatedParent != null; } }