Browse Source

Basic display of set properties in DevTools.

pull/4/head
Steven Kirk 12 years ago
parent
commit
23ade729a5
  1. 8
      Perspex.Controls/TreeView.cs
  2. 60
      Perspex.Diagnostics/DevTools.cs
  3. 1
      Perspex.Diagnostics/Perspex.Diagnostics.csproj
  4. 33
      Perspex.Diagnostics/ViewModels/ControlDetails.cs
  5. 18
      Perspex.Diagnostics/ViewModels/VisualTreeNode.cs

8
Perspex.Controls/TreeView.cs

@ -34,16 +34,16 @@ namespace Perspex.Controls
if (contentPresenter != null) 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<TreeViewItem>()) foreach (var i in this.GetVisualDescendents().OfType<TreeViewItem>())
{ {
i.IsSelected = i == item; i.IsSelected = i == container;
} }
this.SelectedItem = this.ItemContainerGenerator.GetContainerForItem(item); this.SelectedItem = this.ItemContainerGenerator.GetItemForContainer(container);
} }
} }

60
Perspex.Diagnostics/DevTools.cs

@ -17,6 +17,38 @@ namespace Perspex.Diagnostics
public DevTools() public DevTools()
{ {
var treeView = new TreeView
{
DataTemplates = new DataTemplates
{
new TreeDataTemplate<VisualTreeNode>(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<ControlDetails>(CreateDetailsView),
},
[!ContentControl.ContentProperty] = treeView[!TreeView.SelectedItemProperty]
.Where(x => x != null)
.Cast<VisualTreeNode>()
.Select(x => new ControlDetails(x.Visual)),
[Grid.ColumnProperty] = 1,
};
this.Content = new Grid this.Content = new Grid
{ {
ColumnDefinitions = new ColumnDefinitions ColumnDefinitions = new ColumnDefinitions
@ -26,24 +58,8 @@ namespace Perspex.Diagnostics
}, },
Children = new Controls Children = new Controls
{ {
new TreeView treeView,
{ detailsView,
DataTemplates = new DataTemplates
{
new TreeDataTemplate<VisualTreeNode>(GetHeader, x => x.Children),
},
[!TreeView.ItemsProperty] = this[!DevTools.RootProperty].Select(x =>
{
if (x != null)
{
return new[] { new VisualTreeNode((IVisual)x) };
}
else
{
return null;
}
}),
}
} }
}; };
} }
@ -54,6 +70,14 @@ namespace Perspex.Diagnostics
set { this.SetValue(RootProperty, value); } set { this.SetValue(RootProperty, value); }
} }
private static Control CreateDetailsView(ControlDetails i)
{
return new ItemsControl
{
Items = i.Properties,
};
}
private static Control GetHeader(VisualTreeNode node) private static Control GetHeader(VisualTreeNode node)
{ {
TextBlock result = new TextBlock(); TextBlock result = new TextBlock();

1
Perspex.Diagnostics/Perspex.Diagnostics.csproj

@ -69,6 +69,7 @@
<Compile Include="DevTools.cs" /> <Compile Include="DevTools.cs" />
<Compile Include="Debug.cs" /> <Compile Include="Debug.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ViewModels\ControlDetails.cs" />
<Compile Include="ViewModels\VisualTreeNode.cs" /> <Compile Include="ViewModels\VisualTreeNode.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

33
Perspex.Diagnostics/ViewModels/ControlDetails.cs

@ -0,0 +1,33 @@
// -----------------------------------------------------------------------
// <copyright file="ControlDetails.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
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<Tuple<string, object>> Properties
{
get;
private set;
}
}
}

18
Perspex.Diagnostics/ViewModels/VisualTreeNode.cs

@ -1,19 +1,21 @@
using System; // -----------------------------------------------------------------------
using System.Collections.Generic; // <copyright file="VisualTreeNode.cs" company="Steven Kirk">
using System.Linq; // Copyright 2014 MIT Licence. See licence.md for more information.
using System.Text; // </copyright>
using System.Threading.Tasks; // -----------------------------------------------------------------------
using Perspex.Controls;
using ReactiveUI;
namespace Perspex.Diagnostics.ViewModels namespace Perspex.Diagnostics.ViewModels
{ {
using Perspex.Controls;
using ReactiveUI;
internal class VisualTreeNode : ReactiveObject internal class VisualTreeNode : ReactiveObject
{ {
public VisualTreeNode(IVisual visual) public VisualTreeNode(IVisual visual)
{ {
this.Children = visual.VisualChildren.CreateDerivedCollection(x => new VisualTreeNode(x)); this.Children = visual.VisualChildren.CreateDerivedCollection(x => new VisualTreeNode(x));
this.Type = visual.GetType().Name; this.Type = visual.GetType().Name;
this.Visual = visual;
Control control = visual as Control; Control control = visual as Control;
@ -28,5 +30,7 @@ namespace Perspex.Diagnostics.ViewModels
public bool IsInTemplate { get; private set; } public bool IsInTemplate { get; private set; }
public string Type { get; private set; } public string Type { get; private set; }
public IVisual Visual { get; private set; }
} }
} }

Loading…
Cancel
Save