Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / EditorWindowManager.cs
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using Config;
  5. using Godot;
  6. using UI.EditorColorPicker;
  7. using UI.EditorImportCombination;
  8. using UI.EditorTips;
  9. using UI.EditorWindow;
  10. using UI.MapEditorCreateGroup;
  11. using UI.MapEditorCreateMark;
  12. using UI.MapEditorCreatePreinstall;
  13. using UI.MapEditorCreateRoom;
  14. using UI.MapEditorSelectObject;
  15.  
  16. /// <summary>
  17. /// 通用弹窗管理类
  18. /// </summary>
  19. public static class EditorWindowManager
  20. {
  21. /// <summary>
  22. /// 打开颜色选择器弹窗
  23. /// </summary>
  24. /// <param name="position">位置</param>
  25. /// <param name="color">当前选中的颜色</param>
  26. /// <param name="onChangeColor">颜色改变时回调</param>
  27. /// <param name="onClose">关闭时回调</param>
  28. public static void ShowColorPicker(Vector2 position, Color color, ColorPicker.ColorChangedEventHandler onChangeColor, Action onClose = null)
  29. {
  30. var window = CreateWindowInstance();
  31. var colorPickerPanel = window.OpenBody<EditorColorPickerPanel>(UiManager.UiNames.EditorColorPicker);
  32. window.SetWindowTitle("颜色选择器");
  33. window.SetWindowSize(new Vector2I(298, 720));
  34. window.S_Window.Instance.Position = new Vector2I((int)(position.X - 298f * 0.5f), (int)(position.Y + 80));
  35. colorPickerPanel.S_ColorPicker.Instance.Color = color;
  36. colorPickerPanel.S_ColorPicker.Instance.ColorChanged += onChangeColor;
  37. if (onClose != null)
  38. {
  39. window.CloseEvent += onClose;
  40. }
  41. }
  42.  
  43. /// <summary>
  44. /// 显示打开文件窗口
  45. /// </summary>
  46. /// <param name="filters">过滤文件后缀</param>
  47. /// <param name="onClose">关闭回调, 回调参数为选择的文件路径, 如果选择文件, 则回调参数为null</param>
  48. public static void ShowOpenFileDialog(string[] filters, Action<string> onClose)
  49. {
  50. //UiManager.Open_EditorFileDialog();
  51. var fileDialog = new FileDialog();
  52. fileDialog.UseNativeDialog = true;
  53. fileDialog.ModeOverridesTitle = false;
  54. fileDialog.FileMode = FileDialog.FileModeEnum.OpenFile;
  55. fileDialog.Access = FileDialog.AccessEnum.Filesystem;
  56. fileDialog.Filters = filters;
  57. fileDialog.FileSelected += (path) =>
  58. {
  59. onClose(path);
  60. fileDialog.QueueFree();
  61. };
  62. fileDialog.Canceled += () =>
  63. {
  64. onClose(null);
  65. fileDialog.QueueFree();
  66. };
  67. fileDialog.Confirmed += () =>
  68. {
  69. onClose(null);
  70. fileDialog.QueueFree();
  71. };
  72. UiManager.GetUiLayer(UiLayer.Pop).AddChild(fileDialog);
  73. fileDialog.Popup();
  74. }
  75. /// <summary>
  76. /// 弹出通用提示面板
  77. /// </summary>
  78. /// <param name="title">标题</param>
  79. /// <param name="message">显示内容</param>
  80. /// <param name="onClose">关闭时的回调</param>
  81. /// <param name="parentUi">所属父级Ui</param>
  82. public static void ShowTips(string title, string message, Action onClose = null, UiBase parentUi = null)
  83. {
  84. var window = CreateWindowInstance(parentUi);
  85. window.SetWindowTitle(title);
  86. if (onClose != null)
  87. {
  88. window.CloseEvent += onClose;
  89. }
  90. window.SetButtonList(
  91. new EditorWindowPanel.ButtonData("确定", () =>
  92. {
  93. window.CloseWindow();
  94. })
  95. );
  96. var body = window.OpenBody<EditorTipsPanel>(UiManager.UiNames.EditorTips);
  97. body.SetMessage(message);
  98. }
  99.  
  100. /// <summary>
  101. /// 弹出询问窗口
  102. /// </summary>
  103. /// <param name="title">标题</param>
  104. /// <param name="message">显示内容</param>
  105. /// <param name="onClose">关闭时的回调, 参数如果为 true 表示点击了确定</param>
  106. /// <param name="parentUi">所属父级Ui</param>
  107. public static void ShowConfirm(string title, string message, Action<bool> onClose, UiBase parentUi = null)
  108. {
  109. var window = CreateWindowInstance(parentUi);
  110. window.SetWindowTitle(title);
  111. window.CloseEvent += () =>
  112. {
  113. onClose(false);
  114. };
  115. window.SetButtonList(
  116. new EditorWindowPanel.ButtonData("确定", () =>
  117. {
  118. window.CloseWindow(false);
  119. onClose(true);
  120. }),
  121. new EditorWindowPanel.ButtonData("取消", () =>
  122. {
  123. window.CloseWindow();
  124. })
  125. );
  126. var body = window.OpenBody<EditorTipsPanel>(UiManager.UiNames.EditorTips);
  127. body.SetMessage(message);
  128. }
  129. /// <summary>
  130. /// 弹出询问窗口, 包含3个按钮
  131. /// </summary>
  132. /// <param name="title">标题</param>
  133. /// <param name="message">显示内容</param>
  134. /// <param name="btn1">按钮1文本</param>
  135. /// <param name="btn2">按钮2文本</param>
  136. /// <param name="btn3">按钮3文本</param>
  137. /// <param name="onClose">关闭时的回调, 参数如果为点击按钮的索引表示点击了确定, -1表示点击了x</param>
  138. /// <param name="parentUi">所属父级Ui</param>
  139. public static void ShowConfirm(string title, string message, string btn1, string btn2, string btn3, Action<int> onClose, UiBase parentUi = null)
  140. {
  141. var window = CreateWindowInstance(parentUi);
  142. window.SetWindowTitle(title);
  143. window.CloseEvent += () =>
  144. {
  145. onClose(-1);
  146. };
  147. window.SetButtonList(
  148. new EditorWindowPanel.ButtonData(btn1, () =>
  149. {
  150. window.CloseWindow(false);
  151. onClose(0);
  152. }),
  153. new EditorWindowPanel.ButtonData(btn2, () =>
  154. {
  155. window.CloseWindow(false);
  156. onClose(1);
  157. }),
  158. new EditorWindowPanel.ButtonData(btn3, () =>
  159. {
  160. window.CloseWindow(false);
  161. onClose(2);
  162. })
  163. );
  164. var body = window.OpenBody<EditorTipsPanel>(UiManager.UiNames.EditorTips);
  165. body.SetMessage(message);
  166. }
  167.  
  168. /// <summary>
  169. /// 打开创建地牢组弹窗
  170. /// </summary>
  171. /// <param name="onCreateGroup">创建成功时回调</param>
  172. /// <param name="parentUi">所属父级Ui</param>
  173. public static void ShowCreateGroup(Action<DungeonRoomGroup> onCreateGroup, UiBase parentUi = null)
  174. {
  175. var window = CreateWindowInstance(parentUi);
  176. window.SetWindowTitle("创建地牢组");
  177. window.SetWindowSize(new Vector2I(700, 500));
  178. var body = window.OpenBody<MapEditorCreateGroupPanel>(UiManager.UiNames.MapEditorCreateGroup);
  179. window.SetButtonList(
  180. new EditorWindowPanel.ButtonData("确定", () =>
  181. {
  182. //获取填写的数据, 并创建ui
  183. var groupInfo = body.GetGroupInfo();
  184. if (groupInfo != null)
  185. {
  186. window.CloseWindow();
  187. onCreateGroup(groupInfo);
  188. }
  189. }),
  190. new EditorWindowPanel.ButtonData("取消", () =>
  191. {
  192. window.CloseWindow();
  193. })
  194. );
  195. }
  196. /// <summary>
  197. /// 打开创建地牢房间弹窗
  198. /// </summary>
  199. /// <param name="groupName">选择的组名称, 如果不需要有选择的项, 则传 null</param>
  200. /// <param name="roomType">选择的房间类型</param>
  201. /// <param name="onCreateRoom">创建成功时回调</param>
  202. public static void ShowCreateRoom(string groupName, int roomType, Action<DungeonRoomSplit> onCreateRoom)
  203. {
  204. var window = UiManager.Open_EditorWindow();
  205. window.SetWindowTitle("创建地牢房间");
  206. window.SetWindowSize(new Vector2I(700, 600));
  207. var body = window.OpenBody<MapEditorCreateRoomPanel>(UiManager.UiNames.MapEditorCreateRoom);
  208. if (groupName != null)
  209. {
  210. body.SetSelectGroup(groupName);
  211. }
  212. body.SetSelectType(roomType);
  213. window.SetButtonList(
  214. new EditorWindowPanel.ButtonData("确定", () =>
  215. {
  216. //获取填写的数据, 并创建ui
  217. var roomSplit = body.GetRoomInfo();
  218. if (roomSplit != null)
  219. {
  220. window.CloseWindow();
  221. onCreateRoom(roomSplit);
  222. }
  223. }),
  224. new EditorWindowPanel.ButtonData("取消", () =>
  225. {
  226. window.CloseWindow();
  227. })
  228. );
  229. }
  230.  
  231. /// <summary>
  232. /// 编辑地牢房间
  233. /// </summary>
  234. /// <param name="roomSplit">原数据</param>
  235. /// <param name="onSave">保存时回调</param>
  236. public static void ShowEditRoom(DungeonRoomSplit roomSplit, Action<DungeonRoomSplit> onSave)
  237. {
  238. var window = UiManager.Open_EditorWindow();
  239. window.SetWindowTitle("编辑地牢房间");
  240. window.SetWindowSize(new Vector2I(700, 600));
  241. var body = window.OpenBody<MapEditorCreateRoomPanel>(UiManager.UiNames.MapEditorCreateRoom);
  242. body.InitEditData(roomSplit);
  243. window.SetButtonList(
  244. new EditorWindowPanel.ButtonData("确定", () =>
  245. {
  246. //获取填写的数据, 并创建ui
  247. var saveData = body.GetRoomInfo();
  248. if (saveData != null)
  249. {
  250. window.CloseWindow();
  251. onSave(saveData);
  252. }
  253. }),
  254. new EditorWindowPanel.ButtonData("取消", () =>
  255. {
  256. window.CloseWindow();
  257. })
  258. );
  259. }
  260.  
  261. /// <summary>
  262. /// 打开创建房间预设弹窗
  263. /// </summary>
  264. /// <param name="roomType">当前房间的类型</param>
  265. /// <param name="list">当前房间已经包含的所有预设列表</param>
  266. /// <param name="onCreatePreinstall">创建成功时的回调</param>
  267. public static void ShowCreatePreinstall(DungeonRoomType roomType, List<RoomPreinstallInfo> list, Action<RoomPreinstallInfo> onCreatePreinstall)
  268. {
  269. var window = UiManager.Open_EditorWindow();
  270. window.SetWindowTitle("创建房间预设");
  271. window.SetWindowSize(new Vector2I(700, 600));
  272. var body = window.OpenBody<MapEditorCreatePreinstallPanel>(UiManager.UiNames.MapEditorCreatePreinstall);
  273. body.InitData(roomType);
  274. window.SetButtonList(
  275. new EditorWindowPanel.ButtonData("确定", () =>
  276. {
  277. var roomPreinstall = body.GetRoomPreinstall(list);
  278. if (roomPreinstall != null)
  279. {
  280. window.CloseWindow();
  281. onCreatePreinstall(roomPreinstall);
  282. }
  283. }),
  284. new EditorWindowPanel.ButtonData("取消", () =>
  285. {
  286. window.CloseWindow();
  287. })
  288. );
  289. }
  290.  
  291. /// <summary>
  292. /// 打开编辑房间预设弹窗
  293. /// </summary>
  294. /// <param name="roomType">当前房间的类型</param>
  295. /// <param name="list">当前房间已经包含的所有预设列表</param>
  296. /// <param name="preinstallInfo">需要编辑的预设数据</param>
  297. /// <param name="onSavePreinstall">保存时的回调</param>
  298. public static void ShowEditPreinstall(DungeonRoomType roomType, List<RoomPreinstallInfo> list, RoomPreinstallInfo preinstallInfo, Action<RoomPreinstallInfo> onSavePreinstall)
  299. {
  300. var window = UiManager.Open_EditorWindow();
  301. window.SetWindowTitle("创建房间预设");
  302. window.SetWindowSize(new Vector2I(700, 600));
  303. var body = window.OpenBody<MapEditorCreatePreinstallPanel>(UiManager.UiNames.MapEditorCreatePreinstall);
  304. body.InitData(roomType, preinstallInfo);
  305. window.SetButtonList(
  306. new EditorWindowPanel.ButtonData("确定", () =>
  307. {
  308. var roomPreinstall = body.GetRoomPreinstall(list);
  309. if (roomPreinstall != null)
  310. {
  311. window.CloseWindow();
  312. onSavePreinstall(roomPreinstall);
  313. }
  314. }),
  315. new EditorWindowPanel.ButtonData("取消", () =>
  316. {
  317. window.CloseWindow();
  318. })
  319. );
  320. }
  321.  
  322. /// <summary>
  323. /// 打开创建标记页面
  324. /// </summary>
  325. /// <param name="position">初始坐标</param>
  326. /// <param name="preloading">是否提前加载</param>
  327. /// <param name="onCreateMarkInfo">创建标记回调</param>
  328. /// <param name="parentUi">所属父级Ui</param>
  329. public static void ShowCreateMark(Vector2I position, bool preloading, Action<MarkInfo> onCreateMarkInfo , UiBase parentUi = null)
  330. {
  331. var window = CreateWindowInstance(parentUi);
  332. window.SetWindowTitle("创建标记");
  333. window.SetWindowSize(new Vector2I(1400, 900));
  334. var body = window.OpenBody<MapEditorCreateMarkPanel>(UiManager.UiNames.MapEditorCreateMark);
  335. body.InitData(position, preloading);
  336. window.SetButtonList(
  337. new EditorWindowPanel.ButtonData("确定", () =>
  338. {
  339. var markInfo = body.GetMarkInfo();
  340. if (markInfo != null)
  341. {
  342. window.CloseWindow();
  343. onCreateMarkInfo(markInfo);
  344. }
  345. }),
  346. new EditorWindowPanel.ButtonData("取消", () =>
  347. {
  348. window.CloseWindow();
  349. })
  350. );
  351. }
  352.  
  353. /// <summary>
  354. /// 打开编辑标记页面
  355. /// </summary>
  356. /// <param name="data">标记数据对象</param>
  357. /// <param name="preloading">是否提前加载</param>
  358. /// <param name="onSaveMarkInfo">保存时回调</param>
  359. /// <param name="parentUi">所属父级Ui</param>
  360. public static void ShowEditMark(MarkInfo data, bool preloading, Action<MarkInfo> onSaveMarkInfo, UiBase parentUi = null)
  361. {
  362. var window = CreateWindowInstance(parentUi);
  363. window.SetWindowTitle("编辑标记");
  364. window.SetWindowSize(new Vector2I(1400, 900));
  365. var body = window.OpenBody<MapEditorCreateMarkPanel>(UiManager.UiNames.MapEditorCreateMark);
  366. body.InitData(data, preloading);
  367. window.SetButtonList(
  368. new EditorWindowPanel.ButtonData("确定", () =>
  369. {
  370. var markInfo = body.GetMarkInfo();
  371. if (markInfo != null)
  372. {
  373. window.CloseWindow();
  374. onSaveMarkInfo(markInfo);
  375. }
  376. }),
  377. new EditorWindowPanel.ButtonData("取消", () =>
  378. {
  379. window.CloseWindow();
  380. })
  381. );
  382. }
  383.  
  384. /// <summary>
  385. /// 打开选中的物体
  386. /// </summary>
  387. /// <param name="findType">查找的类型, 如果为 none, 则查找所有类型数据</param>
  388. /// <param name="onSelectObject">选中物体时回调</param>
  389. /// <param name="parentUi">所属父级Ui</param>
  390. public static void ShowSelectObject(ActivityType findType, Action<ExcelConfig.ActivityBase> onSelectObject, UiBase parentUi = null)
  391. {
  392. var window = CreateWindowInstance(parentUi);
  393. window.S_Window.Instance.Size = new Vector2I(1000, 700);
  394. window.SetWindowTitle("选择物体");
  395. var body = window.OpenBody<MapEditorSelectObjectPanel>(UiManager.UiNames.MapEditorSelectObject);
  396. //设置显示的物体类型
  397. body.SetShowType(findType);
  398. window.SetButtonList(
  399. new EditorWindowPanel.ButtonData("确定", () =>
  400. {
  401. var selectObject = body.GetSelectData();
  402. if (selectObject == null)
  403. {
  404. ShowTips("提示", "您未选择任何物体");
  405. }
  406. else
  407. {
  408. window.CloseWindow();
  409. onSelectObject(selectObject);
  410. }
  411. }),
  412. new EditorWindowPanel.ButtonData("取消", () =>
  413. {
  414. window.CloseWindow();
  415. })
  416. );
  417. //绑定双击选中物体事件
  418. body.SelectObjectEvent += selectObject =>
  419. {
  420. window.CloseWindow();
  421. onSelectObject(selectObject);
  422. };
  423. }
  424.  
  425. /// <summary>
  426. /// 显示导入组合确认弹窗
  427. /// </summary>
  428. /// <param name="showName">组合名称</param>
  429. /// <param name="color">预览纹理背景颜色</param>
  430. /// <param name="texture">显示纹理</param>
  431. /// <param name="onAccept">确定时回调</param>
  432. /// <param name="onCancel">取消时回调</param>
  433. /// <param name="parentUi">所属父级Ui</param>
  434. public static void ShowImportCombination(string showName, Color color, Texture2D texture, Action<string> onAccept, Action onCancel, UiBase parentUi = null)
  435. {
  436. var window = CreateWindowInstance(parentUi);
  437. window.S_Window.Instance.Size = new Vector2I(750, 650);
  438. window.SetWindowTitle("导入组合");
  439. var body = window.OpenBody<EditorImportCombinationPanel>(UiManager.UiNames.EditorImportCombination);
  440. body.InitData(showName, color, texture);
  441. var accept = false;
  442. if (onCancel != null)
  443. {
  444. window.CloseEvent += () =>
  445. {
  446. if (!accept) onCancel();
  447. };
  448. }
  449.  
  450. window.SetButtonList(
  451. new EditorWindowPanel.ButtonData("确定", () =>
  452. {
  453. accept = true;
  454. var selectObject = body.GetName();
  455. window.CloseWindow();
  456. onAccept(selectObject);
  457. }),
  458. new EditorWindowPanel.ButtonData("取消", () =>
  459. {
  460. window.CloseWindow();
  461. })
  462. );
  463. }
  464. /// <summary>
  465. /// 显示编辑组合弹窗
  466. /// </summary>
  467. /// <param name="showName">组合名称</param>
  468. /// <param name="color">预览纹理背景颜色</param>
  469. /// <param name="texture">显示纹理</param>
  470. /// <param name="onAccept">确定时回调</param>
  471. /// <param name="onDelete">删除时回调</param>
  472. /// <param name="parentUi">所属父级Ui</param>
  473. public static void ShowEditCombination(string showName, Color color, Texture2D texture, Action<string> onAccept, Action onDelete, UiBase parentUi = null)
  474. {
  475. var window = CreateWindowInstance(parentUi);
  476. window.S_Window.Instance.Size = new Vector2I(750, 650);
  477. window.SetWindowTitle("编辑组合");
  478. var body = window.OpenBody<EditorImportCombinationPanel>(UiManager.UiNames.EditorImportCombination);
  479. body.InitData(showName, color, texture);
  480. window.SetButtonList(
  481. new EditorWindowPanel.ButtonData("删除", () =>
  482. {
  483. ShowConfirm("提示", "您确定要删除该组合吗,该操作不能取消!", (flag) =>
  484. {
  485. if (flag)
  486. {
  487. window.CloseWindow();
  488. onDelete();
  489. }
  490. }, window);
  491. }),
  492. new EditorWindowPanel.ButtonData("保存", () =>
  493. {
  494. var selectObject = body.GetName();
  495. window.CloseWindow();
  496. onAccept(selectObject);
  497. }),
  498. new EditorWindowPanel.ButtonData("取消", () =>
  499. {
  500. window.CloseWindow();
  501. })
  502. );
  503. }
  504. private static EditorWindowPanel CreateWindowInstance(UiBase parentUi = null)
  505. {
  506. if (parentUi != null)
  507. {
  508. return parentUi.OpenNestedUi<EditorWindowPanel>(UiManager.UiNames.EditorWindow);
  509. }
  510.  
  511. return UiManager.Open_EditorWindow();
  512. }
  513. }