Skip to content

Commit b0e7e76

Browse files
author
王一帆
committed
支持添加引用的文档到canvas
1 parent a3984dd commit b0e7e76

File tree

1 file changed

+85
-26
lines changed

1 file changed

+85
-26
lines changed

src/modal/add-to-canvas-confirm-modal.ts

Lines changed: 85 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const between = 40;
1010
export class AddToCanvasConfirmModal extends Modal {
1111
targetFilePath: string;
1212
resultArr: TAbstractFile[];
13+
includeReslovedLinksFlag: boolean;
1314

1415
constructor(app: App, resultArr: TAbstractFile[], targetFilePath: string) {
1516
super(app);
@@ -27,12 +28,23 @@ export class AddToCanvasConfirmModal extends Modal {
2728
contentEl.createEl("div", { text: info.path });
2829
})
2930

31+
new Setting(contentEl)
32+
.addToggle((toggle) => {
33+
toggle.setTooltip("Include resolved links!");
34+
toggle.onChange((val) => {
35+
this.includeReslovedLinksFlag = val;
36+
})
37+
})
38+
3039
new Setting(contentEl)
3140
.addButton((btn) =>
3241
btn.setButtonText("Confirm")
3342
.setCta()
3443
.onClick(async () => {
3544
this.close();
45+
46+
let pathNodeMap = new Map();
47+
3648
let activeFile = this.app.workspace.getActiveFile();
3749

3850
// 如果当前活动文档与目标文档不同,则尝试打开目标文档
@@ -55,38 +67,35 @@ export class AddToCanvasConfirmModal extends Modal {
5567
let idx = 0;
5668
for (const key in this.resultArr) {
5769
let file = this.resultArr[key] as TFile;
58-
let tempChildNode;
59-
if (!requireApiVersion("1.1.10")) {
60-
tempChildNode = canvas.createFileNode(file, "", { x: between + ((width + between) * idx), y: between, height: height, width: width }, true);
61-
} else {
62-
tempChildNode = canvas.createFileNode({
63-
file: file,
64-
pos: {
65-
x: between + ((width + between) * idx),
66-
y: between,
67-
width: width,
68-
height: height
69-
},
70-
size: {
71-
x: between,
72-
y: between,
73-
width: width,
74-
height: height
75-
},
76-
save: true,
77-
focus: false,
78-
});
79-
}
80-
canvas.deselectAll();
81-
canvas.addNode(tempChildNode);
70+
let tempChildNode = this.createFileNode(canvas, file, idx);
8271
idx++;
83-
}
8472

73+
if (this.includeReslovedLinksFlag) {
74+
// 同时添加内页
75+
pathNodeMap.set(file.path, tempChildNode);
76+
77+
let linkObj = this.app.metadataCache.resolvedLinks[file.path];
78+
for (let innerFilePath in linkObj) {
79+
let existFileNode = pathNodeMap.get(innerFilePath);
80+
if (existFileNode) {
81+
this.createEdge(tempChildNode, existFileNode, canvas);
82+
} else {
83+
console.log(innerFilePath);
84+
let resolvedFile = this.app.vault.getAbstractFileByPath(innerFilePath) as TFile;
85+
console.log(resolvedFile);
86+
let innerChildNode = this.createFileNode(canvas, resolvedFile, idx);
87+
idx++;
88+
pathNodeMap.set(innerFilePath, innerChildNode);
89+
this.createEdge(tempChildNode, innerChildNode, canvas);
90+
}
91+
}
92+
}
93+
}
8594
canvas.requestSave();
8695

8796
new Notice("Add to Canvas Success!");
8897
} else {
89-
new Notice(targetFile.name + " is not a Canvas!");
98+
new Notice(this.targetFilePath + " is not a Canvas!");
9099
}
91100
}))
92101
.addButton((btn) =>
@@ -98,4 +107,54 @@ export class AddToCanvasConfirmModal extends Modal {
98107
new Notice("Add to Canvas Canceled!");
99108
}));
100109
}
110+
111+
private createFileNode(canvas: any, file: TFile, idx: number) {
112+
let tempChildNode;
113+
if (!requireApiVersion("1.1.10")) {
114+
tempChildNode = canvas.createFileNode(file, "", { x: between + ((width + between) * idx), y: between, height: height, width: width }, true);
115+
} else {
116+
tempChildNode = canvas.createFileNode({
117+
file: file,
118+
pos: {
119+
x: between + ((width + between) * idx),
120+
y: between,
121+
width: width,
122+
height: height
123+
},
124+
size: {
125+
x: between,
126+
y: between,
127+
width: width,
128+
height: height
129+
},
130+
save: true,
131+
focus: false,
132+
});
133+
}
134+
canvas.deselectAll();
135+
canvas.addNode(tempChildNode);
136+
return tempChildNode;
137+
}
138+
139+
random(e: number) {
140+
let t = [];
141+
for (let n = 0; n < e; n++) {
142+
t.push((16 * Math.random() | 0).toString(16));
143+
}
144+
return t.join("")
145+
}
146+
147+
createEdge(node1: any, node2: any, canvas: any) {
148+
149+
const edge = canvas.edges.get(canvas.getData().edges.first()?.id);
150+
151+
if (edge) {
152+
const tempEdge = new edge.constructor(canvas, this.random(16), { side: "right", node: node1 }, { side: "left", node: node2 })
153+
canvas.addEdge(tempEdge);
154+
tempEdge.attach();
155+
tempEdge.render();
156+
} else {
157+
console.log("You should have at least one edge in the canvas to use this feature!");
158+
}
159+
}
101160
}

0 commit comments

Comments
 (0)