Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / EditorWindowManager.cs
  1.  
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using Config;
  8. using Godot;
  9. using UI.EditorColorPicker;
  10. using UI.EditorDungeonGroup;
  11. using UI.EditorForm;
  12. using UI.EditorImportCombination;
  13. using UI.EditorInfo;
  14. using UI.EditorInput;
  15. using UI.EditorTileImage;
  16. using UI.EditorTips;
  17. using UI.EditorWindow;
  18. using UI.MapEditorCreateMark;
  19. using UI.MapEditorCreatePreinstall;
  20. using UI.MapEditorCreateRoom;
  21. using UI.MapEditorSelectObject;
  22.  
  23. /// <summary>
  24. /// 通用弹窗管理类
  25. /// </summary>
  26. public static class EditorWindowManager
  27. {
  28. /// <summary>
  29. /// 打开颜色选择器弹窗
  30. /// </summary>
  31. /// <param name="position">位置</param>
  32. /// <param name="color">当前选中的颜色</param>
  33. /// <param name="onChangeColor">颜色改变时回调</param>
  34. /// <param name="onClose">关闭时回调</param>
  35. public static void ShowColorPicker(Vector2 position, Color color, ColorPicker.ColorChangedEventHandler onChangeColor, Action onClose = null)
  36. {
  37. var window = CreateWindowInstance();
  38. var colorPickerPanel = window.OpenBody<EditorColorPickerPanel>(UiManager.UiNames.EditorColorPicker);
  39. window.SetWindowTitle("颜色选择器");
  40. window.SetWindowSize(new Vector2I(298, 720));
  41. window.S_Window.Instance.Position = new Vector2I((int)(position.X - 298f * 0.5f), (int)(position.Y + 80));
  42. colorPickerPanel.S_ColorPicker.Instance.Color = color;
  43. colorPickerPanel.S_ColorPicker.Instance.ColorChanged += onChangeColor;
  44. if (onClose != null)
  45. {
  46. window.CloseEvent += onClose;
  47. }
  48. }
  49.  
  50. /// <summary>
  51. /// 显示打开文件窗口
  52. /// </summary>
  53. /// <param name="filters">过滤文件后缀</param>
  54. /// <param name="onClose">关闭回调, 回调参数为选择的文件路径, 如果选择文件, 则回调参数为null</param>
  55. public static void ShowOpenFileDialog(string[] filters, Action<string> onClose)
  56. {
  57. var fileDialog = new FileDialog();
  58. fileDialog.UseNativeDialog = true;
  59. fileDialog.ModeOverridesTitle = false;
  60. fileDialog.FileMode = FileDialog.FileModeEnum.OpenFile;
  61. fileDialog.Access = FileDialog.AccessEnum.Filesystem;
  62. fileDialog.Filters = filters;
  63. fileDialog.FileSelected += (path) =>
  64. {
  65. onClose(path);
  66. fileDialog.QueueFree();
  67. };
  68. fileDialog.Canceled += () =>
  69. {
  70. onClose(null);
  71. fileDialog.QueueFree();
  72. };
  73. fileDialog.Confirmed += () =>
  74. {
  75. onClose(null);
  76. fileDialog.QueueFree();
  77. };
  78. UiManager.GetUiLayer(UiLayer.Pop).AddChild(fileDialog);
  79. fileDialog.Popup();
  80. }
  81. /// <summary>
  82. /// 弹出通用提示面板
  83. /// </summary>
  84. /// <param name="title">标题</param>
  85. /// <param name="message">显示内容</param>
  86. /// <param name="onClose">关闭时的回调</param>
  87. /// <param name="parentUi">所属父级Ui</param>
  88. public static void ShowTips(string title, string message, Action onClose = null, UiBase parentUi = null)
  89. {
  90. var window = CreateWindowInstance(parentUi);
  91. window.SetWindowTitle(title);
  92. if (onClose != null)
  93. {
  94. window.CloseEvent += onClose;
  95. }
  96. window.SetButtonList(
  97. new EditorWindowPanel.ButtonData("确定", () =>
  98. {
  99. window.CloseWindow();
  100. })
  101. );
  102. var body = window.OpenBody<EditorTipsPanel>(UiManager.UiNames.EditorTips);
  103. body.SetMessage(message);
  104. }
  105.  
  106. /// <summary>
  107. /// 弹出询问窗口
  108. /// </summary>
  109. /// <param name="title">标题</param>
  110. /// <param name="message">显示内容</param>
  111. /// <param name="onClose">关闭时的回调, 参数如果为 true 表示点击了确定</param>
  112. /// <param name="parentUi">所属父级Ui</param>
  113. public static EditorWindowPanel ShowConfirm(string title, string message, Action<bool> onClose, UiBase parentUi = null)
  114. {
  115. var window = CreateWindowInstance(parentUi);
  116. window.SetWindowTitle(title);
  117. window.CloseEvent += () =>
  118. {
  119. onClose(false);
  120. };
  121. window.SetButtonList(
  122. new EditorWindowPanel.ButtonData("确定", () =>
  123. {
  124. window.CloseWindow(false);
  125. onClose(true);
  126. }),
  127. new EditorWindowPanel.ButtonData("取消", () =>
  128. {
  129. window.CloseWindow();
  130. })
  131. );
  132. var body = window.OpenBody<EditorTipsPanel>(UiManager.UiNames.EditorTips);
  133. body.SetMessage(message);
  134. return window;
  135. }
  136.  
  137. /// <summary>
  138. /// 弹出延时询问窗口
  139. /// </summary>
  140. /// <param name="title">标题</param>
  141. /// <param name="message">显示内容</param>
  142. /// <param name="delayTime">延时时间</param>
  143. /// <param name="onClose">关闭时的回调, 参数如果为 true 表示点击了确定</param>
  144. /// <param name="parentUi">所属父级Ui</param>
  145. public static void ShowDelayConfirm(string title, string message, float delayTime, Action<bool> onClose, UiBase parentUi = null)
  146. {
  147. var window = ShowConfirm(title, message, onClose, parentUi);
  148. if (delayTime > 0)
  149. {
  150. var uiCell = (CustomButtonCell)window.ButtonGrid.GetCell(0);
  151. window.StartCoroutine(DelayTimeLabel(delayTime, uiCell.CellNode.L_Button.Instance));
  152. }
  153. }
  154.  
  155. /// <summary>
  156. /// 弹出通用输入框
  157. /// </summary>
  158. /// <param name="title">标题</param>
  159. /// <param name="message">显示内容</param>
  160. /// <param name="value">输入框默认值</param>
  161. /// <param name="onClose">关闭时回调,参数1为输入框内容,参数2为 true 表示点击了确定,如果点击了确定但是回调函数返回 false 则不会关闭窗口</param>
  162. /// <param name="parentUi">所属父级Ui</param>
  163. public static void ShowInput(string title, string message, string value, Func<string, bool, bool> onClose, UiBase parentUi = null)
  164. {
  165. var window = CreateWindowInstance(parentUi);
  166. window.SetWindowTitle(title);
  167. window.SetWindowSize(new Vector2I(450, 230));
  168. var body = window.OpenBody<EditorInputPanel>(UiManager.UiNames.EditorInput);
  169. window.CloseEvent += () =>
  170. {
  171. onClose(body.GetValue(), false);
  172. };
  173. window.SetButtonList(
  174. new EditorWindowPanel.ButtonData("确定", () =>
  175. {
  176. if (onClose(body.GetValue(), true))
  177. {
  178. window.CloseWindow(false);
  179. }
  180. }),
  181. new EditorWindowPanel.ButtonData("取消", () =>
  182. {
  183. window.CloseWindow();
  184. })
  185. );
  186. body.Init(message, value);
  187. }
  188. /// <summary>
  189. /// 弹出询问窗口, 包含3个按钮
  190. /// </summary>
  191. /// <param name="title">标题</param>
  192. /// <param name="message">显示内容</param>
  193. /// <param name="btn1">按钮1文本</param>
  194. /// <param name="btn2">按钮2文本</param>
  195. /// <param name="btn3">按钮3文本</param>
  196. /// <param name="onClose">关闭时的回调, 参数如果为点击按钮的索引表示点击了确定, -1表示点击了x</param>
  197. /// <param name="parentUi">所属父级Ui</param>
  198. public static void ShowConfirm(string title, string message, string btn1, string btn2, string btn3, Action<int> onClose, UiBase parentUi = null)
  199. {
  200. var window = CreateWindowInstance(parentUi);
  201. window.SetWindowTitle(title);
  202. window.SetWindowSize(new Vector2I(550, 350));
  203. window.CloseEvent += () =>
  204. {
  205. onClose(-1);
  206. };
  207. window.SetButtonList(
  208. new EditorWindowPanel.ButtonData(btn1, () =>
  209. {
  210. window.CloseWindow(false);
  211. onClose(0);
  212. }),
  213. new EditorWindowPanel.ButtonData(btn2, () =>
  214. {
  215. window.CloseWindow(false);
  216. onClose(1);
  217. }),
  218. new EditorWindowPanel.ButtonData(btn3, () =>
  219. {
  220. window.CloseWindow(false);
  221. onClose(2);
  222. })
  223. );
  224. var body = window.OpenBody<EditorTipsPanel>(UiManager.UiNames.EditorTips);
  225. body.SetMessage(message);
  226. }
  227.  
  228. /// <summary>
  229. /// 打开创建地牢组弹窗
  230. /// </summary>
  231. /// <param name="onCreateGroup">创建成功时回调</param>
  232. /// <param name="parentUi">所属父级Ui</param>
  233. public static void ShowCreateGroup(Action<DungeonRoomGroup> onCreateGroup, UiBase parentUi = null)
  234. {
  235. var window = CreateWindowInstance(parentUi);
  236. window.SetWindowTitle("创建地牢组");
  237. window.SetWindowSize(new Vector2I(700, 500));
  238. var body = window.OpenBody<EditorDungeonGroupPanel>(UiManager.UiNames.EditorDungeonGroup);
  239. window.SetButtonList(
  240. new EditorWindowPanel.ButtonData("确定", () =>
  241. {
  242. //获取填写的数据, 并创建ui
  243. var infoData = body.GetData();
  244. //组名
  245. var groupName = infoData.Name;
  246. //检查名称是否合规
  247. if (string.IsNullOrEmpty(groupName))
  248. {
  249. ShowTips("错误", "组名称不能为空!");
  250. return;
  251. }
  252. //验证是否有同名组
  253. var path = MapProjectManager.CustomMapPath + groupName;
  254. var dir = new DirectoryInfo(path);
  255. if (dir.Exists && dir.GetDirectories().Length > 0)
  256. {
  257. ShowTips("错误", $"已经有相同路径的房间了!");
  258. return;
  259. }
  260.  
  261. var group = new DungeonRoomGroup();
  262. group.GroupName = groupName;
  263. group.TileSet = infoData.TileSet;
  264. group.Remark = infoData.Remark;
  265. window.CloseWindow();
  266. onCreateGroup(group);
  267. }),
  268. new EditorWindowPanel.ButtonData("取消", () =>
  269. {
  270. window.CloseWindow();
  271. })
  272. );
  273. }
  274.  
  275. /// <summary>
  276. /// 打开创建地牢组弹窗
  277. /// </summary>
  278. /// <param name="group">原数据</param>
  279. /// <param name="onEditGroup">提交时回调</param>
  280. /// <param name="parentUi">所属父级Ui</param>
  281. public static void ShowEditGroup(DungeonRoomGroup group, Action<DungeonRoomGroup> onEditGroup, UiBase parentUi = null)
  282. {
  283. var window = CreateWindowInstance(parentUi);
  284. window.SetWindowTitle("编辑地牢组");
  285. window.SetWindowSize(new Vector2I(700, 500));
  286. var body = window.OpenBody<EditorDungeonGroupPanel>(UiManager.UiNames.EditorDungeonGroup);
  287. body.InitData(group);
  288. body.SetEditMode();
  289. window.SetButtonList(
  290. new EditorWindowPanel.ButtonData("确定", () =>
  291. {
  292. var infoData = body.GetData();
  293. group.Remark = infoData.Remark;
  294. group.TileSet = infoData.TileSet;
  295. window.CloseWindow();
  296. onEditGroup(group);
  297. }),
  298. new EditorWindowPanel.ButtonData("取消", () =>
  299. {
  300. window.CloseWindow();
  301. })
  302. );
  303. }
  304. /// <summary>
  305. /// 打开创建地牢房间弹窗
  306. /// </summary>
  307. /// <param name="groupName">选择的组名称, 如果不需要有选择的项, 则传 null</param>
  308. /// <param name="roomType">选择的房间类型</param>
  309. /// <param name="onCreateRoom">创建成功时回调</param>
  310. public static void ShowCreateRoom(string groupName, int roomType, Action<DungeonRoomSplit> onCreateRoom)
  311. {
  312. var window = UiManager.Open_EditorWindow();
  313. window.SetWindowTitle("创建地牢房间");
  314. window.SetWindowSize(new Vector2I(700, 600));
  315. var body = window.OpenBody<MapEditorCreateRoomPanel>(UiManager.UiNames.MapEditorCreateRoom);
  316. if (groupName != null)
  317. {
  318. body.SetSelectGroup(groupName);
  319. }
  320. body.SetSelectType(roomType);
  321. window.SetButtonList(
  322. new EditorWindowPanel.ButtonData("确定", () =>
  323. {
  324. //获取填写的数据, 并创建ui
  325. var roomSplit = body.GetRoomInfo();
  326. if (roomSplit != null)
  327. {
  328. window.CloseWindow();
  329. onCreateRoom(roomSplit);
  330. }
  331. }),
  332. new EditorWindowPanel.ButtonData("取消", () =>
  333. {
  334. window.CloseWindow();
  335. })
  336. );
  337. }
  338.  
  339. /// <summary>
  340. /// 编辑地牢房间
  341. /// </summary>
  342. /// <param name="roomSplit">原数据</param>
  343. /// <param name="onSave">保存时回调</param>
  344. public static void ShowEditRoom(DungeonRoomSplit roomSplit, Action<DungeonRoomSplit> onSave)
  345. {
  346. var window = UiManager.Open_EditorWindow();
  347. window.SetWindowTitle("编辑地牢房间");
  348. window.SetWindowSize(new Vector2I(700, 600));
  349. var body = window.OpenBody<MapEditorCreateRoomPanel>(UiManager.UiNames.MapEditorCreateRoom);
  350. body.InitEditData(roomSplit);
  351. window.SetButtonList(
  352. new EditorWindowPanel.ButtonData("确定", () =>
  353. {
  354. //获取填写的数据, 并创建ui
  355. var saveData = body.GetRoomInfo();
  356. if (saveData != null)
  357. {
  358. window.CloseWindow();
  359. onSave(saveData);
  360. }
  361. }),
  362. new EditorWindowPanel.ButtonData("取消", () =>
  363. {
  364. window.CloseWindow();
  365. })
  366. );
  367. }
  368.  
  369. /// <summary>
  370. /// 打开创建房间预设弹窗
  371. /// </summary>
  372. /// <param name="roomType">当前房间的类型</param>
  373. /// <param name="list">当前房间已经包含的所有预设列表</param>
  374. /// <param name="onCreatePreinstall">创建成功时的回调</param>
  375. public static void ShowCreatePreinstall(DungeonRoomType roomType, List<RoomPreinstallInfo> list, Action<RoomPreinstallInfo> onCreatePreinstall)
  376. {
  377. var window = UiManager.Open_EditorWindow();
  378. window.SetWindowTitle("创建房间预设");
  379. window.SetWindowSize(new Vector2I(700, 600));
  380. var body = window.OpenBody<MapEditorCreatePreinstallPanel>(UiManager.UiNames.MapEditorCreatePreinstall);
  381. body.InitData(roomType);
  382. window.SetButtonList(
  383. new EditorWindowPanel.ButtonData("确定", () =>
  384. {
  385. var roomPreinstall = body.GetRoomPreinstall(list);
  386. if (roomPreinstall != null)
  387. {
  388. window.CloseWindow();
  389. onCreatePreinstall(roomPreinstall);
  390. }
  391. }),
  392. new EditorWindowPanel.ButtonData("取消", () =>
  393. {
  394. window.CloseWindow();
  395. })
  396. );
  397. }
  398.  
  399. /// <summary>
  400. /// 打开编辑房间预设弹窗
  401. /// </summary>
  402. /// <param name="roomType">当前房间的类型</param>
  403. /// <param name="list">当前房间已经包含的所有预设列表</param>
  404. /// <param name="preinstallInfo">需要编辑的预设数据</param>
  405. /// <param name="onSavePreinstall">保存时的回调</param>
  406. public static void ShowEditPreinstall(DungeonRoomType roomType, List<RoomPreinstallInfo> list, RoomPreinstallInfo preinstallInfo, Action<RoomPreinstallInfo> onSavePreinstall)
  407. {
  408. var window = UiManager.Open_EditorWindow();
  409. window.SetWindowTitle("创建房间预设");
  410. window.SetWindowSize(new Vector2I(700, 600));
  411. var body = window.OpenBody<MapEditorCreatePreinstallPanel>(UiManager.UiNames.MapEditorCreatePreinstall);
  412. body.InitData(roomType, preinstallInfo);
  413. window.SetButtonList(
  414. new EditorWindowPanel.ButtonData("确定", () =>
  415. {
  416. var roomPreinstall = body.GetRoomPreinstall(list);
  417. if (roomPreinstall != null)
  418. {
  419. window.CloseWindow();
  420. onSavePreinstall(roomPreinstall);
  421. }
  422. }),
  423. new EditorWindowPanel.ButtonData("取消", () =>
  424. {
  425. window.CloseWindow();
  426. })
  427. );
  428. }
  429.  
  430. /// <summary>
  431. /// 打开创建标记页面
  432. /// </summary>
  433. /// <param name="position">初始坐标</param>
  434. /// <param name="preloading">是否提前加载</param>
  435. /// <param name="onCreateMarkInfo">创建标记回调</param>
  436. /// <param name="parentUi">所属父级Ui</param>
  437. public static void ShowCreateMark(Vector2I position, bool preloading, Action<MarkInfo> onCreateMarkInfo , UiBase parentUi = null)
  438. {
  439. var window = CreateWindowInstance(parentUi);
  440. window.SetWindowTitle("创建标记");
  441. window.SetWindowSize(new Vector2I(1400, 900));
  442. var body = window.OpenBody<MapEditorCreateMarkPanel>(UiManager.UiNames.MapEditorCreateMark);
  443. body.InitData(position, preloading);
  444. window.SetButtonList(
  445. new EditorWindowPanel.ButtonData("确定", () =>
  446. {
  447. var markInfo = body.GetMarkInfo();
  448. if (markInfo != null)
  449. {
  450. window.CloseWindow();
  451. onCreateMarkInfo(markInfo);
  452. }
  453. }),
  454. new EditorWindowPanel.ButtonData("取消", () =>
  455. {
  456. window.CloseWindow();
  457. })
  458. );
  459. }
  460.  
  461. /// <summary>
  462. /// 打开编辑标记页面
  463. /// </summary>
  464. /// <param name="data">标记数据对象</param>
  465. /// <param name="preloading">是否提前加载</param>
  466. /// <param name="onSaveMarkInfo">保存时回调</param>
  467. /// <param name="parentUi">所属父级Ui</param>
  468. public static void ShowEditMark(MarkInfo data, bool preloading, Action<MarkInfo> onSaveMarkInfo, UiBase parentUi = null)
  469. {
  470. var window = CreateWindowInstance(parentUi);
  471. window.SetWindowTitle("编辑标记");
  472. window.SetWindowSize(new Vector2I(1400, 900));
  473. var body = window.OpenBody<MapEditorCreateMarkPanel>(UiManager.UiNames.MapEditorCreateMark);
  474. body.InitData(data, preloading);
  475. window.SetButtonList(
  476. new EditorWindowPanel.ButtonData("确定", () =>
  477. {
  478. var markInfo = body.GetMarkInfo();
  479. if (markInfo != null)
  480. {
  481. window.CloseWindow();
  482. onSaveMarkInfo(markInfo);
  483. }
  484. }),
  485. new EditorWindowPanel.ButtonData("取消", () =>
  486. {
  487. window.CloseWindow();
  488. })
  489. );
  490. }
  491.  
  492. /// <summary>
  493. /// 打开选中的物体
  494. /// </summary>
  495. /// <param name="findType">查找的类型, 如果为 none, 则查找所有类型数据</param>
  496. /// <param name="onSelectObject">选中物体时回调</param>
  497. /// <param name="parentUi">所属父级Ui</param>
  498. public static void ShowSelectObject(ActivityType findType, Action<ExcelConfig.ActivityBase> onSelectObject, UiBase parentUi = null)
  499. {
  500. var window = CreateWindowInstance(parentUi);
  501. window.S_Window.Instance.Size = new Vector2I(1000, 700);
  502. window.SetWindowTitle("选择物体");
  503. var body = window.OpenBody<MapEditorSelectObjectPanel>(UiManager.UiNames.MapEditorSelectObject);
  504. //设置显示的物体类型
  505. body.SetShowType(findType);
  506. window.SetButtonList(
  507. new EditorWindowPanel.ButtonData("确定", () =>
  508. {
  509. var selectObject = body.GetSelectData();
  510. if (selectObject == null)
  511. {
  512. ShowTips("提示", "您未选择任何物体");
  513. }
  514. else
  515. {
  516. window.CloseWindow();
  517. onSelectObject(selectObject);
  518. }
  519. }),
  520. new EditorWindowPanel.ButtonData("取消", () =>
  521. {
  522. window.CloseWindow();
  523. })
  524. );
  525. //绑定双击选中物体事件
  526. body.SelectObjectEvent += selectObject =>
  527. {
  528. window.CloseWindow();
  529. onSelectObject(selectObject);
  530. };
  531. }
  532.  
  533. /// <summary>
  534. /// 显示导入组合确认弹窗
  535. /// </summary>
  536. /// <param name="showName">组合名称</param>
  537. /// <param name="color">预览纹理背景颜色</param>
  538. /// <param name="texture">显示纹理</param>
  539. /// <param name="onAccept">确定时回调</param>
  540. /// <param name="onCancel">取消时回调</param>
  541. /// <param name="parentUi">所属父级Ui</param>
  542. public static void ShowImportCombination(string showName, Color color, Texture2D texture, Action<string> onAccept, Action onCancel, UiBase parentUi = null)
  543. {
  544. var window = CreateWindowInstance(parentUi);
  545. window.S_Window.Instance.Size = new Vector2I(750, 650);
  546. window.SetWindowTitle("导入组合");
  547. var body = window.OpenBody<EditorImportCombinationPanel>(UiManager.UiNames.EditorImportCombination);
  548. body.InitData(showName, color, texture);
  549. var accept = false;
  550. if (onCancel != null)
  551. {
  552. window.CloseEvent += () =>
  553. {
  554. if (!accept) onCancel();
  555. };
  556. }
  557.  
  558. window.SetButtonList(
  559. new EditorWindowPanel.ButtonData("确定", () =>
  560. {
  561. accept = true;
  562. var selectObject = body.GetName();
  563. window.CloseWindow();
  564. onAccept(selectObject);
  565. }),
  566. new EditorWindowPanel.ButtonData("取消", () =>
  567. {
  568. window.CloseWindow();
  569. })
  570. );
  571. }
  572. /// <summary>
  573. /// 显示编辑组合弹窗
  574. /// </summary>
  575. /// <param name="showName">组合名称</param>
  576. /// <param name="color">预览纹理背景颜色</param>
  577. /// <param name="texture">显示纹理</param>
  578. /// <param name="onAccept">确定时回调</param>
  579. /// <param name="onDelete">删除时回调</param>
  580. /// <param name="parentUi">所属父级Ui</param>
  581. public static void ShowEditCombination(string showName, Color color, Texture2D texture, Action<string> onAccept, Action onDelete, UiBase parentUi = null)
  582. {
  583. var window = CreateWindowInstance(parentUi);
  584. window.S_Window.Instance.Size = new Vector2I(750, 650);
  585. window.SetWindowTitle("编辑组合");
  586. var body = window.OpenBody<EditorImportCombinationPanel>(UiManager.UiNames.EditorImportCombination);
  587. body.InitData(showName, color, texture);
  588. window.SetButtonList(
  589. new EditorWindowPanel.ButtonData("删除", () =>
  590. {
  591. ShowConfirm("提示", "您确定要删除该组合吗,该操作不能取消!", (flag) =>
  592. {
  593. if (flag)
  594. {
  595. window.CloseWindow();
  596. onDelete();
  597. }
  598. }, window);
  599. }),
  600. new EditorWindowPanel.ButtonData("保存", () =>
  601. {
  602. var selectObject = body.GetName();
  603. window.CloseWindow();
  604. onAccept(selectObject);
  605. }),
  606. new EditorWindowPanel.ButtonData("取消", () =>
  607. {
  608. window.CloseWindow();
  609. })
  610. );
  611. }
  612.  
  613. /// <summary>
  614. /// 显示创建TileSet的面板
  615. /// </summary>
  616. /// <param name="onCreateTileSet">创建完成回调, 第一个参数为TileSet名称, 第二个参数数据数据</param>
  617. /// <param name="parentUi">所属父级Ui</param>
  618. public static void ShowCreateTileSet(Action<string, TileSetSplit> onCreateTileSet, UiBase parentUi = null)
  619. {
  620. var window = CreateWindowInstance(parentUi);
  621. window.SetWindowTitle("创建TileSet");
  622. window.SetWindowSize(new Vector2I(700, 500));
  623. var body = window.OpenBody<EditorInfoPanel>(UiManager.UiNames.EditorInfo);
  624. window.SetButtonList(
  625. new EditorWindowPanel.ButtonData("确定", () =>
  626. {
  627. //获取填写的数据, 并创建ui
  628. var infoData = body.GetInfoData();
  629. //名称
  630. var name = infoData.Name;
  631. //检查名称是否合规
  632. if (string.IsNullOrEmpty(name))
  633. {
  634. ShowTips("错误", "名称不能为空!");
  635. return;
  636. }
  637.  
  638. //验证是否有同名组
  639. var path = EditorTileSetManager.CustomTileSetPath + name;
  640. var dir = new DirectoryInfo(path);
  641. if (dir.Exists && dir.GetFiles().Length > 0)
  642. {
  643. ShowTips("错误", $"已经有相同名称的TileSet了!");
  644. return;
  645. }
  646.  
  647. var tileSetSplit = new TileSetSplit();
  648. tileSetSplit.Remark = infoData.Remark;
  649. tileSetSplit.Path = EditorTileSetManager.CustomTileSetPath + name;
  650. window.CloseWindow();
  651. onCreateTileSet(infoData.Name, tileSetSplit);
  652. }),
  653. new EditorWindowPanel.ButtonData("取消", () =>
  654. {
  655. window.CloseWindow();
  656. })
  657. );
  658. }
  659.  
  660. /// <summary>
  661. /// 显示编辑TileSet的面板
  662. /// </summary>
  663. /// <param name="tileSetSplit">原数据</param>
  664. /// <param name="onCreateTileSet">创建完成回调, 第一个参数为TileSet名称, 第二个参数数据数据</param>
  665. /// <param name="parentUi">所属父级Ui</param>
  666. public static void ShowEditTileSet(TileSetSplit tileSetSplit, Action<TileSetSplit> onCreateTileSet, UiBase parentUi = null)
  667. {
  668. var window = CreateWindowInstance(parentUi);
  669. window.SetWindowTitle("编辑TileSet");
  670. window.SetWindowSize(new Vector2I(700, 500));
  671. var body = window.OpenBody<EditorInfoPanel>(UiManager.UiNames.EditorInfo);
  672. body.InitData(new EditorInfoData(tileSetSplit.TileSetInfo.Name, tileSetSplit.Remark));
  673. body.SetNameInputEnable(false);
  674. window.SetButtonList(
  675. new EditorWindowPanel.ButtonData("确定", () =>
  676. {
  677. //获取填写的数据, 并创建ui
  678. var infoData = body.GetInfoData();
  679. tileSetSplit.Remark = infoData.Remark;
  680. window.CloseWindow();
  681. onCreateTileSet(tileSetSplit);
  682. }),
  683. new EditorWindowPanel.ButtonData("取消", () =>
  684. {
  685. window.CloseWindow();
  686. })
  687. );
  688. }
  689.  
  690. /// <summary>
  691. /// 显示创建地形的面板
  692. /// </summary>
  693. /// <param name="sourceInfo">创建地形时所在的TileSource</param>
  694. /// <param name="onCreate">创建完成回调</param>
  695. /// <param name="parentUi">所属父级Ui</param>
  696. public static void ShowCreateTerrain(TileSetSourceInfo sourceInfo, Action<TileSetTerrainInfo> onCreate, UiBase parentUi = null)
  697. {
  698. var window = CreateWindowInstance(parentUi);
  699. window.SetWindowTitle("创建Terrain");
  700. window.SetWindowSize(new Vector2I(600, 350));
  701. var body = window.OpenBody<EditorFormPanel>(UiManager.UiNames.EditorForm);
  702. //第一项
  703. var item1 = new FormItemData<LineEdit>("地形名称", new LineEdit()
  704. {
  705. PlaceholderText = "请输入名称"
  706. });
  707. //第二项
  708. var option = new OptionButton();
  709. option.AddItem("3x3掩码(47格)");
  710. option.AddItem("2x2掩码(13格)");
  711. option.Selected = 0;
  712. var item2 = new FormItemData<OptionButton>("掩码类型", option);
  713. body.AddItem(item1);
  714. body.AddItem(item2);
  715. window.SetButtonList(
  716. new EditorWindowPanel.ButtonData("确定", () =>
  717. {
  718. var text = item1.UiNode.Text;
  719. if (string.IsNullOrEmpty(text))
  720. {
  721. ShowTips("错误", $"名称不允许为空!");
  722. return;
  723. }
  724. if (sourceInfo.Terrain.FindIndex(info => info.Name == text) >= 0)
  725. {
  726. ShowTips("错误", $"已经有相同名称的Terrain了!");
  727. return;
  728. }
  729.  
  730. var terrainInfo = new TileSetTerrainInfo();
  731. terrainInfo.InitData();
  732. terrainInfo.Name = text;
  733. terrainInfo.TerrainType = (byte)option.Selected;
  734. window.CloseWindow();
  735. onCreate(terrainInfo);
  736. }),
  737. new EditorWindowPanel.ButtonData("取消", () =>
  738. {
  739. window.CloseWindow();
  740. })
  741. );
  742. }
  743. /// <summary>
  744. /// 显示编辑地形的MainBu
  745. /// </summary>
  746. /// <param name="sourceInfo">创建地形时所在的TileSource</param>
  747. /// <param name="onCreate">创建完成回调</param>
  748. /// <param name="parentUi">所属父级Ui</param>
  749. public static void ShowEditTerrain(TileSetSourceInfo sourceInfo, Action<TileSetTerrainInfo> onCreate, UiBase parentUi = null)
  750. {
  751. var window = CreateWindowInstance(parentUi);
  752. window.SetWindowTitle("创建Terrain");
  753. window.SetWindowSize(new Vector2I(600, 350));
  754. var body = window.OpenBody<EditorFormPanel>(UiManager.UiNames.EditorForm);
  755. //第一项
  756. var item1 = new FormItemData<LineEdit>("地形名称", new LineEdit()
  757. {
  758. PlaceholderText = "请输入名称"
  759. });
  760. //第二项
  761. var option = new OptionButton();
  762. option.AddItem("3x3掩码(47格)");
  763. option.AddItem("2x2掩码(13格)");
  764. option.Selected = 0;
  765. var item2 = new FormItemData<OptionButton>("掩码类型", option);
  766. body.AddItem(item1);
  767. body.AddItem(item2);
  768. window.SetButtonList(
  769. new EditorWindowPanel.ButtonData("确定", () =>
  770. {
  771. var text = item1.UiNode.Text;
  772. if (sourceInfo.Terrain.FindIndex(info => info.Name == text) >= 0)
  773. {
  774. ShowTips("错误", $"已经有相同名称的Terrain了!");
  775. return;
  776. }
  777.  
  778. var terrainInfo = new TileSetTerrainInfo();
  779. terrainInfo.InitData();
  780. terrainInfo.Name = text;
  781. terrainInfo.TerrainType = (byte)option.Selected;
  782. window.CloseWindow();
  783. onCreate(terrainInfo);
  784. }),
  785. new EditorWindowPanel.ButtonData("取消", () =>
  786. {
  787. window.CloseWindow();
  788. })
  789. );
  790. }
  791.  
  792. /// <summary>
  793. /// 显示导入纹理的面板
  794. /// </summary>
  795. /// <param name="image">初始纹理</param>
  796. /// <param name="onCreate">点击确定后的回调</param>
  797. /// <param name="parentUi">所属父级Ui</param>
  798. public static void ShowImportTileImage(Image image, Action<Image> onCreate, UiBase parentUi = null)
  799. {
  800. var window = CreateWindowInstance(parentUi);
  801. window.SetWindowTitle("导入纹理");
  802. window.SetWindowSize(new Vector2I(1400, 800));
  803. var body = window.OpenBody<EditorTileImagePanel>(UiManager.UiNames.EditorTileImage);
  804. body.InitData(image);
  805. window.SetButtonList(
  806. new EditorWindowPanel.ButtonData("确定", () =>
  807. {
  808. var img = body.GetImage();
  809. window.CloseWindow();
  810. onCreate(img);
  811. }),
  812. new EditorWindowPanel.ButtonData("取消", () =>
  813. {
  814. window.CloseWindow();
  815. })
  816. );
  817. }
  818. private static EditorWindowPanel CreateWindowInstance(UiBase parentUi = null)
  819. {
  820. if (parentUi != null)
  821. {
  822. return parentUi.OpenNestedUi<EditorWindowPanel>(UiManager.UiNames.EditorWindow);
  823. }
  824.  
  825. return UiManager.Open_EditorWindow();
  826. }
  827.  
  828. private static IEnumerator DelayTimeLabel(float time, Button button)
  829. {
  830. var text = button.Text;
  831. button.Disabled = true;
  832. for (float i = time; i >= 0; i -= 1)
  833. {
  834. button.Text = $"{text}({(int)i}秒)";
  835. yield return new WaitForSeconds(1);
  836. }
  837.  
  838. button.Text = text;
  839. button.Disabled = false;
  840. }
  841. }