diff --git a/electron/main/index.ts b/electron/main/index.ts index 5cbd79e..7222992 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -171,3 +171,8 @@ ipcMain.handle("trashItem", (_, arg: string) => { arg = arg.replace(/\//g, path.sep); shell.trashItem(arg).catch((e) => console.error(e)); }); + +ipcMain.handle("showItemInFolder", (_, arg: string) => { + arg = arg.replace(/\//g, path.sep); + shell.showItemInFolder(arg); +}); diff --git a/package-lock.json b/package-lock.json index 2482522..9a3e6ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "behavior3editor", - "version": "1.2.0", + "version": "1.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "behavior3editor", - "version": "1.2.0", + "version": "1.3.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 0a6aeca..14748c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "behavior3editor", - "version": "1.2.0", + "version": "1.3.0", "main": "dist-electron/main/index.js", "description": "行为树编辑器", "author": "zhandouxiaojiji & codetypes", diff --git a/public/icons/Decorator.svg b/public/icons/Decorator.svg index d670472..4b10007 100644 --- a/public/icons/Decorator.svg +++ b/public/icons/Decorator.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/icons/Disabled.svg b/public/icons/Disabled.svg new file mode 100644 index 0000000..92bd8f5 --- /dev/null +++ b/public/icons/Disabled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/locales/en.json b/public/locales/en.json index 5cdd47b..c7ff136 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -77,8 +77,8 @@ "regnode.subtree": "Subtree: ", "node.args": "Const arguments", - "node.codePlaceholder": "a.b * 3 > 2", "node.debug": "Debug", + "node.disabled": "Disabled", "node.deleteRootNodeDenied": "Unable to delete the root node", "node.editSubtreeDenied": "Unable to edit the subtree node", "node.desc": "Node desc", diff --git a/public/locales/zh.json b/public/locales/zh.json index de3ca5f..f9db29f 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -77,8 +77,8 @@ "regnode.subtree": "子树:", "node.args": "常量参数", - "node.codePlaceholder": "a.b * 3 > 2", "node.debug": "调试", + "node.disabled": "禁用", "node.deleteRootNodeDenied": "不能删除根节点", "node.editSubtreeDenied": "不能编辑子树节点", "node.desc": "节点说明", diff --git a/sample/workspace.b3-workspace b/sample/workspace.b3-workspace index 9a58516..577cdcc 100644 --- a/sample/workspace.b3-workspace +++ b/sample/workspace.b3-workspace @@ -1,5 +1,28 @@ { - "isRelative": true, - "nodeConfPath": "node-config.json", - "workdir": "workdir" + "files": [ + { + "path": "workdir/hero.json", + "desc": "英雄测试AI" + }, + { + "path": "workdir/monster.json", + "desc": "怪物测试AI" + }, + { + "path": "workdir/sub/subtree1.json", + "desc": "子树1" + }, + { + "path": "workdir/sub/subtree2.json", + "desc": "子树2" + }, + { + "path": "workdir/subtree1.json", + "desc": "子树1" + }, + { + "path": "workdir/subtree2.json", + "desc": "子树2" + } + ] } \ No newline at end of file diff --git a/src/components/editor.tsx b/src/components/editor.tsx index 1cf1e60..6244826 100644 --- a/src/components/editor.tsx +++ b/src/components/editor.tsx @@ -131,6 +131,8 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . onEditingTree: useWorkspace((state) => state.onEditingTree), open: useWorkspace((state) => state.open), workdir: useWorkspace((state) => state.workdir), + relative: useWorkspace((state) => state.relative), + updateFileMeta: useWorkspace((state) => state.updateFileMeta), }; const searchInputRef = useRef(null); @@ -605,8 +607,8 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . desc: editor.desc, } as TreeModel; fs.writeFileSync(path, JSON.stringify(treeModel, null, 2)); + workspace.updateFileMeta(editor); editor.unsave = false; - editor.data = b3util.createTreeData(root); editor.autoId = b3util.refreshTreeDataId(editor.data); editor.graph.changeData(editor.data); @@ -664,7 +666,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . desc: data.desc, } as TreeModel; fs.writeFileSync(subpath, JSON.stringify(subtreeModel, null, 2)); - data.path = Path.relative(workspace.workdir, subpath).replaceAll(Path.sep, "/"); + data.path = workspace.relative(subpath); reload(); pushHistory(); onChange(); @@ -858,7 +860,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . { id: editor.autoId++, name: "unknow", - path: Path.relative(workspace.workdir, exploreFile).replaceAll(Path.sep, "/"), + path: workspace.relative(exploreFile), }, dstData.id ); @@ -1185,8 +1187,8 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . type="text" size="small" className={mergeClassNames( - "b3-editor-button-filter", - filterOption.filterCase && "b3-editor-button-filter-selected" + "b3-editor-filter", + filterOption.filterCase && "b3-editor-filter-selected" )} icon={} onClick={() => @@ -1201,8 +1203,8 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . type="text" size="small" className={mergeClassNames( - "b3-editor-button-filter", - filterOption.filterFocus && "b3-editor-button-filter-selected" + "b3-editor-filter", + filterOption.filterFocus && "b3-editor-filter-selected" )} icon={} onClick={() => diff --git a/src/components/explorer.tsx b/src/components/explorer.tsx index fa2c748..d6ab114 100644 --- a/src/components/explorer.tsx +++ b/src/components/explorer.tsx @@ -551,7 +551,7 @@ export const Explorer: FC = () => { break; } case "revealFile": - shell.showItemInFolder(node.path.replaceAll("/", Path.sep)); + ipcRenderer.invoke("showItemInFolder", node.path); break; case "rename": { node.editing = true; @@ -709,8 +709,6 @@ export const Explorer: FC = () => { return arr; }, [t, copyFile]); - const nodeConfs = useMemo(() => {}, [workspace.nodeDefs]); - const onClick = (info: MenuInfo) => { const node = findFile(selectedKeys[0], workspace.fileTree!) ?? workspace.fileTree; if (node) { @@ -804,7 +802,19 @@ export const Explorer: FC = () => { ); } else { - return {node.title}; + return ( +
+
+ {node.title} +
+
+ ); } }} allowDrop={(options) => { @@ -826,6 +836,19 @@ export const Explorer: FC = () => { fieldNames={{ key: "title" }} treeData={nodeTree ? [nodeTree] : []} draggable={{ icon: false, nodeDraggable: (node) => !!node.isLeaf }} + titleRender={(node) => ( +
+
+ {node.title} +
+
+ )} onSelect={(_, info) => { const node = info.node; if (node && node.isLeaf) { diff --git a/src/components/inspector.tsx b/src/components/inspector.tsx index d250939..3c35159 100644 --- a/src/components/inspector.tsx +++ b/src/components/inspector.tsx @@ -3,12 +3,15 @@ import { NodeArgType, NodeModel, TreeGraphData, TreeModel } from "@/misc/b3type" import { Hotkey, isMacos } from "@/misc/keys"; import Path from "@/misc/path"; import { AutoComplete, Divider, Flex, Form, Input, InputNumber, Select, Switch } from "antd"; +import TextArea from "antd/es/input/TextArea"; import { DefaultOptionType } from "antd/es/select"; import { FC, useEffect, useMemo } from "react"; import { useTranslation } from "react-i18next"; import Markdown from "react-markdown"; -interface OptionType extends DefaultOptionType {} +interface OptionType extends DefaultOptionType { + value: string; +} const TreeInspector: FC = () => { const workspace = { @@ -52,7 +55,7 @@ const TreeInspector: FC = () => { - +