BehaviorTreeViewModel.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.Collections.ObjectModel;
  2. using System.ComponentModel.Composition;
  3. namespace Tree
  4. {
  5. [Export(contractType: typeof (BehaviorTreeViewModel)),
  6. PartCreationPolicy(creationPolicy: CreationPolicy.NonShared)]
  7. internal class BehaviorTreeViewModel
  8. {
  9. private readonly ObservableCollection<TreeNodeViewModel> treeNodes =
  10. new ObservableCollection<TreeNodeViewModel>();
  11. public ObservableCollection<TreeNodeViewModel> TreeNodes
  12. {
  13. get
  14. {
  15. return this.treeNodes;
  16. }
  17. }
  18. private TreeNodeViewModel Root
  19. {
  20. get
  21. {
  22. return this.treeNodes.Count == 0? null : this.treeNodes[0];
  23. }
  24. }
  25. public void Add(TreeNode treeNode, TreeNodeViewModel parent)
  26. {
  27. var treeNodeViewModel = new TreeNodeViewModel(treeNode, parent);
  28. this.treeNodes.Add(treeNodeViewModel);
  29. if (parent != null)
  30. {
  31. parent.Children.Add(treeNodeViewModel);
  32. }
  33. BehaviorTreeLayout.ExcuteLayout(this.Root);
  34. }
  35. private void RecursionRemove(TreeNodeViewModel treeNodeViewModel)
  36. {
  37. for (int i = treeNodeViewModel.Children.Count - 1; i >= 0; --i)
  38. {
  39. this.RecursionRemove(treeNodeViewModel.Children[i]);
  40. }
  41. treeNodeViewModel.Parent.Children.Remove(treeNodeViewModel);
  42. this.treeNodes.Remove(treeNodeViewModel);
  43. }
  44. public void Remove(TreeNodeViewModel treeNodeViewModel)
  45. {
  46. this.RecursionRemove(treeNodeViewModel);
  47. BehaviorTreeLayout.ExcuteLayout(this.Root);
  48. }
  49. private void RecursionMove(TreeNodeViewModel treeNodeViewModel, double offsetX, double offsetY)
  50. {
  51. treeNodeViewModel.X += offsetX;
  52. treeNodeViewModel.Y += offsetY;
  53. foreach (var node in treeNodeViewModel.Children)
  54. {
  55. this.RecursionMove(node, offsetX, offsetY);
  56. }
  57. }
  58. public void Move(double offsetX, double offsetY)
  59. {
  60. this.RecursionMove(this.Root, offsetX, offsetY);
  61. }
  62. }
  63. }