From 91da6f0071b4fbc5bbc929e1f47ed062531d9c47 Mon Sep 17 00:00:00 2001 From: codetypes Date: Wed, 13 Mar 2024 08:29:28 +0800 Subject: [PATCH] save selected as subtree quickly --- common/MainEventType.ts | 1 + main-process/AppMenu.ts | 14 ++++++++++++++ render-process/Editor/index.tsx | 28 ++++++++++++++++++++++++++++ render-process/TreeTabs.tsx | 11 ++++++++++- 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/common/MainEventType.ts b/common/MainEventType.ts index 80f80f9..eccef01 100644 --- a/common/MainEventType.ts +++ b/common/MainEventType.ts @@ -11,6 +11,7 @@ export default { SAVE_ALL: "SAVE_ALL", BUILD: "BUILD", SAVE: "SAVE", + SAVE_AS_SUBTREE: "SAVE_AS_SUBTREE", UNDO: "UNDO", REDO: "REDO", }; diff --git a/main-process/AppMenu.ts b/main-process/AppMenu.ts index 354a5c1..870670c 100644 --- a/main-process/AppMenu.ts +++ b/main-process/AppMenu.ts @@ -115,6 +115,20 @@ export default class AppMenu { this.webContents.send(MainEventType.SAVE_ALL); }, }, + { + label: "保存为子树", + click: async () => { + const res = await dialog.showSaveDialog({ + defaultPath: this.settings.workdir, + properties: ["showOverwriteConfirmation"], + filters: [{ name: "Json", extensions: ["json"] }], + }); + if (!res.canceled) { + const path = res.filePath; + this.webContents.send(MainEventType.SAVE_AS_SUBTREE, path); + } + }, + }, { label: "合并导出Json", click: () => { diff --git a/render-process/Editor/index.tsx b/render-process/Editor/index.tsx index 6c4f4a7..50a85ce 100644 --- a/render-process/Editor/index.tsx +++ b/render-process/Editor/index.tsx @@ -463,6 +463,34 @@ export default class Editor extends React.Component { this.graph.set("animate", true); } + saveAsSubtree(subpath: string) { + const { curNodeId } = this.state; + if (!curNodeId) { + message.warn("未选择一个节点"); + return; + } else if (curNodeId == "1") { + message.warn("根节点不能保存为子树"); + return; + } + const workdir = this.settings.workdir; + if (subpath.indexOf(workdir) == -1) { + message.warn("请保存在工作区中"); + return; + } + const data = this.graph.findDataById(curNodeId) as GraphNodeModel; + const subroot = Utils.createFileData(data); + const subtreeModel = { + name: path.basename(subpath).slice(0, -5), + root: subroot, + desc: data.desc, + } as BehaviorTreeModel; + fs.writeFileSync(subpath, JSON.stringify(subtreeModel, null, 2)); + this.pushUndoStack(); + data.path = subpath.substring(workdir.length + 1); + this.unsave = true; + this.save(); + } + reload() { if (!this.unsave) { const data = this.graph.findDataById("1") as GraphNodeModel; diff --git a/render-process/TreeTabs.tsx b/render-process/TreeTabs.tsx index 99e15c9..a2dc5f0 100644 --- a/render-process/TreeTabs.tsx +++ b/render-process/TreeTabs.tsx @@ -64,6 +64,15 @@ export default class TreeTabs extends Component { message.success("已保存"); }); + ipcRenderer.on(MainEventType.SAVE_AS_SUBTREE, (event: any, path: string) => { + const { curTree: curPath } = this.state; + if (!curPath) { + return; + } + const editor = this.editors[curPath]; + editor.saveAsSubtree(path); + }); + ipcRenderer.on(MainEventType.SAVE_ALL, (event: any) => { for (let k in this.editors) { let editor = this.editors[k]; @@ -72,7 +81,7 @@ export default class TreeTabs extends Component { message.success("已保存所有行为树"); }); - ipcRenderer.on(MainEventType.BUILD, async (event, buildDir) => { + ipcRenderer.on(MainEventType.BUILD, async (event, buildDir: string) => { for (let k in this.editors) { let editor = this.editors[k]; editor.save();