Skip to content

Commit 43cb3cc

Browse files
committed
🚧 添加prg格式支持
1 parent d0881a9 commit 43cb3cc

File tree

5 files changed

+51
-29
lines changed

5 files changed

+51
-29
lines changed

app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"dependencies": {
1919
"@generouted/react-router": "^1.19.9",
2020
"@marsidev/react-turnstile": "^1.1.0",
21+
"@msgpack/msgpack": "^3.1.1",
2122
"@octokit/rest": "^21.0.2",
2223
"@tauri-apps/api": "^2.1.1",
2324
"@tauri-apps/plugin-cli": "~2.2.0",

app/src/core/service/dataFileService/StageSaveManager.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import { encode } from "@msgpack/msgpack";
12
import { Serialized } from "../../../types/node";
2-
import { createFolder, exists, writeTextFile } from "../../../utils/fs";
3+
import { createFolder, exists, writeFile, writeTextFile } from "../../../utils/fs";
34
import { PathString } from "../../../utils/pathString";
45
import { Stage } from "../../stage/Stage";
56
import { StageHistoryManager } from "../../stage/stageManager/StageHistoryManager";
@@ -17,7 +18,11 @@ export namespace StageSaveManager {
1718
* @param errorCallback
1819
*/
1920
export async function saveHandle(path: string, data: Serialized.File) {
20-
await writeTextFile(path, JSON.stringify(data));
21+
if (path.endsWith(".json")) {
22+
await writeTextFile(path, JSON.stringify(data));
23+
} else if (path.endsWith(".prg")) {
24+
await writeFile(path, encode(data));
25+
}
2126
isCurrentSaved = true;
2227
}
2328

app/src/core/service/dataFileService/fileLoader.tsx

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
1+
import { decodeAsync } from "@msgpack/msgpack";
2+
import { Dialog } from "../../../components/dialog";
13
import { Serialized } from "../../../types/node";
2-
import { exists, readTextFile } from "../../../utils/fs";
4+
import { exists, readFile, readTextFile } from "../../../utils/fs";
5+
import { PathString } from "../../../utils/pathString";
6+
import { isWeb } from "../../../utils/platform";
7+
import { Vector } from "../../dataStruct/Vector";
38
import { Camera } from "../../stage/Camera";
49
import { StageLoader } from "../../stage/StageLoader";
510
import { StageHistoryManager } from "../../stage/stageManager/StageHistoryManager";
611
import { StageManager } from "../../stage/stageManager/StageManager";
12+
import { CubicCatmullRomSplineEdge } from "../../stage/stageObject/association/CubicCatmullRomSplineEdge";
713
import { LineEdge } from "../../stage/stageObject/association/LineEdge";
14+
import { MultiTargetUndirectedEdge } from "../../stage/stageObject/association/MutiTargetUndirectedEdge";
815
import { ConnectPoint } from "../../stage/stageObject/entity/ConnectPoint";
916
import { ImageNode } from "../../stage/stageObject/entity/ImageNode";
17+
import { PenStroke } from "../../stage/stageObject/entity/PenStroke";
18+
import { PortalNode } from "../../stage/stageObject/entity/PortalNode";
1019
import { Section } from "../../stage/stageObject/entity/Section";
20+
import { SvgNode } from "../../stage/stageObject/entity/SvgNode";
1121
import { TextNode } from "../../stage/stageObject/entity/TextNode";
1222
import { UrlNode } from "../../stage/stageObject/entity/UrlNode";
13-
import { PenStroke } from "../../stage/stageObject/entity/PenStroke";
14-
import { PortalNode } from "../../stage/stageObject/entity/PortalNode";
15-
import { PathString } from "../../../utils/pathString";
16-
import { isWeb } from "../../../utils/platform";
17-
import { Vector } from "../../dataStruct/Vector";
18-
import { CubicCatmullRomSplineEdge } from "../../stage/stageObject/association/CubicCatmullRomSplineEdge";
19-
import { MultiTargetUndirectedEdge } from "../../stage/stageObject/association/MutiTargetUndirectedEdge";
2023
import { RecentFileManager } from "./RecentFileManager";
21-
import { SvgNode } from "../../stage/stageObject/entity/SvgNode";
22-
import { Dialog } from "../../../components/dialog";
2324

2425
/**
2526
* 将文件里的内容加载到舞台上
@@ -63,19 +64,23 @@ export namespace FileLoader {
6364
});
6465
return null;
6566
}
66-
let content: string;
67+
let data: any;
6768
try {
68-
content = await readTextFile(path);
69+
if (path.endsWith(".json")) {
70+
data = JSON.parse(await readTextFile(path));
71+
} else if (path.endsWith(".prg")) {
72+
data = await decodeAsync(new Blob([await readFile(path)]).stream());
73+
}
6974
} catch (e) {
75+
console.error(e);
7076
Dialog.show({
7177
title: "打开文件失败",
7278
content: "打开文件失败:" + JSON.stringify(e),
7379
type: "error",
7480
});
7581
return null;
7682
}
77-
const data = StageLoader.validate(JSON.parse(content));
78-
return data;
83+
return StageLoader.validate(data);
7984
}
8085

8186
/**

app/src/pages/_app_menu.tsx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,13 @@ import { useTranslation } from "react-i18next";
6565
import { Dialog } from "../components/dialog";
6666
import { Panel } from "../components/panel";
6767
import { Popup } from "../components/popup";
68+
import { Vector } from "../core/dataStruct/Vector";
6869
import { Settings } from "../core/service/Settings";
70+
import { Controller } from "../core/service/controlService/controller/Controller";
6971
import { RecentFileManager } from "../core/service/dataFileService/RecentFileManager";
7072
import { StageSaveManager } from "../core/service/dataFileService/StageSaveManager";
73+
import { FileLoader } from "../core/service/dataFileService/fileLoader";
74+
import { GenerateFromFolderEngine } from "../core/service/dataGenerateService/generateFromFolderEngine/GenerateFromFolderEngine";
7175
import { ComplexityDetector } from "../core/service/dataManageService/ComplexityDetector";
7276
import { CopyEngine } from "../core/service/dataManageService/copyEngine/copyEngine";
7377
import { SoundService } from "../core/service/feedbackService/SoundService";
@@ -80,10 +84,6 @@ import { createFolder, exists } from "../utils/fs";
8084
import { PathString } from "../utils/pathString";
8185
import ComplexityResultPanel from "./_fixed_panel/_complexity_result_panel";
8286
import ExportSvgPanel from "./_popup_panel/_export_svg_panel";
83-
import { FileLoader } from "../core/service/dataFileService/fileLoader";
84-
import { Vector } from "../core/dataStruct/Vector";
85-
import { Controller } from "../core/service/controlService/controller/Controller";
86-
import { GenerateFromFolderEngine } from "../core/service/dataGenerateService/generateFromFolderEngine/GenerateFromFolderEngine";
8787

8888
export default function AppMenu({ className = "", open = false }: { className?: string; open: boolean }) {
8989
const navigate = useNavigate();
@@ -256,22 +256,19 @@ export default function AppMenu({ className = "", open = false }: { className?:
256256
filters: isDesktop
257257
? [
258258
{
259-
name: "Project Graph",
259+
name: "JSON 格式,兼容旧版本",
260260
extensions: ["json"],
261261
},
262+
{
263+
name: "新版 PRG 格式,文件更小",
264+
extensions: ["prg"],
265+
},
262266
]
263267
: [],
264268
});
265269
if (!path) {
266270
return;
267271
}
268-
if (isDesktop && !path.endsWith(".json")) {
269-
Dialog.show({
270-
title: "请选择一个JSON文件",
271-
type: "error",
272-
});
273-
return;
274-
}
275272
try {
276273
await FileLoader.openFileByPath(path); // 已经包含历史记录重置功能
277274
// 更改file
@@ -330,9 +327,13 @@ export default function AppMenu({ className = "", open = false }: { className?:
330327
defaultPath: "新文件.json", // 提供一个默认的文件名
331328
filters: [
332329
{
333-
name: "Project Graph",
330+
name: "JSON 格式,兼容旧版本",
334331
extensions: ["json"],
335332
},
333+
{
334+
name: "新版 PRG 格式,文件更小",
335+
extensions: ["prg"],
336+
},
336337
],
337338
});
338339

pnpm-lock.yaml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)