BehaviorTreeView.xaml.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. using System;
  2. using System.ComponentModel.Composition;
  3. using System.Windows;
  4. using System.Windows.Input;
  5. using Infrastructure;
  6. using Logger;
  7. namespace Tree
  8. {
  9. /// <summary>
  10. /// BehaviorTreeView.xaml 的交互逻辑
  11. /// </summary>
  12. [ViewExport(RegionName = "BehaviorTreeRegion"), PartCreationPolicy(CreationPolicy.NonShared)]
  13. public partial class BehaviorTreeView
  14. {
  15. private const double DragThreshold = 5;
  16. private bool isDragging;
  17. private bool isLeftButtonDown;
  18. private Point origMouseDownPoint;
  19. private TreeNodeViewModel moveFromNode;
  20. public BehaviorTreeView()
  21. {
  22. this.InitializeComponent();
  23. }
  24. [Import]
  25. private BehaviorTreeViewModel ViewModel
  26. {
  27. get
  28. {
  29. return this.DataContext as BehaviorTreeViewModel;
  30. }
  31. set
  32. {
  33. this.DataContext = value;
  34. }
  35. }
  36. private void MenuNode_New(object sender, ExecutedRoutedEventArgs e)
  37. {
  38. Point point = Mouse.GetPosition(this.listBox);
  39. // one root node
  40. if (this.ViewModel.TreeNodes.Count == 0)
  41. {
  42. var addTreeNode = new TreeNodeViewModel(point.X, point.Y)
  43. {
  44. Type = (int) NodeType.Selector
  45. };
  46. this.ViewModel.Add(addTreeNode, null);
  47. }
  48. else
  49. {
  50. if (this.listBox.SelectedItem != null)
  51. {
  52. var parentNode = this.listBox.SelectedItem as TreeNodeViewModel;
  53. var addTreeNode = new TreeNodeViewModel(parentNode)
  54. {
  55. Type = (int) NodeType.Selector
  56. };
  57. this.ViewModel.Add(addTreeNode, parentNode);
  58. }
  59. }
  60. this.listBox.SelectedItem = null;
  61. e.Handled = true;
  62. }
  63. private void MenuNode_Delete(object sender, ExecutedRoutedEventArgs e)
  64. {
  65. if (this.listBox.SelectedItem == null)
  66. {
  67. return;
  68. }
  69. var treeNodeViewModel = this.listBox.SelectedItem as TreeNodeViewModel;
  70. this.ViewModel.Remove(treeNodeViewModel);
  71. this.listBox.SelectedItem = null;
  72. e.Handled = true;
  73. }
  74. private void MenuNode_Save(object sender, ExecutedRoutedEventArgs e)
  75. {
  76. this.ViewModel.Save("node.bytes");
  77. }
  78. private void MenuNode_Open(object sender, ExecutedRoutedEventArgs e)
  79. {
  80. this.ViewModel.Load("node.bytes");
  81. }
  82. private void ListBoxItem_MouseDown(object sender, MouseButtonEventArgs e)
  83. {
  84. if (e.ChangedButton != MouseButton.Left)
  85. {
  86. return;
  87. }
  88. // 双击鼠标
  89. if (e.ClickCount == 2 && e.ChangedButton == MouseButton.Left)
  90. {
  91. var item = (FrameworkElement) sender;
  92. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  93. if (treeNodeViewModel.IsFolder)
  94. {
  95. this.ViewModel.UnFold(treeNodeViewModel);
  96. }
  97. else
  98. {
  99. this.ViewModel.Fold(treeNodeViewModel);
  100. }
  101. }
  102. e.Handled = true;
  103. }
  104. private void ListBoxItem_MouseUp(object sender, MouseButtonEventArgs e)
  105. {
  106. if (!this.isLeftButtonDown)
  107. {
  108. this.isDragging = false;
  109. return;
  110. }
  111. var item = (FrameworkElement) sender;
  112. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  113. if (!this.isDragging)
  114. {
  115. this.listBox.SelectedItem = treeNodeViewModel;
  116. }
  117. this.isLeftButtonDown = false;
  118. this.isDragging = false;
  119. item.ReleaseMouseCapture();
  120. e.Handled = true;
  121. }
  122. private void ListBoxItem_MouseMove(object sender, MouseEventArgs e)
  123. {
  124. var item = (FrameworkElement) sender;
  125. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  126. if (treeNodeViewModel == null)
  127. {
  128. return;
  129. }
  130. Point curMouseDownPoint;
  131. Vector dragDelta;
  132. // 拖动根节点,移动整个树
  133. if (this.isDragging && treeNodeViewModel.IsRoot)
  134. {
  135. if (this.moveFromNode == null || !this.moveFromNode.IsRoot)
  136. {
  137. return;
  138. }
  139. curMouseDownPoint = e.GetPosition(this);
  140. dragDelta = curMouseDownPoint - this.origMouseDownPoint;
  141. this.origMouseDownPoint = curMouseDownPoint;
  142. this.ViewModel.MoveToPosition(dragDelta.X, dragDelta.Y);
  143. return;
  144. }
  145. if (e.LeftButton != MouseButtonState.Pressed)
  146. {
  147. this.isDragging = false;
  148. this.moveFromNode = null;
  149. return;
  150. }
  151. curMouseDownPoint = e.GetPosition(this);
  152. dragDelta = curMouseDownPoint - this.origMouseDownPoint;
  153. double dragDistance = Math.Abs(dragDelta.Length);
  154. if (dragDistance > DragThreshold)
  155. {
  156. this.isDragging = true;
  157. }
  158. e.Handled = true;
  159. }
  160. private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseEventArgs e)
  161. {
  162. this.origMouseDownPoint = e.GetPosition(this);
  163. var item = (FrameworkElement) sender;
  164. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  165. this.listBox.SelectedItem = treeNodeViewModel;
  166. this.moveFromNode = treeNodeViewModel;
  167. this.nodeDataEditor.DataContext = treeNodeViewModel;
  168. }
  169. private void ListBoxItem_PreviewMouseLeftButtonUp(object sender, MouseEventArgs e)
  170. {
  171. if (this.moveFromNode == null)
  172. {
  173. return;
  174. }
  175. if (this.moveFromNode.IsRoot)
  176. {
  177. return;
  178. }
  179. var item = (FrameworkElement) sender;
  180. var moveToNode = item.DataContext as TreeNodeViewModel;
  181. Log.Debug("move to node: {0} {1}", this.moveFromNode.Id, moveToNode.Id);
  182. if (this.moveFromNode.Id == moveToNode.Id)
  183. {
  184. return;
  185. }
  186. this.ViewModel.MoveToNode(this.moveFromNode, moveToNode);
  187. this.moveFromNode = null;
  188. }
  189. }
  190. }