Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorProject / MapEditorProjectPanel.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Godot;
  5. using UI.MapEditor;
  6.  
  7. namespace UI.MapEditorProject;
  8.  
  9. public partial class MapEditorProjectPanel : MapEditorProject
  10. {
  11. /// <summary>
  12. /// 当前显示的组数据
  13. /// </summary>
  14. public UiGrid<GroupButton, DungeonRoomGroup> GroupGrid { get; private set; }
  15.  
  16. /// <summary>
  17. /// 当前显示的房间数据
  18. /// </summary>
  19. public UiGrid<RoomButton, DungeonRoomSplit> RoomGrid { get; private set; }
  20.  
  21. private EventFactory _eventFactory;
  22.  
  23. public override void OnCreateUi()
  24. {
  25. //初始化枚举选项
  26. var roomTypes = Enum.GetValues<DungeonRoomType>();
  27. var optionButton = S_RoomTypeButton.Instance;
  28. optionButton.AddItem("全部", 0);
  29. for (var i = 0; i < roomTypes.Length; i++)
  30. {
  31. var dungeonRoomType = roomTypes[i];
  32. if (dungeonRoomType == DungeonRoomType.None) continue;
  33. optionButton.AddItem(DungeonManager.DungeonRoomTypeToDescribeString(dungeonRoomType),
  34. (int)dungeonRoomType + 1);
  35. }
  36.  
  37. GroupGrid = new UiGrid<MapEditorProject.GroupButton, DungeonRoomGroup>(S_GroupButton, typeof(GroupButtonCell));
  38. GroupGrid.SetCellOffset(new Vector2I(0, 2));
  39. GroupGrid.SetHorizontalExpand(true);
  40.  
  41. RoomGrid = new UiGrid<MapEditorProject.RoomButton, DungeonRoomSplit>(S_RoomButton, typeof(RoomButtonCell));
  42. RoomGrid.SetAutoColumns(true);
  43. RoomGrid.SetCellOffset(new Vector2I(10, 10));
  44. RoomGrid.SetHorizontalExpand(true);
  45.  
  46. S_GroupSearchButton.Instance.Pressed += OnSearchGroupButtonClick;
  47. S_GroupEditButton.Instance.Pressed += OnEditGroup;
  48. S_GroupAddButton.Instance.Pressed += OnCreateGroupClick;
  49. S_GroupDeleteButton.Instance.Pressed += OnDeleteGroup;
  50.  
  51. S_RoomSearchButton.Instance.Pressed += OnSearchRoomButtonClick;
  52. S_RoomAddButton.Instance.Pressed += OnCreateRoomClick;
  53. S_RoomEditButton.Instance.Pressed += OnEditRoom;
  54. S_RoomDeleteButton.Instance.Pressed += OnDeleteRoom;
  55.  
  56. _eventFactory = EventManager.CreateEventFactory();
  57. _eventFactory.AddEventListener(EventEnum.OnCreateGroupFinish, OnCreateGroupFinish);
  58. _eventFactory.AddEventListener(EventEnum.OnDeleteGroupFinish, OnDeleteGroupFinish);
  59. _eventFactory.AddEventListener(EventEnum.OnCreateRoomFinish, OnCreateRoomFinish);
  60. }
  61.  
  62. public override void OnShowUi()
  63. {
  64. RefreshGroup();
  65. OnSearchRoomButtonClick();
  66. }
  67.  
  68. public override void OnDestroyUi()
  69. {
  70. _eventFactory.RemoveAllEventListener();
  71. _eventFactory = null;
  72. GroupGrid.Destroy();
  73. GroupGrid = null;
  74.  
  75. RoomGrid.Destroy();
  76. RoomGrid = null;
  77. }
  78.  
  79. /// <summary>
  80. /// 刷新组数据
  81. /// </summary>
  82. public void RefreshGroup()
  83. {
  84. MapProjectManager.RefreshMapGroup();
  85. OnSearchGroupButtonClick();
  86. }
  87.  
  88. /// <summary>
  89. /// 选中地牢组
  90. /// </summary>
  91. public void SelectGroup(DungeonRoomGroup group)
  92. {
  93. EditorTileMapManager.SetSelectDungeonGroup(group);
  94. OnSearchRoomButtonClick();
  95. }
  96.  
  97. /// <summary>
  98. /// 选择地图并打开地图编辑器
  99. /// </summary>
  100. public void OpenSelectRoom(DungeonRoomSplit room, TileSetSplit tileSetSplit)
  101. {
  102. //创建地牢Ui
  103. var mapEditor = ParentUi.OpenNextUi<MapEditorPanel>(UiManager.UiNames.MapEditor);
  104. //加载地牢
  105. mapEditor.LoadMap(room, tileSetSplit);
  106. }
  107.  
  108. //搜索组按钮点击
  109. private void OnSearchGroupButtonClick()
  110. {
  111. var select = GroupGrid.SelectIndex;
  112. if (select < 0)
  113. {
  114. select = 0;
  115. }
  116.  
  117. //输入文本
  118. var text = S_GroupSearchInput.Instance.Text;
  119. if (!string.IsNullOrEmpty(text))
  120. {
  121. var str = text.Trim().ToLower();
  122. var list = new List<DungeonRoomGroup>();
  123. foreach (var valuePair in MapProjectManager.GroupMap)
  124. {
  125. if (valuePair.Value.GroupName.Trim().ToLower().Contains(str))
  126. {
  127. list.Add(valuePair.Value);
  128. }
  129. }
  130.  
  131. GroupGrid.SetDataList(list.ToArray());
  132. }
  133. else
  134. {
  135. GroupGrid.SetDataList(MapProjectManager.GroupMap.Values.ToArray());
  136. }
  137.  
  138. GroupGrid.SelectIndex = select;
  139. }
  140.  
  141. //搜索房间按钮点击
  142. private void OnSearchRoomButtonClick()
  143. {
  144. if (EditorTileMapManager.SelectDungeonGroup != null)
  145. {
  146. //输入文本
  147. var text = S_RoomSearchInput.Instance.Text;
  148. //房间类型
  149. var roomType = S_RoomTypeButton.Instance.GetSelectedId();
  150.  
  151. IEnumerable<DungeonRoomSplit> result = EditorTileMapManager.SelectDungeonGroup.GetAllRoomList();
  152.  
  153. //名称搜索
  154. if (!string.IsNullOrEmpty(text))
  155. {
  156. var queryText = text.Trim().ToLower();
  157. result = result.Where(split =>
  158. {
  159. return split.RoomInfo.RoomName.Trim().ToLower().Contains(queryText);
  160. });
  161. }
  162.  
  163. //类型搜索
  164. if (roomType > 0)
  165. {
  166. var type = (DungeonRoomType)(roomType - 1);
  167. result = result.Where(split => split.RoomInfo.RoomType == type);
  168. }
  169.  
  170. RoomGrid.SetDataList(result.ToArray());
  171. }
  172. else
  173. {
  174. RoomGrid.RemoveAll();
  175. }
  176. }
  177.  
  178. //创建组按钮点击
  179. private void OnCreateGroupClick()
  180. {
  181. EditorWindowManager.ShowCreateGroup(CreateGroup);
  182. }
  183.  
  184. //编辑组按钮点击
  185. private void OnEditGroup()
  186. {
  187. if (GroupGrid.SelectIndex != -1)
  188. {
  189. EditorWindowManager.ShowEditGroup(GroupGrid.SelectData, EditGroup);
  190. }
  191. else
  192. {
  193. EditorWindowManager.ShowTips("提示", "请选择需要编辑的组!");
  194. }
  195. }
  196.  
  197. //删除组按钮点击
  198. private void OnDeleteGroup()
  199. {
  200. if (GroupGrid.SelectIndex != -1)
  201. {
  202. EditorWindowManager.ShowDelayConfirm("提示", "确定删除该组吗?\n该操作不可取消!", 5, DeleteGroup);
  203. }
  204. else
  205. {
  206. EditorWindowManager.ShowTips("提示", "请选择需要删除的组!");
  207. }
  208. }
  209.  
  210. //创建地牢房间按钮点击
  211. private void OnCreateRoomClick()
  212. {
  213. var groupName = EditorTileMapManager.SelectDungeonGroup != null
  214. ? EditorTileMapManager.SelectDungeonGroup.GroupName
  215. : null;
  216. EditorWindowManager.ShowCreateRoom(groupName, Mathf.Max(S_RoomTypeButton.Instance.Selected - 1, 0), CreateRoom);
  217. }
  218.  
  219.  
  220. //编辑房间
  221. private void OnEditRoom()
  222. {
  223. var selectRoom = RoomGrid.SelectData;
  224. if (selectRoom == null)
  225. {
  226. EditorWindowManager.ShowTips("提示", "请选择需要编辑的房间!");
  227. }
  228. else
  229. {
  230. EditorWindowManager.ShowEditRoom(selectRoom, (room) =>
  231. {
  232. //保存房间数据
  233. MapProjectManager.SaveRoomInfo(room);
  234. OnSearchRoomButtonClick();
  235. });
  236. }
  237. }
  238.  
  239. //删除房间
  240. private void OnDeleteRoom()
  241. {
  242. var selectRoom = RoomGrid.SelectData;
  243. if (selectRoom == null)
  244. {
  245. EditorWindowManager.ShowTips("提示", "请选择需要删除的房间!");
  246. }
  247. else
  248. {
  249. EditorWindowManager.ShowDelayConfirm("提示", $"是否删除房间: {selectRoom.RoomInfo.RoomName}, 该操作无法撤销!", 3, result =>
  250. {
  251. if (result)
  252. {
  253. //删除房间
  254. if (MapProjectManager.DeleteRoom(EditorTileMapManager.SelectDungeonGroup, selectRoom))
  255. {
  256. MapProjectManager.SaveGroupMap();
  257. OnSearchRoomButtonClick();
  258. }
  259. }
  260. });
  261. }
  262. }
  263.  
  264. //创建地牢组
  265. private void CreateGroup(DungeonRoomGroup group)
  266. {
  267. MapProjectManager.CreateGroup(group);
  268. }
  269.  
  270. //编辑地牢组
  271. private void EditGroup(DungeonRoomGroup group)
  272. {
  273. MapProjectManager.SaveGroupMap();
  274. }
  275.  
  276. //删除地牢组
  277. private void DeleteGroup(bool v)
  278. {
  279. if (v)
  280. {
  281. MapProjectManager.DeleteGroup(GroupGrid.SelectData.GroupName);
  282. }
  283. }
  284.  
  285. //创建房间
  286. private void CreateRoom(DungeonRoomSplit roomSplit)
  287. {
  288. MapProjectManager.CreateRoom(roomSplit);
  289. }
  290.  
  291. //创建地牢组完成
  292. private void OnCreateGroupFinish(object group)
  293. {
  294. OnSearchGroupButtonClick();
  295. }
  296.  
  297. //删除地牢组完成
  298. private void OnDeleteGroupFinish(object group)
  299. {
  300. OnSearchGroupButtonClick();
  301. }
  302.  
  303. //创建地牢房间完成
  304. private void OnCreateRoomFinish(object roomSplit)
  305. {
  306. OnSearchRoomButtonClick();
  307. }
  308. }