LogicalTreeView.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright (c) The Perspex Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using System.Reactive.Linq;
  5. using Perspex.Controls;
  6. using Perspex.Controls.Templates;
  7. using Perspex.Diagnostics.ViewModels;
  8. using ReactiveUI;
  9. namespace Perspex.Diagnostics.Views
  10. {
  11. using Controls = Controls.Controls;
  12. internal class LogicalTreeView : TreePage
  13. {
  14. private static readonly PerspexProperty<LogicalTreeViewModel> ViewModelProperty =
  15. PerspexProperty.Register<LogicalTreeView, LogicalTreeViewModel>("ViewModel");
  16. public LogicalTreeView()
  17. {
  18. InitializeComponent();
  19. GetObservable(DataContextProperty)
  20. .Subscribe(x => ViewModel = (LogicalTreeViewModel)x);
  21. }
  22. public LogicalTreeViewModel ViewModel
  23. {
  24. get { return GetValue(ViewModelProperty); }
  25. private set { SetValue(ViewModelProperty, value); }
  26. }
  27. private void InitializeComponent()
  28. {
  29. TreeView tree;
  30. Content = new Grid
  31. {
  32. ColumnDefinitions = new ColumnDefinitions
  33. {
  34. new ColumnDefinition(1, GridUnitType.Star),
  35. new ColumnDefinition(4, GridUnitType.Pixel),
  36. new ColumnDefinition(3, GridUnitType.Star),
  37. },
  38. Children = new Controls
  39. {
  40. (tree = new TreeView
  41. {
  42. DataTemplates = new DataTemplates
  43. {
  44. new FuncTreeDataTemplate<LogicalTreeNode>(GetHeader, x => x.Children),
  45. },
  46. [!ItemsControl.ItemsProperty] = this.WhenAnyValue(x => x.ViewModel.Nodes),
  47. }),
  48. new GridSplitter
  49. {
  50. Width = 4,
  51. Orientation = Orientation.Vertical,
  52. [Grid.ColumnProperty] = 1,
  53. },
  54. new ContentControl
  55. {
  56. [!ContentProperty] = this.WhenAnyValue(x => x.ViewModel.Details),
  57. [Grid.ColumnProperty] = 2,
  58. }
  59. }
  60. };
  61. tree.GetObservable(TreeView.SelectedItemProperty)
  62. .OfType<LogicalTreeNode>()
  63. .Subscribe(x => ViewModel.SelectedNode = x);
  64. }
  65. private Control GetHeader(LogicalTreeNode node)
  66. {
  67. var result = new StackPanel
  68. {
  69. Orientation = Orientation.Horizontal,
  70. Gap = 8,
  71. Children = new Controls
  72. {
  73. new TextBlock
  74. {
  75. Text = node.Type,
  76. },
  77. new TextBlock
  78. {
  79. [!TextBlock.TextProperty] = node.WhenAnyValue(x => x.Classes),
  80. }
  81. }
  82. };
  83. result.PointerEnter += AddAdorner;
  84. result.PointerLeave += RemoveAdorner;
  85. return result;
  86. }
  87. }
  88. }