Skip to content

Commit 8c52bbd

Browse files
Fixed bug where popup menu items dont show up when new canvas got created
1 parent 819e59d commit 8c52bbd

File tree

7 files changed

+52
-49
lines changed

7 files changed

+52
-49
lines changed

src/@types/Canvas.d.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ export interface Canvas {
44
view: CanvasView
55
config: CanvasConfig
66

7-
data: CanvasData
87
getData(): CanvasData
98

109
nodes: Map<string, CanvasNode>
@@ -28,7 +27,7 @@ export interface Canvas {
2827
setReadonly(readonly: boolean): void
2928

3029
selection: Set<CanvasNode>
31-
getSelectionData(): { nodes: CanvasNodeData[], edges: CanvasEdgeData[], center: Position }
30+
getSelectionData(): SelectionData
3231
deselectAll(): void
3332

3433
getEdgesForNode(node: CanvasNode): CanvasEdge[]
@@ -58,7 +57,13 @@ export interface Canvas {
5857
lockedX: number
5958
lockedY: number
6059
lockedZoom: number
61-
setNodeUnknownData(node: CanvasNode, key: keyof CanvasNodeUnknownData, value: any): void
60+
setNodeData(node: CanvasNode, key: keyof CanvasNodeData, value: any): void
61+
}
62+
63+
export interface SelectionData {
64+
nodes: CanvasNodeData[]
65+
edges: CanvasEdgeData[]
66+
center: Position
6267
}
6368

6469
export interface CanvasConfig {
@@ -113,7 +118,13 @@ export interface CanvasData {
113118
edges: CanvasEdge[]
114119
}
115120

116-
export interface CanvasNodeData extends CanvasNodeUnknownData {}
121+
export interface CanvasNodeData {
122+
type: CanvasNodeType
123+
shape: string
124+
isStartNode: boolean
125+
126+
[key: string]: any
127+
}
117128

118129
export interface CanvasNode {
119130
canvas: Canvas
@@ -122,15 +133,11 @@ export interface CanvasNode {
122133
getBBox(): BBox
123134
text?: string
124135
color: string
125-
unknownData: CanvasNodeUnknownData
136+
setData(data: CanvasNodeData): void
137+
getData(): CanvasNodeData
126138
}
127139

128140
export interface CanvasNodeUnknownData {
129-
type: CanvasNodeType
130-
shape: string
131-
isStartNode: boolean
132-
133-
[key: string]: any
134141
}
135142

136143
export type CanvasNodeType = 'text' | 'group' | 'file'

src/canvas-extensions/commands-canvas-extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export default class CommandsCanvasExtension {
9898
})
9999

100100
clonedNode.color = sourceNode.color
101-
canvas.setNodeUnknownData(clonedNode, 'shape', sourceNodeData.shape)
101+
canvas.setNodeData(clonedNode, 'shape', sourceNodeData.shape)
102102

103103
if (this.plugin.settingsManager.getSetting('zoomToClonedNode'))
104104
canvas.zoomToBbox(clonedNode.getBBox())

src/canvas-extensions/interaction-tagger-canvas-extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ export default class InteractionTaggerCanvasExtension {
1919
if (!interactionEl) return
2020

2121
for (const dataKey of EXPOSED_DATA) {
22-
const datasetKey = TARGET_NODE_DATASET_PREFIX + dataKey.charAt(0).toUpperCase() + dataKey.slice(1)
22+
const datasetKey = TARGET_NODE_DATASET_PREFIX + dataKey.toString().charAt(0).toUpperCase() + dataKey.toString().slice(1)
2323

24-
const dataValue = node?.unknownData[dataKey]
24+
const dataValue = node?.getData()[dataKey]
2525
if (dataValue) interactionEl.dataset[datasetKey] = dataValue
2626
}
2727
}

src/canvas-extensions/node-data-tagger-canvas-extension.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { Canvas, CanvasNode } from "src/@types/Canvas"
1+
import { Canvas, CanvasNode, CanvasNodeData } from "src/@types/Canvas"
22
import { CanvasEvent } from "src/events/events"
33
import AdvancedCanvasPlugin from "src/main"
44

5-
export const EXPOSED_DATA = ["type", "isStartNode", "shape"]
5+
export const EXPOSED_DATA = ['type', 'isStartNode', 'shape'] as (keyof CanvasNodeData)[]
66

77
export default class NodeDataTaggerCanvasExtension {
88
plugin: AdvancedCanvasPlugin
@@ -14,7 +14,7 @@ export default class NodeDataTaggerCanvasExtension {
1414
CanvasEvent.NodesChanged,
1515
(_canvas: Canvas, nodes: CanvasNode[]) => {
1616
for (const node of nodes) {
17-
const nodeData = node?.unknownData
17+
const nodeData = node?.getData()
1818
if (!nodeData) continue
1919

2020
for (const dataKey of EXPOSED_DATA) {

src/canvas-extensions/presentation-canvas-extension.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export default class PresentationCanvasExtension {
102102

103103
private getStartNode(canvas: Canvas): CanvasNode|undefined {
104104
for (const [_, node] of canvas.nodes) {
105-
if (node.unknownData.isStartNode) return node
105+
if (node.getData().isStartNode) return node
106106
}
107107

108108
return undefined
@@ -112,9 +112,9 @@ export default class PresentationCanvasExtension {
112112
if (!node) return
113113

114114
const startNode = this.getStartNode(canvas)
115-
if (startNode) canvas.setNodeUnknownData(startNode, 'isStartNode', false)
115+
if (startNode) canvas.setNodeData(startNode, 'isStartNode', false)
116116

117-
canvas.setNodeUnknownData(node, 'isStartNode', true)
117+
canvas.setNodeData(node, 'isStartNode', true)
118118
}
119119

120120
private getSlideSize(): Size {
@@ -136,7 +136,7 @@ export default class PresentationCanvasExtension {
136136
focus: false,
137137
})
138138

139-
if (isStartNode) canvas.setNodeUnknownData(groupNode, 'isStartNode', true)
139+
if (isStartNode) canvas.setNodeData(groupNode, 'isStartNode', true)
140140
}
141141

142142
private async animateNodeTransition(canvas: Canvas, fromNode: CanvasNode|undefined, toNode: CanvasNode) {

src/canvas-extensions/shapes-canvas-extension.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,17 +141,17 @@ export default class ShapesCanvasExtension {
141141
if (!selection) return false
142142

143143
for (const node of selection) {
144-
if (node.unknownData.type === 'text') return true
144+
if (node.getData().type === 'text') return true
145145
}
146146

147147
return false
148148
}
149149

150150
private setShapeForSelection(canvas: Canvas, shape: Shape) {
151151
for (const node of canvas.selection) {
152-
if (node.unknownData.type !== 'text') continue
152+
if (node.getData().type !== 'text') continue
153153

154-
canvas.setNodeUnknownData(node, 'shape', shape.id)
154+
canvas.setNodeData(node, 'shape', shape.id)
155155
}
156156
}
157157
}

src/events/canvas-event-emitter.ts

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import AdvancedCanvasPlugin from "src/main"
2-
import { BBox, CanvasNode } from "src/@types/Canvas"
2+
import { BBox, CanvasNode, SelectionData } from "src/@types/Canvas"
33
import { patchWorkspaceFunction } from "src/utils/patch-helper"
44
import { CanvasEvent } from "./events"
55

@@ -13,19 +13,14 @@ export default class CanvasEventEmitter {
1313
// Patch canvas
1414
patchWorkspaceFunction(this.plugin, () => this.plugin.getCurrentCanvas(), {
1515
// Add custom function
16-
setNodeUnknownData: (_next: any) => function (node: CanvasNode, key: string, value: any) {
17-
node.unknownData[key] = value
18-
this.requestSave()
19-
16+
setNodeData: (_next: any) => function (node: CanvasNode, key: string, value: any) {
17+
node.setData({
18+
...node.getData(),
19+
[key]: value
20+
})
21+
2022
that.triggerWorkspaceEvent(CanvasEvent.NodesChanged, this, [node])
2123
},
22-
// Listen to canvas change
23-
importData: (next: any) => function (...args: any) {
24-
const result = next.call(this, ...args)
25-
that.triggerWorkspaceEvent(CanvasEvent.CanvasChanged, this)
26-
that.triggerWorkspaceEvent(CanvasEvent.NodesChanged, this, [...this.nodes.values()])
27-
return result
28-
},
2924
markViewportChanged: (next: any) => function (...args: any) {
3025
that.triggerWorkspaceEvent(CanvasEvent.ViewportChanged.Before, this)
3126
const result = next.call(this, ...args)
@@ -48,9 +43,9 @@ export default class CanvasEventEmitter {
4843
that.triggerWorkspaceEvent(CanvasEvent.NodesChanged, this, [...this.nodes.values()])
4944
return result
5045
},
51-
addNode: (next: any) => function (node: CanvasNode) {
52-
const result = next.call(this, node)
53-
that.triggerWorkspaceEvent(CanvasEvent.NodesChanged, this, [node])
46+
handlePaste: (next: any) => function (...args: any) {
47+
const result = next.call(this, ...args)
48+
that.triggerWorkspaceEvent(CanvasEvent.NodesChanged, this, [...this.nodes.values()])
5449
return result
5550
},
5651
setReadonly: (next: any) => function (readonly: boolean) {
@@ -62,13 +57,15 @@ export default class CanvasEventEmitter {
6257

6358
// Patch canvas popup menu
6459
patchWorkspaceFunction(this.plugin, () => this.plugin.getCurrentCanvas()?.menu, {
65-
render: (next: any) => function (...args: any) {
66-
const result = next.call(this, ...args)
60+
render: (next: any) => function (visible: boolean) {
61+
const result = next.call(this, visible)
6762

68-
that.triggerWorkspaceEvent(CanvasEvent.PopupMenuCreated, this.canvas)
63+
if (visible) {
64+
that.triggerWorkspaceEvent(CanvasEvent.PopupMenuCreated, this.canvas)
6965

70-
// Re-Center the popup menu
71-
next.call(this)
66+
// Re-Center the popup menu
67+
next.call(this, false)
68+
}
7269

7370
return result
7471
}
@@ -85,25 +82,24 @@ export default class CanvasEventEmitter {
8582
}
8683
})
8784

88-
// Update current canvas on startup
89-
const startupListener = this.plugin.app.workspace.on('active-leaf-change', () => {
85+
// Listen to canvas changes
86+
const onCanvasChangeListener = this.plugin.app.workspace.on('active-leaf-change', () => {
9087
const canvas = this.plugin.getCurrentCanvas()
9188
if (!canvas) return
9289

9390
this.triggerWorkspaceEvent(CanvasEvent.CanvasChanged, canvas)
9491
this.triggerWorkspaceEvent(CanvasEvent.ViewportChanged.After, canvas)
9592
this.triggerWorkspaceEvent(CanvasEvent.ReadonlyChanged, canvas, canvas.readonly)
9693
this.triggerWorkspaceEvent(CanvasEvent.NodesChanged, canvas, [...canvas.nodes.values()])
97-
98-
this.plugin.app.workspace.offref(startupListener)
9994
})
100-
this.plugin.registerEvent(startupListener)
95+
this.plugin.registerEvent(onCanvasChangeListener)
10196

10297
// Trigger instantly (Plugin reload)
103-
startupListener.fn.call(this.plugin.app.workspace)
98+
onCanvasChangeListener.fn.call(this.plugin.app.workspace)
10499
}
105100

106101
private triggerWorkspaceEvent(event: string, ...args: any) {
102+
if (event === CanvasEvent.CanvasChanged) console.log('Canvas changed')
107103
this.plugin.app.workspace.trigger(event, ...args)
108104
}
109105
}

0 commit comments

Comments
 (0)