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