TreePageViewModel.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System;
  2. using Avalonia.Controls;
  3. using Avalonia.VisualTree;
  4. namespace Avalonia.Diagnostics.ViewModels
  5. {
  6. internal class TreePageViewModel : ViewModelBase, IDisposable
  7. {
  8. private TreeNode _selected;
  9. private ControlDetailsViewModel _details;
  10. private string _propertyFilter;
  11. public TreePageViewModel(TreeNode[] nodes)
  12. {
  13. Nodes = nodes;
  14. }
  15. public TreeNode[] Nodes { get; protected set; }
  16. public TreeNode SelectedNode
  17. {
  18. get => _selected;
  19. set
  20. {
  21. if (Details != null)
  22. {
  23. _propertyFilter = Details.PropertyFilter;
  24. }
  25. if (RaiseAndSetIfChanged(ref _selected, value))
  26. {
  27. Details = value != null ?
  28. new ControlDetailsViewModel(value.Visual, _propertyFilter) :
  29. null;
  30. }
  31. }
  32. }
  33. public ControlDetailsViewModel Details
  34. {
  35. get => _details;
  36. private set
  37. {
  38. var oldValue = _details;
  39. if (RaiseAndSetIfChanged(ref _details, value))
  40. {
  41. oldValue?.Dispose();
  42. }
  43. }
  44. }
  45. public void Dispose() => _details?.Dispose();
  46. public TreeNode FindNode(IControl control)
  47. {
  48. foreach (var node in Nodes)
  49. {
  50. var result = FindNode(node, control);
  51. if (result != null)
  52. {
  53. return result;
  54. }
  55. }
  56. return null;
  57. }
  58. public void SelectControl(IControl control)
  59. {
  60. var node = default(TreeNode);
  61. while (node == null && control != null)
  62. {
  63. node = FindNode(control);
  64. if (node == null)
  65. {
  66. control = control.GetVisualParent<IControl>();
  67. }
  68. }
  69. if (node != null)
  70. {
  71. SelectedNode = node;
  72. ExpandNode(node.Parent);
  73. }
  74. }
  75. private void ExpandNode(TreeNode node)
  76. {
  77. if (node != null)
  78. {
  79. node.IsExpanded = true;
  80. ExpandNode(node.Parent);
  81. }
  82. }
  83. private TreeNode FindNode(TreeNode node, IControl control)
  84. {
  85. if (node.Visual == control)
  86. {
  87. return node;
  88. }
  89. else
  90. {
  91. foreach (var child in node.Children)
  92. {
  93. var result = FindNode(child, control);
  94. if (result != null)
  95. {
  96. return result;
  97. }
  98. }
  99. }
  100. return null;
  101. }
  102. }
  103. }