Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorMapMark / MapEditorMapMarkPanel.cs
@小李xl 小李xl on 11 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. optionButton.AddItem($"{item.Name} ({item.Weight})");
  150. }
  151. //下拉框选中项
  152. optionButton.Selected = selectIndex;
  153. OnItemSelected(selectIndex);
  154. }
  155.  
  156. /// <summary>
  157. /// 下拉框选中项
  158. /// </summary>
  159. public void OnItemSelected(long index)
  160. {
  161. //清除选中项
  162. RemoveSelectCell();
  163. //记录选中波数
  164. EditorTileMapManager.SetSelectWaveIndex(-1);
  165. //记录选中的预设
  166. EditorTileMapManager.SetSelectPreinstallIndex((int)index);
  167. var preinstall = EditorTileMapManager.SelectRoom.Preinstall;
  168. if (index >= 0 && index <= preinstall.Count)
  169. {
  170. _grid.SetDataList(preinstall[(int)index].WaveList.ToArray());
  171. }
  172. else
  173. {
  174. _grid.RemoveAll();
  175. }
  176. RefreshAutoFillTip();
  177. }
  178. /// <summary>
  179. /// 选中 cell, 并设置显示的工具
  180. /// </summary>
  181. /// <param name="uiCell">选中 cell 对象</param>
  182. /// <param name="toolRoot">按钮工具绑定的父节点</param>
  183. /// <param name="toolType">选择工具类型</param>
  184. public void SetSelectCell(IUiCell uiCell, Node toolRoot, SelectToolType toolType)
  185. {
  186. if (SelectCell == uiCell)
  187. {
  188. return;
  189. }
  190.  
  191. if (uiCell == null)
  192. {
  193. RemoveSelectCell();
  194. return;
  195. }
  196.  
  197. if (toolType == SelectToolType.Wave)
  198. {
  199. //不需要显示编辑波数按钮
  200. S_DynamicTool.L_EditButton.Instance.Visible = false;
  201. //预加载波不能删除
  202. S_DynamicTool.L_DeleteButton.Instance.Visible = uiCell.Index != 0;
  203. }
  204. else //显示编辑按钮
  205. {
  206. var markCell = (EditorMarkCell)uiCell;
  207. var markType = markCell.Data.MarkInfo.SpecialMarkType;
  208. if (markType != SpecialMarkType.Normal) //特殊标记不能删除
  209. {
  210. S_DynamicTool.L_EditButton.Instance.Visible = true;
  211. S_DynamicTool.L_DeleteButton.Instance.Visible = false;
  212. }
  213. else //普通标记
  214. {
  215. S_DynamicTool.L_EditButton.Instance.Visible = true;
  216. S_DynamicTool.L_DeleteButton.Instance.Visible = true;
  217. }
  218. }
  219.  
  220. //显示工具
  221. S_DynamicTool.Instance.Visible = true;
  222. //改变所在父节点
  223. var parent = S_DynamicTool.Instance.GetParent();
  224. if (parent != null)
  225. {
  226. parent.RemoveChild(S_DynamicTool.Instance);
  227. }
  228.  
  229. toolRoot.AddChild(S_DynamicTool.Instance);
  230. if (SelectCell != null)
  231. {
  232. SelectCell.OnUnSelect();
  233. }
  234. SelectCell = uiCell;
  235. ToolType = toolType;
  236. SelectCell.OnSelect();
  237. }
  238.  
  239. /// <summary>
  240. /// 移除选中的 cell 对象
  241. /// </summary>
  242. public void RemoveSelectCell()
  243. {
  244. if (SelectCell == null)
  245. {
  246. return;
  247. }
  248. var parent = S_DynamicTool.GetParent();
  249. if (parent != null)
  250. {
  251. parent.RemoveChild(S_DynamicTool.Instance);
  252. }
  253. SelectCell.OnUnSelect();
  254. SelectCell = null;
  255. }
  256.  
  257. /// <summary>
  258. /// 创建预设
  259. /// </summary>
  260. public void OnAddPreinstall()
  261. {
  262. var roomInfoRoomType = EditorTileMapManager.SelectRoom.RoomInfo.RoomType;
  263. var roomSplitPreinstall = EditorTileMapManager.SelectRoom.Preinstall;
  264. EditorWindowManager.ShowCreatePreinstall(roomInfoRoomType, roomSplitPreinstall, preinstall =>
  265. {
  266. //创建逻辑
  267. roomSplitPreinstall.Add(preinstall);
  268. RefreshPreinstallSelect(roomSplitPreinstall.Count - 1);
  269. //派发数据修改事件
  270. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  271. });
  272. }
  273.  
  274. /// <summary>
  275. /// 编辑预设
  276. /// </summary>
  277. public void OnEditPreinstall()
  278. {
  279. var roomInfoRoomType = EditorTileMapManager.SelectRoom.RoomInfo.RoomType;
  280. var roomSplitPreinstall = EditorTileMapManager.SelectRoom.Preinstall;
  281. var selectPreinstall = GetSelectPreinstall();
  282. EditorWindowManager.ShowEditPreinstall(roomInfoRoomType, roomSplitPreinstall, selectPreinstall, preinstall =>
  283. {
  284. //修改下拉菜单数据
  285. var optionButton = S_PreinstallOption.Instance;
  286. optionButton.SetItemText(optionButton.Selected, $"{preinstall.Name} ({preinstall.Weight})");
  287. RefreshAutoFillTip();
  288. //派发数据修改事件
  289. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  290. });
  291. }
  292.  
  293. /// <summary>
  294. /// 删除预设
  295. /// </summary>
  296. public void OnDeletePreinstall()
  297. {
  298. var index = EditorTileMapManager.SelectPreinstallIndex;
  299. if (index < 0)
  300. {
  301. return;
  302. }
  303. EditorWindowManager.ShowConfirm("提示", "是否删除当前预设?", v =>
  304. {
  305. if (v)
  306. {
  307. //先把选中项置为-1
  308. EditorTileMapManager.SetSelectPreinstallIndex(-1);
  309. //移除预设数据
  310. EditorTileMapManager.SelectRoom.Preinstall.RemoveAt(index);
  311. //刷新选项
  312. RefreshPreinstallSelect(EditorTileMapManager.SelectRoom.Preinstall.Count - 1);
  313. //派发数据修改事件
  314. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  315. }
  316. });
  317. }
  318.  
  319. /// <summary>
  320. /// 添加波数
  321. /// </summary>
  322. public void OnAddWave()
  323. {
  324. var index = S_PreinstallOption.Instance.Selected;
  325. if (index == -1)
  326. {
  327. EditorWindowManager.ShowTips("警告", "请先选择预设!");
  328. return;
  329. }
  330.  
  331. var preinstall = EditorTileMapManager.SelectRoom.Preinstall;
  332. if (index >= preinstall.Count)
  333. {
  334. EditorWindowManager.ShowTips("警告", "未知预设选项!");
  335. return;
  336. }
  337. var item = preinstall[index];
  338. var wave = new List<MarkInfo>();
  339. item.WaveList.Add(wave);
  340. _grid.Add(wave);
  341. //派发数据修改事件
  342. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  343. }
  344.  
  345. //工具节点编辑按钮点击
  346. private void OnToolEditClick()
  347. {
  348. if (ToolType == SelectToolType.Mark)
  349. {
  350. OnEditMark();
  351. }
  352. }
  353. //工具节点删除按钮点击
  354. private void OnToolDeleteClick()
  355. {
  356. if (ToolType == SelectToolType.Wave)
  357. {
  358. OnDeleteWave();
  359. }
  360. else if (ToolType == SelectToolType.Mark)
  361. {
  362. OnDeleteMark();
  363. }
  364. }
  365.  
  366.  
  367. /// <summary>
  368. /// 删除波数据
  369. /// </summary>
  370. public void OnDeleteWave()
  371. {
  372. var index = EditorTileMapManager.SelectWaveIndex;
  373. if (index < 0)
  374. {
  375. return;
  376. }
  377. var selectPreinstall = GetSelectPreinstall();
  378. if (selectPreinstall == null)
  379. {
  380. return;
  381. }
  382.  
  383. var wave = selectPreinstall.WaveList[index];
  384. EditorWindowManager.ShowConfirm("提示", $"是否删除当前波?\n当前波数包含{wave.Count}个标记", v =>
  385. {
  386. if (v)
  387. {
  388. //隐藏工具
  389. S_DynamicTool.Reparent(this);
  390. S_DynamicTool.Instance.Visible = false;
  391. //派发移除标记事件
  392. foreach (var markInfo in wave)
  393. {
  394. EventManager.EmitEvent(EventEnum.OnDeleteMark, markInfo);
  395. }
  396. //移除数据
  397. selectPreinstall.WaveList.RemoveAt(index);
  398. _grid.RemoveByIndex(index);
  399. EditorTileMapManager.SetSelectWaveIndex(-1);
  400. //派发数据修改事件
  401. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  402. }
  403. });
  404. }
  405. /// <summary>
  406. /// 编辑标记数据
  407. /// </summary>
  408. public void OnEditMark()
  409. {
  410. if (SelectCell is EditorMarkCell markCell)
  411. {
  412. var dataMarkInfo = markCell.Data.MarkInfo;
  413. //打开编辑面板
  414. EditorWindowManager.ShowEditMark(dataMarkInfo, markCell.Data.Preloading, (mark) =>
  415. {
  416. //为了引用不变, 所以这里使用克隆数据
  417. dataMarkInfo.CloneFrom(mark);
  418. //刷新 Cell
  419. markCell.UpdateData(markCell.Data);
  420. //执行排序
  421. markCell.Grid.Sort();
  422. EventManager.EmitEvent(EventEnum.OnEditMark, dataMarkInfo);
  423. //派发数据修改事件
  424. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  425. });
  426. }
  427. }
  428. /// <summary>
  429. /// 删除标记数据
  430. /// </summary>
  431. public void OnDeleteMark()
  432. {
  433. if (SelectCell is EditorMarkCell markCell)
  434. {
  435. var index = EditorTileMapManager.SelectWaveIndex;
  436. if (index < 0)
  437. {
  438. return;
  439. }
  440.  
  441. var selectPreinstall = GetSelectPreinstall();
  442. if (selectPreinstall == null)
  443. {
  444. return;
  445. }
  446.  
  447. EditorWindowManager.ShowConfirm("提示", "是否删除当前标记?", v =>
  448. {
  449. if (v)
  450. {
  451. var waveCell = (EditorWaveCell)_grid.GetCell(index);
  452. //隐藏工具
  453. S_DynamicTool.Reparent(this);
  454. S_DynamicTool.Instance.Visible = false;
  455. var markCellIndex = markCell.Index;
  456. var markInfo = waveCell.MarkGrid.GetData(markCellIndex).MarkInfo;
  457. //派发移除标记事件
  458. EventManager.EmitEvent(EventEnum.OnDeleteMark, markInfo);
  459. waveCell.MarkGrid.RemoveByIndex(markCellIndex);
  460. waveCell.Data.Remove(markInfo);
  461. //派发数据修改事件
  462. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  463. }
  464. });
  465. }
  466. }
  467.  
  468. private void RefreshAutoFillTip()
  469. {
  470. var preinstall = EditorTileMapManager.SelectPreinstall;
  471. if (preinstall != null)
  472. {
  473. S_AutoFillTip.Instance.Visible = preinstall.AutoFill;
  474. return;
  475. }
  476. S_AutoFillTip.Instance.Visible = false;
  477. }
  478. }