BehaviorTreeViewModel.cs 1.8 KB

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