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