diff --git a/sample/vars/declare-core.json b/sample/vars/declare-core.json index d139597..cd5290a 100644 --- a/sample/vars/declare-core.json +++ b/sample/vars/declare-core.json @@ -3,21 +3,19 @@ "desc": "", "firstid": 1, "export": true, - "declare": { - "imports": [], - "vars": [ - { - "name": "context", - "desc": "上下文" - }, - { - "name": "version", - "desc": "版本" - } - ] - }, + "import": [], + "declvar": [ + { + "name": "context", + "desc": "上下文" + }, + { + "name": "version", + "desc": "版本" + } + ], "root": { "id": 1, "name": "Sequence" } -} \ No newline at end of file +} diff --git a/sample/vars/declare-vars.json b/sample/vars/declare-vars.json index 2998f3b..a85524d 100644 --- a/sample/vars/declare-vars.json +++ b/sample/vars/declare-vars.json @@ -3,23 +3,19 @@ "desc": "", "firstid": 1, "export": true, - "declare": { - "imports": [ - "vars/declare-core.json" - ], - "vars": [ - { - "name": "owner", - "desc": "所有者" - }, - { - "name": "skill", - "desc": "技能" - } - ] - }, + "import": ["vars/declare-core.json"], + "declvar": [ + { + "name": "owner", + "desc": "所有者" + }, + { + "name": "skill", + "desc": "技能" + } + ], "root": { "id": 1, "name": "Sequence" } -} \ No newline at end of file +} diff --git a/sample/vars/test-subtree.json b/sample/vars/test-subtree.json index 2139cb5..5f12071 100644 --- a/sample/vars/test-subtree.json +++ b/sample/vars/test-subtree.json @@ -3,17 +3,13 @@ "desc": "", "firstid": 1, "export": true, - "declare": { - "imports": [ - "vars/declare-core.json" - ], - "vars": [ - { - "name": "test", - "desc": "测试" - } - ] - }, + "import": ["vars/declare-core.json"], + "declvar": [ + { + "name": "test", + "desc": "测试" + } + ], "root": { "id": 1, "name": "Sequence", @@ -27,4 +23,4 @@ } ] } -} \ No newline at end of file +} diff --git a/sample/vars/test-vars.json b/sample/vars/test-vars.json index a098f59..5b592de 100644 --- a/sample/vars/test-vars.json +++ b/sample/vars/test-vars.json @@ -6,26 +6,24 @@ "group": [ "Client" ], - "declare": { - "imports": [ - "vars/declare-core.json", - "vars/declare-vars.json" - ], - "vars": [ - { - "name": "target", - "desc": "目标" - }, - { - "name": "target1", - "desc": "其它目标" - }, - { - "name": "test", - "desc": "测试" - } - ] - }, + "import": [ + "vars/declare-core.json", + "vars/declare-vars.json" + ], + "declvar": [ + { + "name": "target", + "desc": "目标" + }, + { + "name": "target1", + "desc": "其它目标" + }, + { + "name": "test", + "desc": "测试" + } + ], "root": { "id": 1, "name": "Sequence", diff --git a/src/components/editor.tsx b/src/components/editor.tsx index 696150e..02422e4 100644 --- a/src/components/editor.tsx +++ b/src/components/editor.tsx @@ -49,9 +49,9 @@ interface FilterOption { } const collectVarDefs = (editor: EditorStore) => { - const vars: VarDef[] = editor.declare.vars.slice(); - loadVarDef(editor.declare.imports).forEach((v) => vars.push(v)); - loadSubtreeVarDef(editor.data).forEach((v) => vars.push(v)); + const vars: VarDef[] = editor.declvar.slice(); + loadVarDef(editor.import).forEach((v) => vars.push(v)); + loadSubtreeVarDef(editor.root).forEach((v) => vars.push(v)); return vars; }; @@ -69,33 +69,35 @@ const refreshTreeData = (data: TreeGraphData) => { }; const isTreeUpdated = (editor: EditorStore, editTree: EditTree) => { - const data = editTree.data; if ( - editor.firstid !== data.firstid || - editor.export !== data.export || - editor.name !== data.name || - editor.desc !== data.desc + editor.data.firstid !== editTree.data.firstid || + editor.data.export !== editTree.data.export || + editor.data.name !== editTree.data.name || + editor.data.desc !== editTree.data.desc ) { return true; } - for (let i = 0; i < Math.max(editor.declare.vars.length, data.declare.vars.length); i++) { - const v1: VarDef | undefined = editor.declare.vars[i]; - const v2: VarDef | undefined = data.declare.vars[i]; + let max = Math.max(editor.declvar.length, editTree.data.declvar.length); + for (let i = 0; i < max; i++) { + const v1: VarDef | undefined = editor.declvar[i]; + const v2: VarDef | undefined = editTree.data.declvar[i]; if (v1?.name !== v2?.name || v1?.desc !== v2?.desc) { return true; } } - for (let i = 0; i < Math.max(editor.group.length, data.group.length); i++) { - if (editor.group[i] !== data.group[i]) { + max = Math.max(editor.data.group.length, editTree.data.group.length); + for (let i = 0; i < max; i++) { + if (editor.data.group[i] !== editTree.data.group[i]) { return true; } } - for (let i = 0; i < Math.max(editor.declare.imports.length, data.declare.imports.length); i++) { - const v1: ImportDef | undefined = editor.declare.imports[i]; - const v2: ImportDef | undefined = data.declare.imports[i]; + max = Math.max(editor.import.length, editTree.data.import.length); + for (let i = 0; i < max; i++) { + const v1: ImportDef | undefined = editor.import[i]; + const v2: ImportDef | undefined = editTree.data.import[i]; if (v1?.path !== v2?.path) { return true; } @@ -241,7 +243,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const onSearchChange = (option: FilterOption) => { option.results.length = 0; editor.searchingText = option.filterStr; - filterNodes(option, editor.data); + filterNodes(option, editor.root); setFilterOption({ ...option, }); @@ -259,7 +261,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const updateSearchState = () => { const option = { ...filterOption }; option.results.length = 0; - filterNodes(option, editor.data); + filterNodes(option, editor.root); setFilterOption({ ...option, }); @@ -356,7 +358,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . } } }; - return traverse(editor.data) as TreeGraphData; + return traverse(editor.root) as TreeGraphData; }; const includeString = (content: string | undefined, option: FilterOption) => { @@ -455,23 +457,23 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . }; const refresh = () => { - const rootNode = b3util.createNode(editor.data); + const rootNode = b3util.createNode(editor.root); editor.modifiedTime = fs.statSync(editor.path).mtimeMs; - editor.data = createTreeData(rootNode); - editor.autoId = b3util.refreshTreeDataId(editor.data, editor.firstid); - editor.graph.changeData(editor.data); + editor.root = createTreeData(rootNode); + editor.autoId = b3util.refreshTreeDataId(editor.root, editor.data.firstid); + editor.graph.changeData(editor.root); editor.graph.layout(); restoreViewport(); }; const reload = () => { const file = readJson(editor.path) as TreeModel; - editor.data = createTreeData(file.root); - editor.autoId = b3util.refreshTreeDataId(editor.data, editor.firstid); + editor.root = createTreeData(file.root); + editor.autoId = b3util.refreshTreeDataId(editor.root, editor.data.firstid); editor.unsave = false; updateState(); if (editor.graph) { - editor.graph.changeData(editor.data); + editor.graph.changeData(editor.root); editor.graph.layout(); restoreViewport(); } @@ -479,7 +481,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const checkSubtree = () => { if (editor.graph) { - if (isSubtreeUpdated(editor.data)) { + if (isSubtreeUpdated(editor.root)) { refresh(); pushHistory(); onChange(); @@ -536,13 +538,17 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const updateTree = (editTree: EditTree) => { if (isTreeUpdated(editor, editTree)) { - editor.desc = editTree.data.desc || ""; - editor.export = editTree.data.export !== false; - editor.group = editTree.data.group || []; - editor.firstid = editTree.data.firstid ?? 1; - editor.declare.vars = editTree.data.declare.vars || []; - editor.declare.imports = editTree.data.declare.imports || []; - b3util.updateUsingGroups(editor.group); + editor.data.desc = editTree.data.desc || ""; + editor.data.export = editTree.data.export !== false; + editor.data.group = editTree.data.group || []; + editor.data.firstid = editTree.data.firstid ?? 1; + editor.declvar = editTree.data.declvar || []; + editor.import = editTree.data.import || []; + editor.data.import = editor.import.map((v) => v.path).sort(); + editor.data.declvar = editor.declvar + .map((v) => ({ ...v })) + .sort((a, b) => a.name.localeCompare(b.name)); + b3util.updateUsingGroups(editor.data.group); b3util.updateUsingVars(collectVarDefs(editor)); refresh(); onChange(); @@ -578,7 +584,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const pushHistory = () => { editor.historyStack.length = ++editor.historyIndex; - editor.historyStack.push(b3util.createNode(editor.data)); + editor.historyStack.push(b3util.createNode(editor.root)); }; const copyNode = () => { @@ -649,9 +655,9 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . refreshItem(parentData); updateGrahp(); } else { - editor.data = createTreeData(JSON.parse(str), editor.selectedId); - editor.autoId = b3util.refreshTreeDataId(editor.data, editor.firstid); - editor.graph.changeData(editor.data); + editor.root = createTreeData(JSON.parse(str), editor.selectedId); + editor.autoId = b3util.refreshTreeDataId(editor.root, editor.data.firstid); + editor.graph.changeData(editor.root); editor.graph.render(); editor.graph.layout(); } @@ -723,9 +729,9 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . }; const useStackData = (data: NodeModel) => { - editor.data = createTreeData(data); - editor.autoId = b3util.refreshTreeDataId(editor.data, editor.firstid); - editor.graph.changeData(editor.data); + editor.root = createTreeData(data); + editor.autoId = b3util.refreshTreeDataId(editor.root, editor.data.firstid); + editor.graph.changeData(editor.root); editor.graph.layout(); restoreViewport(); onChange(); @@ -761,25 +767,13 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const save = () => { if (editor.unsave || !fs.existsSync(editor.path)) { const path = editor.path; - editor.autoId = b3util.refreshTreeDataId(editor.data, editor.firstid); - const root = b3util.createFileData(editor.data); - const treeModel = { - name: Path.basenameWithoutExt(path), - desc: editor.desc, - firstid: editor.firstid ?? 1, - export: editor.export, - group: editor.group ?? [], - declare: { - imports: editor.declare.imports.map((v) => v.path).sort(), - vars: editor.declare.vars.sort((a, b) => a.name.localeCompare(b.name)), - }, - root, - } as TreeModel; + editor.autoId = b3util.refreshTreeDataId(editor.root, editor.data.firstid); + editor.data.root = b3util.createFileData(editor.root); editor.modifiedTime = Date.now(); - fs.writeFileSync(path, JSON.stringify(treeModel, null, 2)); + fs.writeFileSync(path, JSON.stringify(editor.data, null, 2)); workspace.updateFileMeta(editor); editor.unsave = false; - editor.graph.changeData(editor.data); + editor.graph.changeData(editor.root); editor.graph.layout(); restoreViewport(); updateSearchState(); @@ -924,7 +918,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const data = findDataById(e.item.getID()); data.output?.forEach((v) => v && highlight.push(v)); } - const changed = findHightlight(editor.data, highlight); + const changed = findHightlight(editor.root, highlight); if (changed.length > 0) { const refreshHighlight = (node: TreeGraphData) => { const item = editor.graph.findById(node.id); @@ -942,7 +936,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . node.children.forEach(refreshHighlight); } }; - refreshHighlight(editor.data); + refreshHighlight(editor.root); } if (highlight.length === 0 && editor.searchingText) { onSearchChange({ @@ -1126,8 +1120,8 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . onChange(); }); - refreshTreeData(editor.data); - editor.graph.data(editor.data); + refreshTreeData(editor.root); + editor.graph.data(editor.root); editor.graph.render(); if (editor.graphMatrix) { restoreViewport(); @@ -1249,7 +1243,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . useEffect(() => { if (workspace.editing === editor) { checkSubtree(); - b3util.updateUsingGroups(editor.group); + b3util.updateUsingGroups(editor.data.group); b3util.updateUsingVars(collectVarDefs(editor)); } }, [workspace.editing]); @@ -1257,7 +1251,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . // check should repaint node useEffect(() => { if (editor.graph) { - editor.graph.changeData(editor.data); + editor.graph.changeData(editor.root); editor.graph.layout(); restoreViewport(); } diff --git a/src/components/inspector.tsx b/src/components/inspector.tsx index b7ffb84..a6db620 100644 --- a/src/components/inspector.tsx +++ b/src/components/inspector.tsx @@ -94,16 +94,16 @@ const TreeInspector: FC = () => { // set form values useEffect(() => { const data = workspace.editingTree.data; - loadVarDef(data.declare.imports); + loadVarDef(data.import); form.resetFields(); form.setFieldValue("name", data.name); form.setFieldValue("desc", data.desc); form.setFieldValue("export", data.export !== false); form.setFieldValue("firstid", data.firstid); form.setFieldValue("group", groupDefs); - form.setFieldValue("declare.vars", data.declare?.vars); - form.setFieldValue("declare.imports", data.declare?.imports); - form.setFieldValue("declare.subtree", data.declare?.subtree); + form.setFieldValue("declvar", data.declvar); + form.setFieldValue("import", data.import); + form.setFieldValue("subtree", data.subtree); }, [workspace.editingTree, groupDefs]); const finish = (values: any) => { @@ -117,18 +117,16 @@ const TreeInspector: FC = () => { .map((v) => (v.value ? v.name : undefined)) .filter((v) => v) .sort(), - declare: { - vars: (values["declare.vars"] as VarDef[]) - .filter((v) => v && v.name) - .sort((a, b) => a.name.localeCompare(b.name)), - imports: (values["declare.imports"] as ImportDef[]) - .filter((v) => v && v.path) - .sort((a, b) => a.path.localeCompare(b.path)) - .map((v) => ({ - path: v.path, - vars: v.vars ?? [], - })), - }, + declvar: (values["declvar"] as VarDef[]) + .filter((v) => v && v.name) + .sort((a, b) => a.name.localeCompare(b.name)), + import: (values["import"] as ImportDef[]) + .filter((v) => v && v.path) + .sort((a, b) => a.path.localeCompare(b.path)) + .map((v) => ({ + path: v.path, + vars: v.vars ?? [], + })), }, } as EditTree); }; @@ -200,7 +198,7 @@ const TreeInspector: FC = () => {

{t("tree.vars")}

- + {(items, { add, remove }, { errors }) => (
{items.map((item) => ( @@ -285,12 +283,12 @@ const TreeInspector: FC = () => { )} - {workspace.editingTree.data.declare.subtree.length > 0 && ( + {workspace.editingTree.data.subtree.length > 0 && ( <>

{t("tree.vars.subtree")}

- + {(vars) => (
{vars.map((v, idx, arr) => ( @@ -354,7 +352,7 @@ const TreeInspector: FC = () => {

{t("tree.vars.imports")}

- + {(items, { add, remove }, { errors }) => (
{items.map((item) => ( @@ -610,7 +608,7 @@ const NodeInspector: FC = () => { } }); } else { - collect(workspace.editing?.data); + collect(workspace.editing?.root); } return options; }, [workspace.editing, usingVars]); diff --git a/src/contexts/workspace-context.ts b/src/contexts/workspace-context.ts index 5cbe345..b14d038 100644 --- a/src/contexts/workspace-context.ts +++ b/src/contexts/workspace-context.ts @@ -12,7 +12,7 @@ import { message } from "../misc/hooks"; import i18n from "../misc/i18n"; import Path from "../misc/path"; import { zhNodeDef } from "../misc/template"; -import { readJson, writeJson } from "../misc/util"; +import { readJson, readTree, writeJson } from "../misc/util"; import { useSetting } from "./setting-context"; let buildDir: string | undefined; @@ -44,17 +44,11 @@ export type EditEvent = export class EditorStore { path: string; - data: TreeGraphData; - desc: string; - export: boolean; - name: string; - firstid: number; - group: string[]; + data: TreeModel; - declare: { - imports: ImportDef[]; - vars: VarDef[]; - }; + root: TreeGraphData; + import: ImportDef[]; + declvar: VarDef[]; autoId: number = 1; dragSrcId?: string; @@ -78,25 +72,18 @@ export class EditorStore { constructor(path: string) { this.path = path; - - const file = readJson(path) as TreeModel; - this.data = b3util.createTreeData(file.root); + this.data = readTree(path); + this.data.name = Path.basenameWithoutExt(path); + this.data.firstid = this.data.firstid ?? 1; + this.data.group = this.data.group ?? []; + this.data.import = this.data.import ?? []; + this.data.declvar = this.data.declvar ?? []; + this.root = b3util.createTreeData(this.data.root); this.modifiedTime = fs.statSync(path).mtimeMs; - this.desc = file.desc ?? ""; - this.export = file.export !== false; - this.name = file.name || path.slice(0, -5); - this.firstid = file.firstid ?? 1; - this.group = file.group ?? []; - this.declare = { - vars: file.declare?.vars ?? [], - imports: - file.declare?.imports?.map((v) => ({ - path: v, - vars: [], - })) ?? [], - }; - this.autoId = b3util.refreshTreeDataId(this.data, this.firstid); - this.historyStack.push(b3util.createNode(this.data)); + this.import = this.data.import.map((v) => ({ path: v, vars: [] })); + this.declvar = this.data.declvar.map((v) => ({ ...v })); + this.autoId = b3util.refreshTreeDataId(this.root, this.data.firstid); + this.historyStack.push(b3util.createNode(this.root)); this.historyIndex = 0; } } @@ -129,11 +116,9 @@ export type EditTree = { export?: boolean; firstid?: number; group: string[]; - declare: { - imports: ImportDef[]; - vars: VarDef[]; - subtree: VarDef[]; - }; + import: ImportDef[]; + declvar: VarDef[]; + subtree: VarDef[]; }; }; @@ -459,8 +444,8 @@ export const useWorkspace = create((set, get) => ({ const workspace = get(); const path = workspace.relative(editor.path); const file = workspace.allFiles.get(path); - if (file && file.desc !== editor.desc) { - file.desc = editor.desc; + if (file && file.desc !== editor.data.desc) { + file.desc = editor.data.desc; set({ allFiles: new Map(workspace.allFiles) }); workspace.saveWorkspace(); } @@ -518,21 +503,7 @@ export const useWorkspace = create((set, get) => ({ let editting = workspace.editing; if (editors.length && path === editting?.path) { editting = editors[idx === editors.length ? idx - 1 : idx]; - set({ - editingTree: { - data: { - name: editting.name, - desc: editting.desc, - firstid: editting.firstid, - group: editting.group, - declare: { - vars: editting.declare.vars, - imports: editting.declare.imports, - subtree: loadSubtreeVarDef(editting.data), - }, - }, - }, - }); + workspace.onEditingTree(editting); } if (editors.length === 0) { editting = undefined; @@ -681,16 +652,10 @@ export const useWorkspace = create((set, get) => ({ set({ editingTree: { data: { - name: editor.name, - desc: editor.desc, - export: editor.export, - firstid: editor.firstid, - group: editor.group, - declare: { - imports: editor.declare.imports, - vars: editor.declare.vars, - subtree: loadSubtreeVarDef(editor.data), - }, + ...editor.data, + import: editor.import, + declvar: editor.declvar, + subtree: loadSubtreeVarDef(editor.root), }, }, editingNodeDef: null, diff --git a/src/misc/b3type.ts b/src/misc/b3type.ts index b3bcce8..bb6e7e6 100644 --- a/src/misc/b3type.ts +++ b/src/misc/b3type.ts @@ -51,12 +51,10 @@ export interface TreeModel { name: string; desc?: string; export?: boolean; - firstid?: number; - group?: string[]; - declare?: { - imports?: string[]; - vars?: VarDef[]; - }; + firstid: number; + group: string[]; + import: string[]; + declvar: VarDef[]; root: NodeModel; } diff --git a/src/misc/b3util.ts b/src/misc/b3util.ts index 4c92499..5e58ec3 100644 --- a/src/misc/b3util.ts +++ b/src/misc/b3util.ts @@ -700,6 +700,10 @@ export const createFileData = (data: TreeGraphData, includeSubtree?: boolean) => export const createNewTree = (path: string) => { const tree: TreeModel = { name: Path.basenameWithoutExt(path), + firstid: 1, + group: [], + import: [], + declvar: [], root: { id: 1, name: "Sequence", @@ -729,8 +733,8 @@ export const loadVarDef = (list: ImportDef[]) => { filter.set(path, true); try { const model: TreeModel = readTree(`${workdir}/${path}`); - model.declare?.vars?.forEach((v) => vars.push(v)); - model.declare?.imports?.forEach((v) => load(v)); + model.declvar.forEach((v) => vars.push(v)); + model.import.forEach((v) => load(v)); } catch (e) { alertError(`parsing error: ${path}`); }