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