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