Browse Source

Select node when ctrl+shift held down.

TreeView selection isn't getting updated though.
pull/403/head
Steven Kirk 11 years ago
parent
commit
14b349e006
  1. 12
      src/Perspex.Diagnostics/DevTools.paml.cs
  2. 10
      src/Perspex.Diagnostics/ViewModels/DevToolsViewModel.cs
  3. 8
      src/Perspex.Diagnostics/ViewModels/LogicalTreeNode.cs
  4. 17
      src/Perspex.Diagnostics/ViewModels/TreeNode.cs
  5. 69
      src/Perspex.Diagnostics/ViewModels/TreePageViewModel.cs
  6. 10
      src/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs
  7. 4
      src/Perspex.Diagnostics/Views/TreePageView.paml

12
src/Perspex.Diagnostics/DevTools.paml.cs

@ -19,6 +19,7 @@ namespace Perspex.Diagnostics
InitializeComponent();
Root = root;
DataContext = new DevToolsViewModel(root);
Root.PointerMoved += RootPointerMoved;
}
public IControl Root { get; }
@ -76,5 +77,16 @@ namespace Perspex.Diagnostics
{
PerspexXamlLoader.Load(this);
}
private void RootPointerMoved(object sender, PointerEventArgs e)
{
var modifiers = InputModifiers.Control | InputModifiers.Shift;
if ((e.InputModifiers & modifiers) == modifiers)
{
var vm = (DevToolsViewModel)DataContext;
vm.SelectControl((IControl)e.Source);
}
}
}
}

10
src/Perspex.Diagnostics/ViewModels/DevToolsViewModel.cs

@ -69,5 +69,15 @@ namespace Perspex.Diagnostics.ViewModels
public string FocusedControl => _focusedControl.Value;
public string PointerOverElement => _pointerOverElement.Value;
public void SelectControl(IControl control)
{
var tree = Content as TreePageViewModel;
if (tree != null)
{
tree.SelectControl(control);
}
}
}
}

8
src/Perspex.Diagnostics/ViewModels/LogicalTreeNode.cs

@ -9,16 +9,16 @@ namespace Perspex.Diagnostics.ViewModels
{
internal class LogicalTreeNode : TreeNode
{
public LogicalTreeNode(ILogical logical)
: base((Control)logical)
public LogicalTreeNode(ILogical logical, TreeNode parent)
: base((Control)logical, parent)
{
Children = logical.LogicalChildren.CreateDerivedCollection(x => new LogicalTreeNode(x));
Children = logical.LogicalChildren.CreateDerivedCollection(x => new LogicalTreeNode(x, this));
}
public static LogicalTreeNode[] Create(object control)
{
var logical = control as ILogical;
return logical != null ? new[] { new LogicalTreeNode(logical) } : null;
return logical != null ? new[] { new LogicalTreeNode(logical, null) } : null;
}
}
}

17
src/Perspex.Diagnostics/ViewModels/TreeNode.cs

@ -13,11 +13,12 @@ namespace Perspex.Diagnostics.ViewModels
internal class TreeNode : ReactiveObject
{
private string _classes;
private bool _isExpanded = true;
private bool _isExpanded;
public TreeNode(Control control)
public TreeNode(Control control, TreeNode parent)
{
Control = control;
Parent = parent;
Type = control.GetType().Name;
var classesChanged = Observable.FromEventPattern<
@ -53,19 +54,23 @@ namespace Perspex.Diagnostics.ViewModels
private set { this.RaiseAndSetIfChanged(ref _classes, value); }
}
public Control Control
{
get;
}
public bool IsExpanded
{
get { return _isExpanded; }
private set { this.RaiseAndSetIfChanged(ref _isExpanded, value); }
set { this.RaiseAndSetIfChanged(ref _isExpanded, value); }
}
public string Type
public TreeNode Parent
{
get;
private set;
}
public Control Control
public string Type
{
get;
private set;

69
src/Perspex.Diagnostics/ViewModels/TreePageViewModel.cs

@ -2,6 +2,8 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.VisualTree;
using ReactiveUI;
namespace Perspex.Diagnostics.ViewModels
@ -29,5 +31,72 @@ namespace Perspex.Diagnostics.ViewModels
}
public ControlDetailsViewModel Details => _details.Value;
public TreeNode FindNode(IControl control)
{
foreach (var node in Nodes)
{
var result = FindNode(node, control);
if (result != null)
{
return result;
}
}
return null;
}
public void SelectControl(IControl control)
{
var node = default(TreeNode);
while (node == null && control != null)
{
node = FindNode(control);
if (node == null)
{
control = control.GetVisualParent<IControl>();
}
}
if (node != null)
{
SelectedNode = node;
ExpandNode(node.Parent);
}
}
private void ExpandNode(TreeNode node)
{
if (node != null)
{
node.IsExpanded = true;
ExpandNode(node.Parent);
}
}
private TreeNode FindNode(TreeNode node, IControl control)
{
if (node.Control == control)
{
return node;
}
else
{
foreach (var child in node.Children)
{
var result = FindNode(child, control);
if (result != null)
{
return result;
}
}
}
return null;
}
}
}

10
src/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs

@ -9,18 +9,18 @@ namespace Perspex.Diagnostics.ViewModels
{
internal class VisualTreeNode : TreeNode
{
public VisualTreeNode(IVisual visual)
: base((Control)visual)
public VisualTreeNode(IVisual visual, TreeNode parent)
: base((Control)visual, parent)
{
var host = visual as IVisualTreeHost;
if (host?.Root == null)
{
Children = visual.VisualChildren.CreateDerivedCollection(x => new VisualTreeNode(x));
Children = visual.VisualChildren.CreateDerivedCollection(x => new VisualTreeNode(x, this));
}
else
{
Children = new ReactiveList<VisualTreeNode>(new[] { new VisualTreeNode(host.Root) });
Children = new ReactiveList<VisualTreeNode>(new[] { new VisualTreeNode(host.Root, this) });
}
if (Control != null)
@ -34,7 +34,7 @@ namespace Perspex.Diagnostics.ViewModels
public static VisualTreeNode[] Create(object control)
{
var visual = control as IVisual;
return visual != null ? new[] { new VisualTreeNode(visual) } : null;
return visual != null ? new[] { new VisualTreeNode(visual, null) } : null;
}
}
}

4
src/Perspex.Diagnostics/Views/TreePageView.paml

@ -11,11 +11,11 @@
</StackPanel>
</TreeDataTemplate>
</TreeView.DataTemplates>
<!--<TreeView.Styles>
<TreeView.Styles>
<Style Selector="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
</Style>
</TreeView.Styles>-->
</TreeView.Styles>
</TreeView>
<GridSplitter Width="4" Orientation="Vertical" Grid.Column="1"/>

Loading…
Cancel
Save