SceneEditPanel.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. using CommonLang;
  2. using CommonLang.Geometry;
  3. using CommonLang.Geometry.SceneGraph2D;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. namespace CommonFroms.SceneGraph2D.Edit
  11. {
  12. public class SceneEditPanel : Win32ScenePanel
  13. {
  14. /// <summary>
  15. /// 开始拖拽时距离
  16. /// </summary>
  17. public static float DRAG_MOVE_START_DISTANCE = 4.0f;
  18. public SceneEditPanel()
  19. {
  20. }
  21. protected override void OnLoad(EventArgs e)
  22. {
  23. base.OnLoad(e);
  24. this.AutoUpdate = false;
  25. }
  26. //--------------------------------------------------------------------------------------
  27. protected override DisplayRoot CreateRoot()
  28. {
  29. return new EditorDisplayRoot(this);
  30. }
  31. public class EditorDisplayRoot : DisplayRoot
  32. {
  33. private readonly SceneEditPanel panel;
  34. private Brush bg_brush = new TextureBrush(global::CommonFroms.Properties.Resources.canvasBg2);
  35. private Pen bg_pen = new Pen(System.Drawing.Color.Black);
  36. internal EditorDisplayRoot(SceneEditPanel panel)
  37. {
  38. this.panel = panel;
  39. }
  40. public override void Visit(IGraphics g)
  41. {
  42. {
  43. var pos = Translation;
  44. pos.X = Math.Min(pos.X, panel.canvas.Width);
  45. pos.X = Math.Max(pos.X, 0);
  46. pos.Y = Math.Min(pos.Y, panel.canvas.Height);
  47. pos.Y = Math.Max(pos.Y, 0);
  48. var gfx = (g as Win32Graphics).gfx;
  49. gfx.TranslateTransform(pos.X, pos.Y);
  50. gfx.FillRectangle(bg_brush, -panel.Width, -panel.Height, panel.Width << 1, panel.Height << 1);
  51. gfx.DrawLine(bg_pen, -panel.canvas.Width, 0, panel.canvas.Width, 0);
  52. gfx.DrawLine(bg_pen, 0, -panel.canvas.Height, 0, panel.canvas.Height);
  53. gfx.TranslateTransform(-pos.X, -pos.Y);
  54. }
  55. this.Rotation = 0f;
  56. base.Visit(g);
  57. //this.Translation = new Vector2(cx, cy);
  58. //this.Scale = new Vector2(1f, 1f);
  59. }
  60. protected override void OnDrawBegin(IGraphics g)
  61. {
  62. base.OnDrawBegin(g);
  63. var gfx = (g as Win32Graphics).gfx;
  64. }
  65. }
  66. //--------------------------------------------------------------------------------------
  67. protected override void canvas_Paint(object sender, PaintEventArgs e)
  68. {
  69. var g = e.Graphics;
  70. base.canvas_Paint(sender, e);
  71. using (var list = ListObjectPool<DisplayNode>.AllocAutoRelease())
  72. {
  73. RootNode.GetChildren(list, true);
  74. foreach (var node in list)
  75. {
  76. if (node is EditorNode)
  77. {
  78. (node as EditorNode).VisitHUD(g);
  79. }
  80. }
  81. }
  82. }
  83. //--------------------------------------------------------------------------------------
  84. #region Selection
  85. private bool multi_select = true;
  86. public bool IsMultiSelect
  87. {
  88. get { return multi_select; }
  89. set
  90. {
  91. if (value != multi_select)
  92. {
  93. multi_select = value;
  94. if (!value)
  95. {
  96. if (selected_list.Count > 0)
  97. {
  98. SelectNode(selected_list[0]);
  99. }
  100. }
  101. }
  102. }
  103. }
  104. private List<EditorNode> selected_list = new List<EditorNode>();
  105. private HashMap<EditorNode, Vector2> selected_list_old_pos = new HashMap<EditorNode, Vector2>();
  106. public EditorNode[] SelectedNodes
  107. {
  108. get { return selected_list.ToArray(); }
  109. }
  110. private EditorNode last_mouse_down_node;
  111. protected override void canvas_MouseDown(object sender, MouseEventArgs e)
  112. {
  113. var rpos = CanvasMouseToRoot(e.Location);
  114. var hitted = RootNode.HitTest(rpos);
  115. this.last_mouse_down_node = hitted as EditorNode;
  116. if (e.Button == MouseButtons.Left)
  117. {
  118. if (IsMultiSelect && Keyboard.IsCtrlDown)
  119. {
  120. AddSelectNode(hitted);
  121. }
  122. else
  123. {
  124. SelectNode(hitted);
  125. }
  126. }
  127. }
  128. protected override void canvas_MouseMove(object sender, MouseEventArgs e)
  129. {
  130. var rpos = CanvasMouseToRoot(e.Location);
  131. var hitted = RootNode.HitTest(rpos);
  132. if (e.Button == MouseButtons.None)
  133. {
  134. PickNode(hitted);
  135. }
  136. else
  137. {
  138. PickNode(null);
  139. if (e.Button == MouseButtons.Left)
  140. {
  141. if (selected_list.Count > 0)
  142. {
  143. }
  144. }
  145. }
  146. }
  147. protected override void canvas_MouseUp(object sender, MouseEventArgs e)
  148. {
  149. }
  150. private void PickNode(DisplayNode hitted)
  151. {
  152. RootNode.ForEachChildren((c) =>
  153. {
  154. if (c is EditorNode)
  155. {
  156. var ec = (c as EditorNode);
  157. ec.IsPicked = (ec.IsPickable) && (c == hitted);
  158. }
  159. return false;
  160. }, true);
  161. }
  162. public void AddSelectNode(DisplayNode hitted)
  163. {
  164. if (selected_list.Count > 0 && !IsMultiSelect)
  165. {
  166. return;
  167. }
  168. RootNode.ForEachChildren((c) =>
  169. {
  170. if (c is EditorNode)
  171. {
  172. var se = (c as EditorNode);
  173. if (c == hitted && se.IsSelectable)
  174. {
  175. se.IsSelected = true;
  176. if (!selected_list.Contains(se))
  177. {
  178. selected_list.Add(se);
  179. }
  180. }
  181. }
  182. return false;
  183. }, true);
  184. }
  185. public void SelectNode(DisplayNode hitted)
  186. {
  187. selected_list.Clear();
  188. RootNode.ForEachChildren((c) =>
  189. {
  190. if (c is EditorNode)
  191. {
  192. var se = (c as EditorNode);
  193. if (c == hitted && se.IsSelectable)
  194. {
  195. se.IsSelected = true;
  196. selected_list.Add(se);
  197. }
  198. else
  199. {
  200. se.IsSelected = false;
  201. }
  202. }
  203. return false;
  204. }, true);
  205. }
  206. #endregion
  207. }
  208. }