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