Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorMapMark / MapEditorMapMarkPanel.cs
@小李xl 小李xl on 15 Aug 2023 8 KB 创建房间标记, 开发中
  1. using System.Collections.Generic;
  2. using Godot;
  3. using UI.MapEditor;
  4.  
  5. namespace UI.MapEditorMapMark;
  6.  
  7. public partial class MapEditorMapMarkPanel : MapEditorMapMark
  8. {
  9. public enum SelectToolType
  10. {
  11. None,
  12. Wave,
  13. Mark
  14. }
  15. /// <summary>
  16. /// 选中的cell选项
  17. /// </summary>
  18. public IUiCell SelectCell { get; private set; }
  19.  
  20. /// <summary>
  21. /// Cell 上的工具类型
  22. /// </summary>
  23. public SelectToolType ToolType { get; private set; } = SelectToolType.None;
  24. /// <summary>
  25. /// 编辑器Tile对象
  26. /// </summary>
  27. public EditorTileMap EditorTileMap { get; private set; }
  28. //波数网格组件
  29. private UiGrid<WaveItem, List<MarkInfo>> _grid;
  30. private EventFactory _eventFactory;
  31.  
  32. public override void OnCreateUi()
  33. {
  34. var editorPanel = (MapEditorPanel)ParentUi;
  35. EditorTileMap = editorPanel.S_TileMap.Instance;
  36.  
  37. //S_DynamicTool.Instance.GetParent().RemoveChild(S_DynamicTool.Instance);
  38. S_DynamicTool.Instance.Visible = false;
  39. _grid = new UiGrid<WaveItem, List<MarkInfo>>(S_WaveItem, typeof(EditorWaveCell));
  40. _grid.SetCellOffset(new Vector2I(0, 10));
  41. _grid.SetColumns(1);
  42.  
  43. S_PreinstallOption.Instance.ItemSelected += OnItemSelected;
  44. S_AddPreinstall.Instance.Pressed += OnAddPreinstall;
  45. S_AddWaveButton.Instance.Pressed += OnAddWave;
  46.  
  47. S_EditButton.Instance.Pressed += OnToolEditClick;
  48. S_DeleteButton.Instance.Pressed += OnToolDeleteClick;
  49. }
  50.  
  51. public override void OnShowUi()
  52. {
  53. _eventFactory = EventManager.CreateEventFactory();
  54. _eventFactory.AddEventListener(EventEnum.OnSelectMark, OnSelectMark);
  55. RefreshPreinstallSelect();
  56. }
  57.  
  58. public override void OnHideUi()
  59. {
  60. _eventFactory.RemoveAllEventListener();
  61. _eventFactory = null;
  62. }
  63.  
  64. public override void OnDestroyUi()
  65. {
  66. _grid.Destroy();
  67. }
  68.  
  69. //选中标记回调
  70. private void OnSelectMark(object arg)
  71. {
  72. if (arg is MarkInfo markInfo && (SelectCell is not EditorMarkCell || (SelectCell is EditorMarkCell markCell && markCell.Data != markInfo)))
  73. {
  74. var selectPreinstall = GetSelectPreinstall();
  75. if (selectPreinstall != null)
  76. {
  77. for (var i = 0; i < selectPreinstall.WaveList.Count; i++)
  78. {
  79. var wave = selectPreinstall.WaveList[i];
  80. for (var j = 0; j < wave.Count; j++)
  81. {
  82. var tempMark = wave[j];
  83. if (tempMark == markInfo)
  84. {
  85. var waveCell = (EditorWaveCell)_grid.GetCell(i);
  86. var cell = (EditorMarkCell)waveCell.MarkGrid.GetCell(j);
  87. //如果没有展开, 则调用展开方法
  88. if (!waveCell.IsExpand())
  89. {
  90. waveCell.OnExpandOrClose();
  91. }
  92. //选中物体
  93. SetSelectCell(cell, cell.CellNode.Instance, SelectToolType.Mark);
  94. }
  95. }
  96. }
  97. }
  98. }
  99. }
  100. /// <summary>
  101. /// 获取当前选中的预设
  102. /// </summary>
  103. public RoomPreinstall GetSelectPreinstall()
  104. {
  105. var index = S_PreinstallOption.Instance.Selected;
  106. var preinstall = EditorTileMap.RoomSplit.Preinstall;
  107. if (index >= preinstall.Count)
  108. {
  109. return null;
  110. }
  111. return preinstall[index];
  112. }
  113.  
  114. /// <summary>
  115. /// 刷新预设下拉框
  116. /// </summary>
  117. public void RefreshPreinstallSelect(int index = -1)
  118. {
  119. var preinstall = EditorTileMap.RoomSplit.Preinstall;
  120. var optionButton = S_PreinstallOption.Instance;
  121. var selectIndex = index < 0 ? optionButton.Selected : index;
  122. optionButton.Clear();
  123. foreach (var item in preinstall)
  124. {
  125. if (item.WaveList == null)
  126. {
  127. item.WaveList = new List<List<MarkInfo>>();
  128. }
  129.  
  130. optionButton.AddItem($"{item.Name} ({item.Weight})");
  131. }
  132.  
  133. if (selectIndex == -1 && preinstall.Count > 0)
  134. {
  135. OnItemSelected(0);
  136. }
  137. else
  138. {
  139. OnItemSelected(selectIndex);
  140. }
  141. }
  142.  
  143. /// <summary>
  144. /// 下拉框选中项
  145. /// </summary>
  146. public void OnItemSelected(long index)
  147. {
  148. EditorTileMap.SelectPreinstallIndex = (int)index;
  149. var preinstall = EditorTileMap.RoomSplit.Preinstall;
  150. if (index >= 0 && index <= preinstall.Count)
  151. {
  152. _grid.SetDataList(preinstall[(int)index].WaveList.ToArray());
  153. }
  154. else
  155. {
  156. _grid.RemoveAll();
  157. }
  158. }
  159. /// <summary>
  160. /// 选中 cell, 并设置显示的工具
  161. /// </summary>
  162. /// <param name="uiCell">选中 cell 对象</param>
  163. /// <param name="toolRoot">按钮工具绑定的父节点</param>
  164. /// <param name="toolType">选择工具类型</param>
  165. public void SetSelectCell(IUiCell uiCell, Node toolRoot, SelectToolType toolType)
  166. {
  167. if (SelectCell == uiCell)
  168. {
  169. return;
  170. }
  171.  
  172. if (uiCell == null)
  173. {
  174. RemoveSelectCell();
  175. return;
  176. }
  177.  
  178. if (toolType == SelectToolType.Wave) //不需要显示编辑波数按钮
  179. {
  180. S_DynamicTool.L_EditButton.Instance.Visible = false;
  181. }
  182. else
  183. {
  184. S_DynamicTool.L_EditButton.Instance.Visible = true;
  185. }
  186.  
  187. //显示工具
  188. S_DynamicTool.Instance.Visible = true;
  189. //改变所在父节点
  190. var parent = S_DynamicTool.Instance.GetParent();
  191. if (parent != null)
  192. {
  193. parent.RemoveChild(S_DynamicTool.Instance);
  194. }
  195.  
  196. toolRoot.AddChild(S_DynamicTool.Instance);
  197. if (SelectCell != null)
  198. {
  199. SelectCell.OnUnSelect();
  200. }
  201. SelectCell = uiCell;
  202. ToolType = toolType;
  203. SelectCell.OnSelect();
  204. }
  205.  
  206. /// <summary>
  207. /// 移除选中的 cell 对象
  208. /// </summary>
  209. public void RemoveSelectCell()
  210. {
  211. if (SelectCell == null)
  212. {
  213. return;
  214. }
  215. var parent = S_DynamicTool.GetParent();
  216. if (parent != null)
  217. {
  218. parent.RemoveChild(S_DynamicTool.Instance);
  219. }
  220. SelectCell.OnUnSelect();
  221. SelectCell = null;
  222. }
  223.  
  224. /// <summary>
  225. /// 创建预设
  226. /// </summary>
  227. public void OnAddPreinstall()
  228. {
  229. var roomSplitPreinstall = EditorTileMap.RoomSplit.Preinstall;
  230. EditorWindowManager.ShowCreatePreinstall(roomSplitPreinstall, preinstall =>
  231. {
  232. roomSplitPreinstall.Add(preinstall);
  233. RefreshPreinstallSelect(roomSplitPreinstall.Count - 1);
  234. });
  235. }
  236.  
  237. /// <summary>
  238. /// 添加波数
  239. /// </summary>
  240. public void OnAddWave()
  241. {
  242. var index = S_PreinstallOption.Instance.Selected;
  243. if (index == -1)
  244. {
  245. EditorWindowManager.ShowTips("警告", "请先选择预设!");
  246. return;
  247. }
  248.  
  249. var preinstall = EditorTileMap.RoomSplit.Preinstall;
  250. if (index >= preinstall.Count)
  251. {
  252. EditorWindowManager.ShowTips("警告", "未知预设选项!");
  253. return;
  254. }
  255. var item = preinstall[index];
  256. var wave = new List<MarkInfo>();
  257. item.WaveList.Add(wave);
  258. _grid.Add(wave);
  259. }
  260.  
  261. //工具节点编辑按钮点击
  262. private void OnToolEditClick()
  263. {
  264. if (ToolType == SelectToolType.Mark)
  265. {
  266. OnEditMark();
  267. }
  268. }
  269. //工具节点删除按钮点击
  270. private void OnToolDeleteClick()
  271. {
  272. if (ToolType == SelectToolType.Wave)
  273. {
  274. OnDeleteWave();
  275. }
  276. else if (ToolType == SelectToolType.Mark)
  277. {
  278. OnDeleteMark();
  279. }
  280. }
  281.  
  282.  
  283. /// <summary>
  284. /// 删除波数据
  285. /// </summary>
  286. public void OnDeleteWave()
  287. {
  288. var index = EditorTileMap.SelectWaveIndex;
  289. if (index < 0)
  290. {
  291. return;
  292. }
  293. var selectPreinstall = GetSelectPreinstall();
  294. if (selectPreinstall == null)
  295. {
  296. return;
  297. }
  298. //隐藏工具
  299. S_DynamicTool.Reparent(this);
  300. S_DynamicTool.Instance.Visible = false;
  301. //移除数据
  302. selectPreinstall.WaveList.RemoveAt(index);
  303. _grid.RemoveByIndex(index);
  304. EditorTileMap.SelectWaveIndex = -1;
  305. }
  306.  
  307. /// <summary>
  308. /// 添加标记
  309. /// </summary>
  310. public void OnAddMark()
  311. {
  312. }
  313. /// <summary>
  314. /// 编辑标记数据
  315. /// </summary>
  316. public void OnEditMark()
  317. {
  318. }
  319. /// <summary>
  320. /// 删除标记数据
  321. /// </summary>
  322. public void OnDeleteMark()
  323. {
  324. }
  325. }