Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorMapMark / MapEditorMapMarkPanel.cs
@小李xl 小李xl on 20 Aug 2023 10 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. var index = EditorTileMap.SelectWaveIndex;
  301. if (index < 0)
  302. {
  303. return;
  304. }
  305. var selectPreinstall = GetSelectPreinstall();
  306. if (selectPreinstall == null)
  307. {
  308. return;
  309. }
  310. //隐藏工具
  311. S_DynamicTool.Reparent(this);
  312. S_DynamicTool.Instance.Visible = false;
  313. //派发移除标记事件
  314. var list = selectPreinstall.WaveList[index];
  315. foreach (var markInfo in list)
  316. {
  317. EventManager.EmitEvent(EventEnum.OnDeleteMark, markInfo);
  318. }
  319. //移除数据
  320. selectPreinstall.WaveList.RemoveAt(index);
  321. _grid.RemoveByIndex(index);
  322. EditorTileMap.SelectWaveIndex = -1;
  323. //派发选中波数事件
  324. EventManager.EmitEvent(EventEnum.OnSelectWave, -1);
  325. }
  326. /// <summary>
  327. /// 编辑标记数据
  328. /// </summary>
  329. public void OnEditMark()
  330. {
  331. if (SelectCell is EditorMarkCell markCell)
  332. {
  333. var dataMarkInfo = markCell.Data.MarkInfo;
  334. //打开编辑面板
  335. EditorWindowManager.ShowEditMark(dataMarkInfo, (mark) =>
  336. {
  337. //为了引用不变, 所以这里使用克隆数据
  338. dataMarkInfo.CloneFrom(mark);
  339. //刷新 Cell
  340. markCell.SetData(markCell.Data);
  341. EventManager.EmitEvent(EventEnum.OnEditMark, dataMarkInfo);
  342. });
  343. }
  344. }
  345. /// <summary>
  346. /// 删除标记数据
  347. /// </summary>
  348. public void OnDeleteMark()
  349. {
  350. if (SelectCell is EditorMarkCell markCell)
  351. {
  352. var index = EditorTileMap.SelectWaveIndex;
  353. if (index < 0)
  354. {
  355. return;
  356. }
  357. var selectPreinstall = GetSelectPreinstall();
  358. if (selectPreinstall == null)
  359. {
  360. return;
  361. }
  362.  
  363. var waveCell = (EditorWaveCell)_grid.GetCell(index);
  364. //隐藏工具
  365. S_DynamicTool.Reparent(this);
  366. S_DynamicTool.Instance.Visible = false;
  367. var markCellIndex = markCell.Index;
  368. var markInfo = waveCell.Data[markCellIndex];
  369. //派发移除标记事件
  370. EventManager.EmitEvent(EventEnum.OnDeleteMark, markInfo);
  371. waveCell.MarkGrid.RemoveByIndex(markCellIndex);
  372. waveCell.Data.RemoveAt(markCellIndex);
  373. }
  374. }
  375. }