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