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