From 23ade729a5991f41aa7d82111a2f0f4bff3f9f9a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 1 Oct 2014 22:43:21 +0200 Subject: [PATCH] Basic display of set properties in DevTools. --- Perspex.Controls/TreeView.cs | 8 +-- Perspex.Diagnostics/DevTools.cs | 60 +++++++++++++------ .../Perspex.Diagnostics.csproj | 1 + .../ViewModels/ControlDetails.cs | 33 ++++++++++ .../ViewModels/VisualTreeNode.cs | 18 +++--- 5 files changed, 91 insertions(+), 29 deletions(-) create mode 100644 Perspex.Diagnostics/ViewModels/ControlDetails.cs diff --git a/Perspex.Controls/TreeView.cs b/Perspex.Controls/TreeView.cs index 1bbd6b6dcd..48263eca0c 100644 --- a/Perspex.Controls/TreeView.cs +++ b/Perspex.Controls/TreeView.cs @@ -34,16 +34,16 @@ namespace Perspex.Controls if (contentPresenter != null) { - TreeViewItem item = contentPresenter.TemplatedParent as TreeViewItem; + TreeViewItem container = contentPresenter.TemplatedParent as TreeViewItem; - if (item != null) + if (container != null) { foreach (var i in this.GetVisualDescendents().OfType()) { - i.IsSelected = i == item; + i.IsSelected = i == container; } - this.SelectedItem = this.ItemContainerGenerator.GetContainerForItem(item); + this.SelectedItem = this.ItemContainerGenerator.GetItemForContainer(container); } } diff --git a/Perspex.Diagnostics/DevTools.cs b/Perspex.Diagnostics/DevTools.cs index 9eab4ca360..682b71753f 100644 --- a/Perspex.Diagnostics/DevTools.cs +++ b/Perspex.Diagnostics/DevTools.cs @@ -17,6 +17,38 @@ namespace Perspex.Diagnostics public DevTools() { + var treeView = new TreeView + { + DataTemplates = new DataTemplates + { + new TreeDataTemplate(GetHeader, x => x.Children), + }, + [!TreeView.ItemsProperty] = this[!DevTools.RootProperty].Select(x => + { + if (x != null) + { + return new[] { new VisualTreeNode((IVisual)x) }; + } + else + { + return null; + } + }), + }; + + var detailsView = new ContentControl + { + DataTemplates = new DataTemplates + { + new DataTemplate(CreateDetailsView), + }, + [!ContentControl.ContentProperty] = treeView[!TreeView.SelectedItemProperty] + .Where(x => x != null) + .Cast() + .Select(x => new ControlDetails(x.Visual)), + [Grid.ColumnProperty] = 1, + }; + this.Content = new Grid { ColumnDefinitions = new ColumnDefinitions @@ -26,24 +58,8 @@ namespace Perspex.Diagnostics }, Children = new Controls { - new TreeView - { - DataTemplates = new DataTemplates - { - new TreeDataTemplate(GetHeader, x => x.Children), - }, - [!TreeView.ItemsProperty] = this[!DevTools.RootProperty].Select(x => - { - if (x != null) - { - return new[] { new VisualTreeNode((IVisual)x) }; - } - else - { - return null; - } - }), - } + treeView, + detailsView, } }; } @@ -54,6 +70,14 @@ namespace Perspex.Diagnostics set { this.SetValue(RootProperty, value); } } + private static Control CreateDetailsView(ControlDetails i) + { + return new ItemsControl + { + Items = i.Properties, + }; + } + private static Control GetHeader(VisualTreeNode node) { TextBlock result = new TextBlock(); diff --git a/Perspex.Diagnostics/Perspex.Diagnostics.csproj b/Perspex.Diagnostics/Perspex.Diagnostics.csproj index d90cf13d74..8c39f8cd8c 100644 --- a/Perspex.Diagnostics/Perspex.Diagnostics.csproj +++ b/Perspex.Diagnostics/Perspex.Diagnostics.csproj @@ -69,6 +69,7 @@ + diff --git a/Perspex.Diagnostics/ViewModels/ControlDetails.cs b/Perspex.Diagnostics/ViewModels/ControlDetails.cs new file mode 100644 index 0000000000..0dd3cfaf77 --- /dev/null +++ b/Perspex.Diagnostics/ViewModels/ControlDetails.cs @@ -0,0 +1,33 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Diagnostics.ViewModels +{ + using System; + using System.Collections.Generic; + using System.Linq; + using Perspex.Controls; + using ReactiveUI; + + internal class ControlDetails : ReactiveObject + { + public ControlDetails(IVisual visual) + { + PerspexObject po = visual as PerspexObject; + + if (po != null) + { + this.Properties = po.GetSetValues().Select(x => Tuple.Create(x.Item1.Name, x.Item2)); + } + } + + public IEnumerable> Properties + { + get; + private set; + } + } +} diff --git a/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs b/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs index 411c0d14fc..3431fd352e 100644 --- a/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs +++ b/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs @@ -1,19 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Perspex.Controls; -using ReactiveUI; +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- namespace Perspex.Diagnostics.ViewModels { + using Perspex.Controls; + using ReactiveUI; + internal class VisualTreeNode : ReactiveObject { public VisualTreeNode(IVisual visual) { this.Children = visual.VisualChildren.CreateDerivedCollection(x => new VisualTreeNode(x)); this.Type = visual.GetType().Name; + this.Visual = visual; Control control = visual as Control; @@ -28,5 +30,7 @@ namespace Perspex.Diagnostics.ViewModels public bool IsInTemplate { get; private set; } public string Type { get; private set; } + + public IVisual Visual { get; private set; } } }