From e4f0686f2f89ff417b05993e575aa683bda39438 Mon Sep 17 00:00:00 2001 From: codetypes Date: Fri, 19 Jul 2024 00:06:29 +0800 Subject: [PATCH] support check children limit --- public/locales/en.json | 2 + public/locales/zh.json | 2 + src/components/editor.tsx | 14 +++++ src/components/inspector.tsx | 87 ++++++++++++++----------------- src/contexts/workspace-context.ts | 1 + src/misc/b3type.ts | 1 + src/misc/b3util.ts | 24 +++++++++ 7 files changed, 84 insertions(+), 47 deletions(-) diff --git a/public/locales/en.json b/public/locales/en.json index c2560eb..3576688 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -82,6 +82,8 @@ "regnode.subtree": "Subtree: ", "node.args": "Const arguments", + "node.children": "Subnode limit", + "node.children.unlimited": "Unlimited", "node.debug": "Debug", "node.disabled": "Disabled", "node.deleteRootNodeDenied": "Unable to delete the root node", diff --git a/public/locales/zh.json b/public/locales/zh.json index a2a84f8..29df5f1 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -82,6 +82,8 @@ "regnode.subtree": "子树:", "node.args": "常量参数", + "node.children": "子节点数量", + "node.children.unlimited": "无限制", "node.debug": "调试", "node.disabled": "禁用", "node.deleteRootNodeDenied": "不能删除根节点", diff --git a/src/components/editor.tsx b/src/components/editor.tsx index fb7c4f7..fa087b4 100644 --- a/src/components/editor.tsx +++ b/src/components/editor.tsx @@ -403,6 +403,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . workspace.onEditingNode({ data: b3util.createNode(data, false), editable: !isSubtreeNode(data), + limit_error: !b3util.checkChildrenLimit(data), }); setItemState(editor.selectedId, "selected", true); } else { @@ -453,6 +454,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . selectNode(null); curNodeData.children ||= []; curNodeData.children.push(data); + refreshItem(curNodeData); updateGrahp(); pushHistory(); onChange(); @@ -485,6 +487,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const data = b3util.createTreeData(JSON.parse(str), editor.selectedId); editor.autoId = b3util.refreshTreeDataId(data, editor.autoId); parentData.children![idx] = data; + refreshItem(parentData); updateGrahp(); } else { editor.data = b3util.createTreeData(JSON.parse(str), editor.selectedId); @@ -520,6 +523,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . }; curNodeData.children ||= []; curNodeData.children.push(b3util.createTreeData(newNodeData, editor.selectedId)); + refreshItem(curNodeData); updateGrahp(); pushHistory(); onChange(); @@ -544,12 +548,17 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const parentData = findParent(data)!; parentData.children = parentData.children!.filter((e) => e.id != editor.selectedId); + refreshItem(parentData); selectNode(null); updateGrahp(); pushHistory(); onChange(); }; + const refreshItem = (data: TreeGraphData) => { + editor.graph.findById(data.id)?.draw(); + }; + const useStackData = (data: NodeModel) => { editor.data = b3util.createTreeData(data); editor.autoId = b3util.refreshTreeDataId(editor.data); @@ -844,6 +853,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . ); dstData.children ||= []; dstData.children.push(newTreeData); + refreshItem(dstData); srcNodeId = newTreeData.id; } else if (exploreFile && exploreFile !== editor.path) { const newTreeData: TreeGraphData = b3util.createTreeData( @@ -856,6 +866,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . ); dstData.children ||= []; dstData.children.push(newTreeData); + refreshItem(dstData); srcNodeId = newTreeData.id; editor.autoId = b3util.refreshTreeDataId(newTreeData, Number(srcNodeId)); } @@ -916,6 +927,9 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . return; } + refreshItem(srcParent); + refreshItem(dstData); + updateGrahp(); pushHistory(); onChange(); diff --git a/src/components/inspector.tsx b/src/components/inspector.tsx index 47ea1b1..ee9b9cc 100644 --- a/src/components/inspector.tsx +++ b/src/components/inspector.tsx @@ -1,7 +1,6 @@ import { EditNode, EditTree, useWorkspace } from "@/contexts/workspace-context"; -import { NodeArgType, NodeModel, TreeGraphData, TreeModel } from "@/misc/b3type"; +import { NodeArgType, NodeModel, TreeGraphData } from "@/misc/b3type"; import { Hotkey, isMacos } from "@/misc/keys"; -import Path from "@/misc/path"; import { EditOutlined } from "@ant-design/icons"; import { AutoComplete, @@ -102,6 +101,11 @@ const NodeInspector: FC = () => { form.setFieldValue("debug", data.debug); form.setFieldValue("disabled", data.disabled); form.setFieldValue("path", data.path); + if (def.children === undefined || def.children === -1) { + form.setFieldValue("children", t("node.children.unlimited")); + } else { + form.setFieldValue("children", def.children); + } def.args?.forEach((v) => { form.setFieldValue(`args.${v.name}`, data.args?.[v.name] ?? v.default); }); @@ -241,22 +245,18 @@ const NodeInspector: FC = () => { labelCol={{ span: "auto" }} onFinish={finish} > - {t("node.id")} - } - > + - {t("node.type")} - } - > + + + + { }; const { t } = useTranslation(); const [form] = Form.useForm(); - const data = workspace.editingNodeDef.data; + const def = workspace.editingNodeDef.data; // set form values useEffect(() => { form.resetFields(); - form.setFieldValue("name", data.name); - form.setFieldValue("type", data.type); - form.setFieldValue("desc", data.desc); - form.setFieldValue("doc", data.doc); - data.input?.forEach((v, i) => { + form.setFieldValue("name", def.name); + form.setFieldValue("type", def.type); + form.setFieldValue("desc", def.desc); + form.setFieldValue("doc", def.doc); + if (def.children === undefined || def.children === -1) { + form.setFieldValue("children", t("node.children.unlimited")); + } else { + form.setFieldValue("children", def.children); + } + def.input?.forEach((v, i) => { form.setFieldValue(`input.${i}.name`, v.replaceAll("?", "")); }); - data.output?.forEach((v, i) => { + def.output?.forEach((v, i) => { form.setFieldValue(`output.${i}.name`, v.replaceAll("?", "")); }); - data.args?.forEach((v, i) => { + def.args?.forEach((v, i) => { form.setFieldValue(`args.${i}.type`, v.type.replaceAll("?", "")); }); }, [workspace.editingNodeDef]); @@ -452,37 +457,25 @@ const NodeDefInspector: FC = () => { labelCol={{ span: "auto" }} // onFinish={finish} > - {t("node.name")} - } - > + - {t("node.type")} - } - > + - {t("node.desc")} - } - > + + + +