| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- using System;
- using Avalonia.Controls;
- using Avalonia.VisualTree;
- namespace Avalonia.Diagnostics.ViewModels
- {
- internal class TreePageViewModel : ViewModelBase, IDisposable
- {
- private TreeNode _selected;
- private ControlDetailsViewModel _details;
- private string _propertyFilter;
- public TreePageViewModel(TreeNode[] nodes)
- {
- Nodes = nodes;
- }
- public TreeNode[] Nodes { get; protected set; }
- public TreeNode SelectedNode
- {
- get => _selected;
- set
- {
- if (Details != null)
- {
- _propertyFilter = Details.PropertyFilter;
- }
- if (RaiseAndSetIfChanged(ref _selected, value))
- {
- Details = value != null ?
- new ControlDetailsViewModel(value.Visual, _propertyFilter) :
- null;
- }
- }
- }
- public ControlDetailsViewModel Details
- {
- get => _details;
- private set
- {
- var oldValue = _details;
- if (RaiseAndSetIfChanged(ref _details, value))
- {
- oldValue?.Dispose();
- }
- }
- }
- public void Dispose() => _details?.Dispose();
- 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.Visual == control)
- {
- return node;
- }
- else
- {
- foreach (var child in node.Children)
- {
- var result = FindNode(child, control);
- if (result != null)
- {
- return result;
- }
- }
- }
- return null;
- }
- }
- }
|