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