Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorMapMark / MapEditorMapMarkPanel.cs
  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.  
  16. public class MarkCellData
  17. {
  18. /// <summary>
  19. /// 所在的父级 Cell
  20. /// </summary>
  21. public EditorWaveCell ParentCell;
  22. /// <summary>
  23. /// 标记数据对象
  24. /// </summary>
  25. public MarkInfo MarkInfo;
  26. /// <summary>
  27. /// 是否提前加载
  28. /// </summary>
  29. public bool Preloading;
  30.  
  31. public MarkCellData(EditorWaveCell parentCell, MarkInfo markInfo, bool preloading)
  32. {
  33. ParentCell = parentCell;
  34. MarkInfo = markInfo;
  35. Preloading = preloading;
  36. }
  37. }
  38. /// <summary>
  39. /// 选中的cell选项
  40. /// </summary>
  41. public IUiCell SelectCell { get; private set; }
  42.  
  43. /// <summary>
  44. /// Cell 上的工具类型
  45. /// </summary>
  46. public SelectToolType ToolType { get; private set; } = SelectToolType.None;
  47. /// <summary>
  48. /// 编辑器Tile对象
  49. /// </summary>
  50. public EditorTileMap EditorTileMap { get; private set; }
  51. //波数网格组件
  52. private UiGrid<WaveItem, List<MarkInfo>> _grid;
  53. private EventFactory _eventFactory;
  54.  
  55. public override void OnCreateUi()
  56. {
  57. var editorPanel = (MapEditorPanel)ParentUi;
  58. EditorTileMap = editorPanel.S_TileMap.Instance;
  59.  
  60. //S_DynamicTool.Instance.GetParent().RemoveChild(S_DynamicTool.Instance);
  61. S_DynamicTool.Instance.Visible = false;
  62. _grid = new UiGrid<WaveItem, List<MarkInfo>>(S_WaveItem, typeof(EditorWaveCell));
  63. _grid.SetCellOffset(new Vector2I(0, 10));
  64. _grid.SetColumns(1);
  65.  
  66. S_PreinstallOption.Instance.ItemSelected += OnItemSelected;
  67. S_AddPreinstall.Instance.Pressed += OnAddPreinstall;
  68. S_EditPreinstall.Instance.Pressed += OnEditPreinstall;
  69. S_DeletePreinstall.Instance.Pressed += OnDeletePreinstall;
  70. S_AddWaveButton.Instance.Pressed += OnAddWave;
  71.  
  72. S_EditButton.Instance.Pressed += OnToolEditClick;
  73. S_DeleteButton.Instance.Pressed += OnToolDeleteClick;
  74. _eventFactory = EventManager.CreateEventFactory();
  75. _eventFactory.AddEventListener(EventEnum.OnSelectMark, OnSelectMark);
  76. RefreshPreinstallSelect();
  77. }
  78.  
  79. public override void OnDestroyUi()
  80. {
  81. _eventFactory.RemoveAllEventListener();
  82. _eventFactory = null;
  83. _grid.Destroy();
  84. }
  85.  
  86. //选中标记回调
  87. private void OnSelectMark(object arg)
  88. {
  89. if (arg is MarkInfo markInfo && (SelectCell is not EditorMarkCell || (SelectCell is EditorMarkCell markCell && markCell.Data.MarkInfo != markInfo)))
  90. {
  91. var selectPreinstall = GetSelectPreinstall();
  92. if (selectPreinstall != null)
  93. {
  94. var waveCells = _grid.GetAllCell();
  95. foreach (var waveCell in waveCells)
  96. {
  97. var tempWaveCell = (EditorWaveCell)waveCell;
  98. var markCells = tempWaveCell.MarkGrid.GetAllCell();
  99. for (var i = 0; i < markCells.Length; i++)
  100. {
  101. var tempMarkCell = (EditorMarkCell)markCells[i];
  102. if (tempMarkCell.Data.MarkInfo == markInfo)
  103. {
  104. //如果没有展开, 则调用展开方法
  105. if (!tempWaveCell.IsExpand())
  106. {
  107. tempWaveCell.OnExpandOrClose();
  108. }
  109. //选中物体
  110. tempMarkCell.OnClick();
  111. return;
  112. }
  113. }
  114. }
  115. }
  116. }
  117. }
  118. /// <summary>
  119. /// 获取当前选中的预设
  120. /// </summary>
  121. public RoomPreinstallInfo GetSelectPreinstall()
  122. {
  123. var index = S_PreinstallOption.Instance.Selected;
  124. var preinstall = EditorManager.SelectRoom.Preinstall;
  125. if (index >= preinstall.Count)
  126. {
  127. return null;
  128. }
  129. return preinstall[index];
  130. }
  131.  
  132. /// <summary>
  133. /// 刷新预设下拉框
  134. /// </summary>
  135. public void RefreshPreinstallSelect(int index = -1)
  136. {
  137. var preinstall = EditorManager.SelectRoom.Preinstall;
  138. var optionButton = S_PreinstallOption.Instance;
  139. var selectIndex = index < 0 ? (preinstall.Count > 0 ? 0 : -1) : index;
  140. optionButton.Clear();
  141. foreach (var item in preinstall)
  142. {
  143. if (item.WaveList == null)
  144. {
  145. item.InitWaveList();
  146. }
  147.  
  148. optionButton.AddItem($"{item.Name} ({item.Weight})");
  149. }
  150. //下拉框选中项
  151. optionButton.Selected = selectIndex;
  152. OnItemSelected(selectIndex);
  153. }
  154.  
  155. /// <summary>
  156. /// 下拉框选中项
  157. /// </summary>
  158. public void OnItemSelected(long index)
  159. {
  160. //清除选中项
  161. RemoveSelectCell();
  162. EditorManager.SetSelectWaveIndex(-1);
  163. //记录选中波数
  164. EditorManager.SetSelectPreinstallIndex((int)index);
  165. var preinstall = EditorManager.SelectRoom.Preinstall;
  166. if (index >= 0 && index <= preinstall.Count)
  167. {
  168. _grid.SetDataList(preinstall[(int)index].WaveList.ToArray());
  169. }
  170. else
  171. {
  172. _grid.RemoveAll();
  173. }
  174. }
  175. /// <summary>
  176. /// 选中 cell, 并设置显示的工具
  177. /// </summary>
  178. /// <param name="uiCell">选中 cell 对象</param>
  179. /// <param name="toolRoot">按钮工具绑定的父节点</param>
  180. /// <param name="toolType">选择工具类型</param>
  181. public void SetSelectCell(IUiCell uiCell, Node toolRoot, SelectToolType toolType)
  182. {
  183. if (SelectCell == uiCell)
  184. {
  185. return;
  186. }
  187.  
  188. if (uiCell == null)
  189. {
  190. RemoveSelectCell();
  191. return;
  192. }
  193.  
  194. if (toolType == SelectToolType.Wave)
  195. {
  196. //不需要显示编辑波数按钮
  197. S_DynamicTool.L_EditButton.Instance.Visible = false;
  198. //预加载波不能删除
  199. S_DynamicTool.L_DeleteButton.Instance.Visible = uiCell.Index != 0;
  200. }
  201. else //显示编辑按钮
  202. {
  203. var markCell = (EditorMarkCell)uiCell;
  204. var markType = markCell.Data.MarkInfo.SpecialMarkType;
  205. if (markType == SpecialMarkType.BirthPoint) //某些特殊标记不能删除
  206. {
  207. S_DynamicTool.L_EditButton.Instance.Visible = true;
  208. S_DynamicTool.L_DeleteButton.Instance.Visible = false;
  209. }
  210. else //普通标记
  211. {
  212. S_DynamicTool.L_EditButton.Instance.Visible = true;
  213. S_DynamicTool.L_DeleteButton.Instance.Visible = true;
  214. }
  215. }
  216.  
  217. //显示工具
  218. S_DynamicTool.Instance.Visible = true;
  219. //改变所在父节点
  220. var parent = S_DynamicTool.Instance.GetParent();
  221. if (parent != null)
  222. {
  223. parent.RemoveChild(S_DynamicTool.Instance);
  224. }
  225.  
  226. toolRoot.AddChild(S_DynamicTool.Instance);
  227. if (SelectCell != null)
  228. {
  229. SelectCell.OnUnSelect();
  230. }
  231. SelectCell = uiCell;
  232. ToolType = toolType;
  233. SelectCell.OnSelect();
  234. }
  235.  
  236. /// <summary>
  237. /// 移除选中的 cell 对象
  238. /// </summary>
  239. public void RemoveSelectCell()
  240. {
  241. if (SelectCell == null)
  242. {
  243. return;
  244. }
  245. var parent = S_DynamicTool.GetParent();
  246. if (parent != null)
  247. {
  248. parent.RemoveChild(S_DynamicTool.Instance);
  249. }
  250. SelectCell.OnUnSelect();
  251. SelectCell = null;
  252. }
  253.  
  254. /// <summary>
  255. /// 创建预设
  256. /// </summary>
  257. public void OnAddPreinstall()
  258. {
  259. var roomInfoRoomType = EditorManager.SelectRoom.RoomInfo.RoomType;
  260. var roomSplitPreinstall = EditorManager.SelectRoom.Preinstall;
  261. EditorWindowManager.ShowCreatePreinstall(roomInfoRoomType, roomSplitPreinstall, preinstall =>
  262. {
  263. //创建逻辑
  264. roomSplitPreinstall.Add(preinstall);
  265. RefreshPreinstallSelect(roomSplitPreinstall.Count - 1);
  266. //派发数据修改事件
  267. EventManager.EmitEvent(EventEnum.OnEditorDirty);
  268. });
  269. }
  270.  
  271. /// <summary>
  272. /// 编辑预设
  273. /// </summary>
  274. public void OnEditPreinstall()
  275. {
  276. var roomInfoRoomType = EditorManager.SelectRoom.RoomInfo.RoomType;
  277. var roomSplitPreinstall = EditorManager.SelectRoom.Preinstall;
  278. var selectPreinstall = GetSelectPreinstall();
  279. EditorWindowManager.ShowEditPreinstall(roomInfoRoomType, roomSplitPreinstall, selectPreinstall, preinstall =>
  280. {
  281. //修改逻辑
  282. selectPreinstall.CloneFrom(preinstall);
  283. //修改下拉菜单数据
  284. var optionButton = S_PreinstallOption.Instance;
  285. optionButton.SetItemText(optionButton.Selected, $"{preinstall.Name} ({preinstall.Weight})");
  286. //派发数据修改事件
  287. EventManager.EmitEvent(EventEnum.OnEditorDirty);
  288. });
  289. }
  290.  
  291. /// <summary>
  292. /// 删除预设
  293. /// </summary>
  294. public void OnDeletePreinstall()
  295. {
  296. var index = EditorManager.SelectPreinstallIndex;
  297. if (index < 0)
  298. {
  299. return;
  300. }
  301. EditorWindowManager.ShowConfirm("提示", "是否删除当前预设?", v =>
  302. {
  303. if (v)
  304. {
  305. //先把选中项置为-1
  306. EditorManager.SetSelectPreinstallIndex(-1);
  307. //移除预设数据
  308. EditorManager.SelectRoom.Preinstall.RemoveAt(index);
  309. //刷新选项
  310. RefreshPreinstallSelect(EditorManager.SelectRoom.Preinstall.Count - 1);
  311. //派发数据修改事件
  312. EventManager.EmitEvent(EventEnum.OnEditorDirty);
  313. }
  314. });
  315. }
  316.  
  317. /// <summary>
  318. /// 添加波数
  319. /// </summary>
  320. public void OnAddWave()
  321. {
  322. var index = S_PreinstallOption.Instance.Selected;
  323. if (index == -1)
  324. {
  325. EditorWindowManager.ShowTips("警告", "请先选择预设!");
  326. return;
  327. }
  328.  
  329. var preinstall = EditorManager.SelectRoom.Preinstall;
  330. if (index >= preinstall.Count)
  331. {
  332. EditorWindowManager.ShowTips("警告", "未知预设选项!");
  333. return;
  334. }
  335. var item = preinstall[index];
  336. var wave = new List<MarkInfo>();
  337. item.WaveList.Add(wave);
  338. _grid.Add(wave);
  339. //派发数据修改事件
  340. EventManager.EmitEvent(EventEnum.OnEditorDirty);
  341. }
  342.  
  343. //工具节点编辑按钮点击
  344. private void OnToolEditClick()
  345. {
  346. if (ToolType == SelectToolType.Mark)
  347. {
  348. OnEditMark();
  349. }
  350. }
  351. //工具节点删除按钮点击
  352. private void OnToolDeleteClick()
  353. {
  354. if (ToolType == SelectToolType.Wave)
  355. {
  356. OnDeleteWave();
  357. }
  358. else if (ToolType == SelectToolType.Mark)
  359. {
  360. OnDeleteMark();
  361. }
  362. }
  363.  
  364.  
  365. /// <summary>
  366. /// 删除波数据
  367. /// </summary>
  368. public void OnDeleteWave()
  369. {
  370. var index = EditorManager.SelectWaveIndex;
  371. if (index < 0)
  372. {
  373. return;
  374. }
  375. var selectPreinstall = GetSelectPreinstall();
  376. if (selectPreinstall == null)
  377. {
  378. return;
  379. }
  380.  
  381. var wave = selectPreinstall.WaveList[index];
  382. EditorWindowManager.ShowConfirm("提示", $"是否删除当前波?\n当前波数包含{wave.Count}个标记", v =>
  383. {
  384. if (v)
  385. {
  386. //隐藏工具
  387. S_DynamicTool.Reparent(this);
  388. S_DynamicTool.Instance.Visible = false;
  389. //派发移除标记事件
  390. foreach (var markInfo in wave)
  391. {
  392. EventManager.EmitEvent(EventEnum.OnDeleteMark, markInfo);
  393. }
  394. //移除数据
  395. selectPreinstall.WaveList.RemoveAt(index);
  396. _grid.RemoveByIndex(index);
  397. EditorManager.SetSelectWaveIndex(-1);
  398. //派发数据修改事件
  399. EventManager.EmitEvent(EventEnum.OnEditorDirty);
  400. }
  401. });
  402. }
  403. /// <summary>
  404. /// 编辑标记数据
  405. /// </summary>
  406. public void OnEditMark()
  407. {
  408. if (SelectCell is EditorMarkCell markCell)
  409. {
  410. var dataMarkInfo = markCell.Data.MarkInfo;
  411. //打开编辑面板
  412. EditorWindowManager.ShowEditMark(dataMarkInfo, markCell.Data.Preloading, (mark) =>
  413. {
  414. //为了引用不变, 所以这里使用克隆数据
  415. dataMarkInfo.CloneFrom(mark);
  416. //刷新 Cell
  417. markCell.SetData(markCell.Data);
  418. //执行排序
  419. markCell.Grid.Sort();
  420. EventManager.EmitEvent(EventEnum.OnEditMark, dataMarkInfo);
  421. //派发数据修改事件
  422. EventManager.EmitEvent(EventEnum.OnEditorDirty);
  423. });
  424. }
  425. }
  426. /// <summary>
  427. /// 删除标记数据
  428. /// </summary>
  429. public void OnDeleteMark()
  430. {
  431. if (SelectCell is EditorMarkCell markCell)
  432. {
  433. var index = EditorManager.SelectWaveIndex;
  434. if (index < 0)
  435. {
  436. return;
  437. }
  438.  
  439. var selectPreinstall = GetSelectPreinstall();
  440. if (selectPreinstall == null)
  441. {
  442. return;
  443. }
  444.  
  445. EditorWindowManager.ShowConfirm("提示", "是否删除当前标记?", v =>
  446. {
  447. if (v)
  448. {
  449. var waveCell = (EditorWaveCell)_grid.GetCell(index);
  450. //隐藏工具
  451. S_DynamicTool.Reparent(this);
  452. S_DynamicTool.Instance.Visible = false;
  453. var markCellIndex = markCell.Index;
  454. var markInfo = waveCell.Data[markCellIndex];
  455. //派发移除标记事件
  456. EventManager.EmitEvent(EventEnum.OnDeleteMark, markInfo);
  457. waveCell.MarkGrid.RemoveByIndex(markCellIndex);
  458. waveCell.Data.RemoveAt(markCellIndex);
  459. //派发数据修改事件
  460. EventManager.EmitEvent(EventEnum.OnEditorDirty);
  461. }
  462. });
  463. }
  464. }
  465. }