bizydraft 0.2.49__py3-none-any.whl → 0.2.87__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bizydraft might be problematic. Click here for more details.
- bizydraft/env.py +3 -0
- bizydraft/hijack_nodes.py +60 -42
- bizydraft/hijack_routes.py +36 -3
- bizydraft/oss_utils.py +231 -2
- bizydraft/patch_handlers.py +197 -8
- bizydraft/static/js/aiAppHandler.js +460 -425
- bizydraft/static/js/clipspaceToOss.js +386 -0
- bizydraft/static/js/disableComfyWebSocket.js +64 -0
- bizydraft/static/js/freezeModeHandler.js +425 -404
- bizydraft/static/js/handleStyle.js +128 -36
- bizydraft/static/js/hookLoad/configLoader.js +74 -0
- bizydraft/static/js/hookLoad/media.js +684 -0
- bizydraft/static/js/hookLoad/model.js +322 -0
- bizydraft/static/js/hookLoadMedia.js +196 -0
- bizydraft/static/js/hookLoadModel.js +207 -256
- bizydraft/static/js/main.js +2 -0
- bizydraft/static/js/nodeFocusHandler.js +118 -106
- bizydraft/static/js/nodeParamsFilter.js +91 -89
- bizydraft/static/js/postEvent.js +1207 -967
- bizydraft/static/js/socket.js +55 -50
- bizydraft/static/js/tool.js +71 -63
- bizydraft/static/js/uploadFile.js +49 -41
- bizydraft/static/js/workflow_io.js +193 -0
- {bizydraft-0.2.49.dist-info → bizydraft-0.2.87.dist-info}/METADATA +1 -1
- bizydraft-0.2.87.dist-info/RECORD +34 -0
- bizydraft/static/js/hookLoadImage.js +0 -177
- bizydraft-0.2.49.dist-info/RECORD +0 -28
- {bizydraft-0.2.49.dist-info → bizydraft-0.2.87.dist-info}/WHEEL +0 -0
- {bizydraft-0.2.49.dist-info → bizydraft-0.2.87.dist-info}/top_level.txt +0 -0
|
@@ -17,128 +17,131 @@ let originalRequestAnimationFrame = null; // 保存原始的requestAnimationFram
|
|
|
17
17
|
|
|
18
18
|
// 冻结工作流,添加遮罩层
|
|
19
19
|
function freezeWorkflow(isworkflow = false) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
// 设置冻结状态
|
|
21
|
+
isFrozen = true;
|
|
22
|
+
// 禁用全局快捷键和鼠标事件
|
|
23
|
+
blockGlobalEvents(true);
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
// 创建遮罩层
|
|
26
|
+
createOverlay();
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// 更新高亮节点列表
|
|
29
|
+
updateHighlightedNodes();
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
// 启用鼠标追踪
|
|
32
|
+
enableMouseTracking();
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
// 禁用节点搜索容器
|
|
35
|
+
disableNodeSearch(true);
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
// 显示底部提示
|
|
38
|
+
showBottomTip(isworkflow);
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
// 阻止拖拽上传文件
|
|
41
|
+
blockDragDropEvents(true);
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
// 关闭并禁用最小地图按钮
|
|
44
|
+
setMiniMapButtonDisabled(true, true);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// 解冻工作流,移除遮罩层
|
|
48
48
|
function unfreezeWorkflow() {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
isFrozen = false;
|
|
50
|
+
// 恢复原始的requestAnimationFrame
|
|
51
|
+
if (
|
|
52
|
+
originalRequestAnimationFrame &&
|
|
53
|
+
window.requestAnimationFrame !== originalRequestAnimationFrame
|
|
54
|
+
) {
|
|
55
|
+
window.requestAnimationFrame = originalRequestAnimationFrame;
|
|
56
|
+
originalRequestAnimationFrame = null;
|
|
57
|
+
}
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
// 恢复全局快捷键和鼠标事件
|
|
60
|
+
blockGlobalEvents(false);
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
// 移除遮罩层
|
|
63
|
+
removeOverlay();
|
|
61
64
|
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
// 清空高亮节点列表
|
|
66
|
+
highlightedNodes.clear();
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
|
|
68
|
+
// 禁用鼠标追踪
|
|
69
|
+
disableMouseTracking();
|
|
67
70
|
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
// 恢复节点搜索容器
|
|
72
|
+
disableNodeSearch(false);
|
|
70
73
|
|
|
71
|
-
|
|
72
|
-
|
|
74
|
+
// 隐藏底部提示
|
|
75
|
+
hideBottomTip();
|
|
73
76
|
|
|
74
|
-
|
|
75
|
-
|
|
77
|
+
// 恢复拖拽上传文件
|
|
78
|
+
blockDragDropEvents(false);
|
|
76
79
|
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
// 恢复最小地图按钮可用
|
|
81
|
+
setMiniMapButtonDisabled(false);
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
// 显示提示信息
|
|
82
85
|
function showBottomTip(isworkflow = false) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
86
|
+
// 如果已经存在提示元素,先移除
|
|
87
|
+
if (bottomTipElement) {
|
|
88
|
+
bottomTipElement.remove();
|
|
89
|
+
bottomTipElement = null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 创建提示元素
|
|
93
|
+
bottomTipElement = document.createElement("div");
|
|
94
|
+
bottomTipElement.id = "aiapp-bottom-tip";
|
|
95
|
+
|
|
96
|
+
// 设置样式
|
|
97
|
+
bottomTipElement.style.position = "fixed";
|
|
98
|
+
bottomTipElement.style.left = "64%";
|
|
99
|
+
bottomTipElement.style.top = "89%";
|
|
100
|
+
bottomTipElement.style.transform = "translate(-50%, -50%)";
|
|
101
|
+
bottomTipElement.style.backgroundColor = "white"; // 白色背景
|
|
102
|
+
bottomTipElement.style.color = "black"; // 黑色文字
|
|
103
|
+
bottomTipElement.style.padding = "10px 20px";
|
|
104
|
+
bottomTipElement.style.textAlign = "center";
|
|
105
|
+
bottomTipElement.style.fontSize = "14px";
|
|
106
|
+
bottomTipElement.style.zIndex = "10000";
|
|
107
|
+
bottomTipElement.style.borderRadius = "4px";
|
|
108
|
+
bottomTipElement.style.boxShadow = "0 2px 8px rgba(0, 0, 0, 0.15)";
|
|
109
|
+
bottomTipElement.style.border = "1px solid #e0e0e0";
|
|
110
|
+
|
|
111
|
+
// 根据模式设置不同的提示文本
|
|
112
|
+
if (isworkflow) {
|
|
113
|
+
bottomTipElement.textContent = "发布工作流时不可编辑原工作流";
|
|
114
|
+
} else {
|
|
115
|
+
bottomTipElement.textContent = "编辑AI应用参数时不可编辑原工作流";
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// 添加到DOM
|
|
119
|
+
document.body.appendChild(bottomTipElement);
|
|
117
120
|
}
|
|
118
121
|
|
|
119
122
|
// 隐藏底部提示信息
|
|
120
123
|
function hideBottomTip() {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
124
|
+
if (bottomTipElement) {
|
|
125
|
+
bottomTipElement.remove();
|
|
126
|
+
bottomTipElement = null;
|
|
127
|
+
}
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
// 禁用或启用节点搜索功能
|
|
128
131
|
function disableNodeSearch(disable) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
132
|
+
// 如果已经有样式元素,先移除它
|
|
133
|
+
if (nodeSearchStyleElement) {
|
|
134
|
+
nodeSearchStyleElement.remove();
|
|
135
|
+
nodeSearchStyleElement = null;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (disable) {
|
|
139
|
+
// 创建样式元素
|
|
140
|
+
nodeSearchStyleElement = document.createElement("style");
|
|
141
|
+
nodeSearchStyleElement.id = "aiapp-disable-node-search-style";
|
|
142
|
+
|
|
143
|
+
// 添加CSS规则来禁用节点搜索容器和相关元素
|
|
144
|
+
nodeSearchStyleElement.textContent = `
|
|
142
145
|
/* 禁用节点搜索容器 */
|
|
143
146
|
.comfy-vue-node-search-container,
|
|
144
147
|
.litegraph-dialog,
|
|
@@ -154,394 +157,412 @@ function disableNodeSearch(disable) {
|
|
|
154
157
|
}
|
|
155
158
|
`;
|
|
156
159
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
+
// 添加到文档头部
|
|
161
|
+
document.head.appendChild(nodeSearchStyleElement);
|
|
162
|
+
}
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
// 阻止全局快捷键和鼠标事件
|
|
163
166
|
function blockGlobalEvents(block) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return false;
|
|
215
|
-
// }
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
// 阻止右键菜单
|
|
219
|
-
contextMenuListener = function(e) {
|
|
220
|
-
// 检查鼠标是否在高亮节点附近
|
|
221
|
-
const isNearHighlightedNode = isMouseNearHighlightedNode(e);
|
|
222
|
-
|
|
223
|
-
// 如果不在高亮节点附近,阻止右键菜单
|
|
224
|
-
if (!isNearHighlightedNode) {
|
|
225
|
-
e.preventDefault();
|
|
226
|
-
e.stopPropagation();
|
|
227
|
-
return false;
|
|
228
|
-
}
|
|
167
|
+
if (block && !globalEventBlocked) {
|
|
168
|
+
// 启用拦截
|
|
169
|
+
globalEventBlocked = true;
|
|
170
|
+
|
|
171
|
+
// 阻止键盘快捷键
|
|
172
|
+
keyboardListener = function (e) {
|
|
173
|
+
// 检查是否是需要阻止的按键
|
|
174
|
+
// 阻止: 退格键(8), Delete(46), Ctrl+C(67), Ctrl+V(86), Ctrl+Z(90), Ctrl+Y(89)
|
|
175
|
+
const key = e.keyCode || e.which;
|
|
176
|
+
const isCtrl = e.ctrlKey || e.metaKey;
|
|
177
|
+
|
|
178
|
+
// 检查节点附近的鼠标位置 - 如果在节点附近则不阻止
|
|
179
|
+
// const isNearHighlightedNode = isMouseNearHighlightedNode(e);
|
|
180
|
+
|
|
181
|
+
// if ( (
|
|
182
|
+
// key === 8 || // Backspace
|
|
183
|
+
// key === 46 || // Delete
|
|
184
|
+
// (isCtrl && (
|
|
185
|
+
// key === 67 || // C
|
|
186
|
+
// key === 86 || // V
|
|
187
|
+
// key === 90 || // Z
|
|
188
|
+
// key === 89 // Y
|
|
189
|
+
// ))
|
|
190
|
+
// )) {
|
|
191
|
+
// console.log('阻止键盘快捷键:', e.key, key);
|
|
192
|
+
e.preventDefault();
|
|
193
|
+
e.stopPropagation();
|
|
194
|
+
e.stopImmediatePropagation();
|
|
195
|
+
|
|
196
|
+
// 只在冻结模式下覆盖requestAnimationFrame
|
|
197
|
+
if (isFrozen && !originalRequestAnimationFrame) {
|
|
198
|
+
// 保存原始的 requestAnimationFrame
|
|
199
|
+
originalRequestAnimationFrame = window.requestAnimationFrame;
|
|
200
|
+
|
|
201
|
+
// 覆盖 requestAnimationFrame,过滤掉包含撤销逻辑的回调
|
|
202
|
+
window.requestAnimationFrame = function (callback) {
|
|
203
|
+
// 检查回调函数是否包含撤销相关的逻辑
|
|
204
|
+
const callbackStr = callback.toString();
|
|
205
|
+
if (
|
|
206
|
+
callbackStr.includes("undoRedo") ||
|
|
207
|
+
callbackStr.includes("changeTracker") ||
|
|
208
|
+
callbackStr.includes("checkState")
|
|
209
|
+
) {
|
|
210
|
+
console.log("拦截了包含撤销逻辑的 requestAnimationFrame");
|
|
211
|
+
// 返回一个空函数,不执行撤销逻辑
|
|
212
|
+
return originalRequestAnimationFrame(() => {});
|
|
213
|
+
}
|
|
214
|
+
// 其他回调正常执行
|
|
215
|
+
return originalRequestAnimationFrame(callback);
|
|
229
216
|
};
|
|
217
|
+
}
|
|
230
218
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
// 保存并替换LiteGraph的双击相关方法
|
|
236
|
-
if (window.LGraphCanvas) {
|
|
237
|
-
// 保存原始方法
|
|
238
|
-
originalMethods = {
|
|
239
|
-
showNodePanel: LGraphCanvas.prototype.showNodePanel,
|
|
240
|
-
processNodeDblClicked: LGraphCanvas.prototype.processNodeDblClicked,
|
|
241
|
-
processContextMenu: LGraphCanvas.prototype.processContextMenu
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
// 禁用节点面板(双击弹出的)
|
|
245
|
-
LGraphCanvas.prototype.showNodePanel = function() {
|
|
246
|
-
return false;
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
// 禁用节点双击
|
|
250
|
-
LGraphCanvas.prototype.processNodeDblClicked = function() {
|
|
251
|
-
return false;
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
// 禁用右键菜单
|
|
255
|
-
LGraphCanvas.prototype.processContextMenu = function(node, event) {
|
|
256
|
-
// 检查是否在高亮节点附近
|
|
257
|
-
if (node && highlightedNodes.has(node.id)) {
|
|
258
|
-
// 在高亮节点上,允许菜单
|
|
259
|
-
if (originalMethods.processContextMenu) {
|
|
260
|
-
return originalMethods.processContextMenu.call(this, node, event);
|
|
261
|
-
}
|
|
262
|
-
} else {
|
|
263
|
-
// 检查鼠标是否在节点附近(即使不是该节点本身)
|
|
264
|
-
if (event && isMouseNearHighlightedNode(event)) {
|
|
265
|
-
return false; // 在节点附近但不允许菜单
|
|
266
|
-
}
|
|
267
|
-
return false;
|
|
268
|
-
}
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
} else if (!block && globalEventBlocked) {
|
|
273
|
-
// 禁用拦截
|
|
274
|
-
globalEventBlocked = false;
|
|
219
|
+
return false;
|
|
220
|
+
// }
|
|
221
|
+
};
|
|
275
222
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
223
|
+
// 阻止右键菜单
|
|
224
|
+
contextMenuListener = function (e) {
|
|
225
|
+
// 检查鼠标是否在高亮节点附近
|
|
226
|
+
const isNearHighlightedNode = isMouseNearHighlightedNode(e);
|
|
279
227
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
228
|
+
// 如果不在高亮节点附近,阻止右键菜单
|
|
229
|
+
if (!isNearHighlightedNode) {
|
|
230
|
+
e.preventDefault();
|
|
231
|
+
e.stopPropagation();
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
// 添加事件监听器
|
|
237
|
+
document.addEventListener("keydown", keyboardListener, true);
|
|
238
|
+
document.addEventListener("contextmenu", contextMenuListener, true);
|
|
239
|
+
|
|
240
|
+
// 保存并替换LiteGraph的双击相关方法
|
|
241
|
+
if (window.LGraphCanvas) {
|
|
242
|
+
// 保存原始方法
|
|
243
|
+
originalMethods = {
|
|
244
|
+
showNodePanel: LGraphCanvas.prototype.showNodePanel,
|
|
245
|
+
processNodeDblClicked: LGraphCanvas.prototype.processNodeDblClicked,
|
|
246
|
+
processContextMenu: LGraphCanvas.prototype.processContextMenu,
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
// 禁用节点面板(双击弹出的)
|
|
250
|
+
LGraphCanvas.prototype.showNodePanel = function () {
|
|
251
|
+
return false;
|
|
252
|
+
};
|
|
289
253
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
254
|
+
// 禁用节点双击
|
|
255
|
+
LGraphCanvas.prototype.processNodeDblClicked = function () {
|
|
256
|
+
return false;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
// 禁用右键菜单
|
|
260
|
+
LGraphCanvas.prototype.processContextMenu = function (node, event) {
|
|
261
|
+
// 检查是否在高亮节点附近
|
|
262
|
+
if (node && highlightedNodes.has(node.id)) {
|
|
263
|
+
// 在高亮节点上,允许菜单
|
|
264
|
+
if (originalMethods.processContextMenu) {
|
|
265
|
+
return originalMethods.processContextMenu.call(this, node, event);
|
|
266
|
+
}
|
|
267
|
+
} else {
|
|
268
|
+
// 检查鼠标是否在节点附近(即使不是该节点本身)
|
|
269
|
+
if (event && isMouseNearHighlightedNode(event)) {
|
|
270
|
+
return false; // 在节点附近但不允许菜单
|
|
271
|
+
}
|
|
272
|
+
return false;
|
|
293
273
|
}
|
|
294
|
-
|
|
295
|
-
originalMethods = null;
|
|
296
|
-
keyboardListener = null;
|
|
297
|
-
contextMenuListener = null;
|
|
274
|
+
};
|
|
298
275
|
}
|
|
276
|
+
} else if (!block && globalEventBlocked) {
|
|
277
|
+
// 禁用拦截
|
|
278
|
+
globalEventBlocked = false;
|
|
279
|
+
|
|
280
|
+
// 移除事件监听器
|
|
281
|
+
document.removeEventListener("keydown", keyboardListener, true);
|
|
282
|
+
document.removeEventListener("contextmenu", contextMenuListener, true);
|
|
283
|
+
|
|
284
|
+
// 恢复LiteGraph的方法
|
|
285
|
+
if (window.LGraphCanvas && originalMethods) {
|
|
286
|
+
if (originalMethods.showNodePanel) {
|
|
287
|
+
LGraphCanvas.prototype.showNodePanel = originalMethods.showNodePanel;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (originalMethods.processNodeDblClicked) {
|
|
291
|
+
LGraphCanvas.prototype.processNodeDblClicked =
|
|
292
|
+
originalMethods.processNodeDblClicked;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (originalMethods.processContextMenu) {
|
|
296
|
+
LGraphCanvas.prototype.processContextMenu =
|
|
297
|
+
originalMethods.processContextMenu;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
originalMethods = null;
|
|
302
|
+
keyboardListener = null;
|
|
303
|
+
contextMenuListener = null;
|
|
304
|
+
}
|
|
299
305
|
}
|
|
300
306
|
|
|
301
307
|
// 检查鼠标是否在高亮节点附近(包括扩展范围)
|
|
302
308
|
function isMouseNearHighlightedNode(e) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
309
|
+
if (!app || !app.graph) return false;
|
|
310
|
+
|
|
311
|
+
// 转换为图形坐标
|
|
312
|
+
const pos = app.canvas.convertEventToCanvasOffset(e);
|
|
313
|
+
|
|
314
|
+
// 检查所有高亮节点
|
|
315
|
+
for (const node of app.graph._nodes) {
|
|
316
|
+
if (node && node._aiAppHighlighted) {
|
|
317
|
+
// 使用正确的属性名:_pos 和 _posSize
|
|
318
|
+
const nodeX = node._pos[0];
|
|
319
|
+
const nodeY = node._pos[1];
|
|
320
|
+
const nodeWidth = node._posSize[2];
|
|
321
|
+
const nodeHeight = node._posSize[3];
|
|
322
|
+
|
|
323
|
+
const nodeBounds = {
|
|
324
|
+
left: nodeX - 10,
|
|
325
|
+
top: nodeY - 50,
|
|
326
|
+
right: nodeX + nodeWidth + 2,
|
|
327
|
+
bottom: nodeY + nodeHeight + 2,
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
// 检查鼠标是否在扩展边界内
|
|
331
|
+
if (
|
|
332
|
+
pos[0] >= nodeBounds.left &&
|
|
333
|
+
pos[0] <= nodeBounds.right &&
|
|
334
|
+
pos[1] >= nodeBounds.top &&
|
|
335
|
+
pos[1] <= nodeBounds.bottom
|
|
336
|
+
) {
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
330
339
|
}
|
|
340
|
+
}
|
|
331
341
|
|
|
332
|
-
|
|
342
|
+
return false;
|
|
333
343
|
}
|
|
334
344
|
|
|
335
345
|
// 创建遮罩层
|
|
336
346
|
function createOverlay() {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
347
|
+
// 如果已存在,先移除
|
|
348
|
+
removeOverlay();
|
|
349
|
+
|
|
350
|
+
// 创建新的遮罩层
|
|
351
|
+
freezeOverlay = document.createElement("div");
|
|
352
|
+
freezeOverlay.id = "aiapp-freeze-overlay";
|
|
353
|
+
|
|
354
|
+
// 设置样式
|
|
355
|
+
freezeOverlay.style.position = "absolute";
|
|
356
|
+
freezeOverlay.style.top = "0";
|
|
357
|
+
freezeOverlay.style.left = "0";
|
|
358
|
+
freezeOverlay.style.width = "100%";
|
|
359
|
+
freezeOverlay.style.height = "100%";
|
|
360
|
+
freezeOverlay.style.backgroundColor = "transparent";
|
|
361
|
+
freezeOverlay.style.zIndex = "9999";
|
|
362
|
+
freezeOverlay.style.pointerEvents = "none"; // 默认不拦截事件,让画布可移动
|
|
363
|
+
freezeOverlay.style.cursor = "move"; // 默认指示可拖动
|
|
364
|
+
|
|
365
|
+
// 添加事件监听
|
|
366
|
+
freezeOverlay.addEventListener("mousedown", handleOverlayMouseDown);
|
|
367
|
+
|
|
368
|
+
// 添加到DOM
|
|
369
|
+
const container =
|
|
370
|
+
document.querySelector("#graph-canvas")?.parentElement || document.body;
|
|
371
|
+
container.appendChild(freezeOverlay);
|
|
361
372
|
}
|
|
362
373
|
|
|
363
374
|
// 移除遮罩层
|
|
364
375
|
function removeOverlay() {
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
376
|
+
if (freezeOverlay) {
|
|
377
|
+
freezeOverlay.removeEventListener("mousedown", handleOverlayMouseDown);
|
|
378
|
+
freezeOverlay.remove();
|
|
379
|
+
freezeOverlay = null;
|
|
380
|
+
}
|
|
370
381
|
}
|
|
371
382
|
|
|
372
383
|
// 启用鼠标追踪
|
|
373
384
|
function enableMouseTracking() {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
385
|
+
if (!mouseTrackingEnabled) {
|
|
386
|
+
mouseMoveListener = handleMouseMove.bind(this);
|
|
387
|
+
document.addEventListener("mousemove", mouseMoveListener);
|
|
388
|
+
mouseTrackingEnabled = true;
|
|
389
|
+
}
|
|
379
390
|
}
|
|
380
391
|
|
|
381
392
|
// 禁用鼠标追踪
|
|
382
393
|
function disableMouseTracking() {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
394
|
+
if (mouseTrackingEnabled) {
|
|
395
|
+
document.removeEventListener("mousemove", mouseMoveListener);
|
|
396
|
+
mouseMoveListener = null;
|
|
397
|
+
mouseTrackingEnabled = false;
|
|
398
|
+
}
|
|
388
399
|
}
|
|
389
400
|
|
|
390
401
|
// 处理鼠标移动事件
|
|
391
402
|
function handleMouseMove(e) {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
if (isNearHighlightedNode) {
|
|
424
|
-
// 鼠标在高亮节点附近,打开遮罩层
|
|
425
|
-
showOverlay();
|
|
426
|
-
} else {
|
|
427
|
-
// 鼠标在空白区域,隐藏遮罩层
|
|
428
|
-
hideOverlay();
|
|
403
|
+
if (!freezeOverlay || !app || !app.graph) return;
|
|
404
|
+
|
|
405
|
+
// 转换为图形坐标
|
|
406
|
+
const pos = app.canvas.convertEventToCanvasOffset(e);
|
|
407
|
+
|
|
408
|
+
// 检查鼠标是否在高亮节点附近
|
|
409
|
+
let isNearHighlightedNode = false;
|
|
410
|
+
for (const node of app.graph._nodes) {
|
|
411
|
+
if (node && node._aiAppHighlighted) {
|
|
412
|
+
// 使用正确的属性名:_pos 和 _posSize
|
|
413
|
+
const nodeX = node._pos[0];
|
|
414
|
+
const nodeY = node._pos[1];
|
|
415
|
+
const nodeWidth = node._posSize[2];
|
|
416
|
+
const nodeHeight = node._posSize[3];
|
|
417
|
+
|
|
418
|
+
const nodeBounds = {
|
|
419
|
+
left: nodeX - 10,
|
|
420
|
+
top: nodeY - 50,
|
|
421
|
+
right: nodeX + nodeWidth + 2,
|
|
422
|
+
bottom: nodeY + nodeHeight + 2,
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
if (
|
|
426
|
+
pos[0] >= nodeBounds.left &&
|
|
427
|
+
pos[0] <= nodeBounds.right &&
|
|
428
|
+
pos[1] >= nodeBounds.top &&
|
|
429
|
+
pos[1] <= nodeBounds.bottom
|
|
430
|
+
) {
|
|
431
|
+
isNearHighlightedNode = true;
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
429
434
|
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// 根据鼠标位置控制遮罩层
|
|
438
|
+
if (isNearHighlightedNode) {
|
|
439
|
+
// 鼠标在高亮节点附近,打开遮罩层
|
|
440
|
+
showOverlay();
|
|
441
|
+
} else {
|
|
442
|
+
// 鼠标在空白区域,隐藏遮罩层
|
|
443
|
+
hideOverlay();
|
|
444
|
+
}
|
|
430
445
|
}
|
|
431
446
|
|
|
432
447
|
// 显示遮罩层
|
|
433
448
|
function showOverlay() {
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
449
|
+
if (freezeOverlay) {
|
|
450
|
+
freezeOverlay.style.pointerEvents = "all";
|
|
451
|
+
freezeOverlay.style.cursor = "pointer";
|
|
452
|
+
}
|
|
438
453
|
}
|
|
439
454
|
|
|
440
455
|
// 隐藏遮罩层
|
|
441
456
|
function hideOverlay() {
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
457
|
+
if (freezeOverlay) {
|
|
458
|
+
freezeOverlay.style.pointerEvents = "none";
|
|
459
|
+
}
|
|
445
460
|
}
|
|
446
461
|
|
|
447
462
|
// 更新高亮节点列表
|
|
448
463
|
function updateHighlightedNodes() {
|
|
449
|
-
|
|
464
|
+
highlightedNodes.clear();
|
|
450
465
|
|
|
451
|
-
|
|
466
|
+
if (!app || !app.graph || !app.graph._nodes) return;
|
|
452
467
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
}
|
|
468
|
+
for (const node of app.graph._nodes) {
|
|
469
|
+
if (node && node._aiAppHighlighted) {
|
|
470
|
+
highlightedNodes.add(node.id);
|
|
457
471
|
}
|
|
472
|
+
}
|
|
458
473
|
}
|
|
459
474
|
//关闭并禁用小地图按钮
|
|
460
475
|
function setMiniMapButtonDisabled(disabled, clickIfActive = false) {
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
miniMapBtn.disabled = false;
|
|
476
|
+
const miniMapBtn = document.querySelector(
|
|
477
|
+
'button[data-testid="toggle-minimap-button"]'
|
|
478
|
+
);
|
|
479
|
+
if (!miniMapBtn) return;
|
|
480
|
+
|
|
481
|
+
if (disabled) {
|
|
482
|
+
const isActive =
|
|
483
|
+
miniMapBtn.classList.contains("minimap-active") ||
|
|
484
|
+
miniMapBtn.hasAttribute("minimap-active") ||
|
|
485
|
+
miniMapBtn.getAttribute("aria-pressed") === "true";
|
|
486
|
+
if (clickIfActive && isActive) {
|
|
487
|
+
miniMapBtn.click();
|
|
474
488
|
}
|
|
489
|
+
miniMapBtn.disabled = true;
|
|
490
|
+
} else {
|
|
491
|
+
miniMapBtn.disabled = false;
|
|
492
|
+
}
|
|
475
493
|
}
|
|
476
494
|
|
|
477
495
|
// 处理遮罩层上的鼠标按下事件
|
|
478
496
|
function handleOverlayMouseDown(e) {
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
e.preventDefault();
|
|
498
|
-
e.stopPropagation();
|
|
499
|
-
return false;
|
|
497
|
+
// 检查是否点击了高亮节点附近
|
|
498
|
+
const isNearHighlightedNode = isMouseNearHighlightedNode(e);
|
|
499
|
+
|
|
500
|
+
if (isNearHighlightedNode) {
|
|
501
|
+
// 获取实际点击的节点(用于发送消息)
|
|
502
|
+
const nodeUnderMouse = getNodeUnderMouse(e);
|
|
503
|
+
|
|
504
|
+
if (nodeUnderMouse) {
|
|
505
|
+
// 发送消息到前端,通知节点被点击
|
|
506
|
+
window.parent.postMessage(
|
|
507
|
+
{
|
|
508
|
+
type: "CANVAS_NODE_CLICKED",
|
|
509
|
+
nodeId: nodeUnderMouse.id,
|
|
510
|
+
nodeTitle: nodeUnderMouse.title,
|
|
511
|
+
nodeType: nodeUnderMouse.type,
|
|
512
|
+
},
|
|
513
|
+
"*"
|
|
514
|
+
);
|
|
500
515
|
}
|
|
501
516
|
|
|
502
|
-
//
|
|
503
|
-
|
|
517
|
+
// 阻止事件冒泡,避免触发其他处理
|
|
518
|
+
e.preventDefault();
|
|
519
|
+
e.stopPropagation();
|
|
520
|
+
return false;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// 让事件传递给画布 - 允许画布正常处理点击事件
|
|
524
|
+
return true;
|
|
504
525
|
}
|
|
505
526
|
|
|
506
527
|
// 获取鼠标下方的节点
|
|
507
528
|
function getNodeUnderMouse(e) {
|
|
508
|
-
|
|
529
|
+
if (!app || !app.graph) return null;
|
|
509
530
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
531
|
+
// 获取画布位置
|
|
532
|
+
const canvas = document.querySelector("canvas");
|
|
533
|
+
if (!canvas) return null;
|
|
513
534
|
|
|
514
|
-
|
|
515
|
-
|
|
535
|
+
// 转换为图形坐标
|
|
536
|
+
const pos = app.canvas.convertEventToCanvasOffset(e);
|
|
516
537
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
538
|
+
// 检查点击位置是否在某个节点上
|
|
539
|
+
const node = app.graph.getNodeOnPos(pos[0], pos[1]);
|
|
540
|
+
return node;
|
|
520
541
|
}
|
|
521
542
|
|
|
522
543
|
// 阻止拖拽上传文件
|
|
523
544
|
function blockDragDropEvents(enable) {
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
545
|
+
if (enable) {
|
|
546
|
+
if (dragDropBlocker) return; // 已经阻止过了
|
|
547
|
+
dragDropBlocker = function (e) {
|
|
548
|
+
e.preventDefault();
|
|
549
|
+
e.stopPropagation();
|
|
550
|
+
return false;
|
|
551
|
+
};
|
|
552
|
+
document.addEventListener("dragover", dragDropBlocker, true);
|
|
553
|
+
document.addEventListener("drop", dragDropBlocker, true);
|
|
554
|
+
} else {
|
|
555
|
+
if (!dragDropBlocker) return;
|
|
556
|
+
document.removeEventListener("dragover", dragDropBlocker, true);
|
|
557
|
+
document.removeEventListener("drop", dragDropBlocker, true);
|
|
558
|
+
dragDropBlocker = null;
|
|
559
|
+
}
|
|
539
560
|
}
|
|
540
561
|
|
|
541
562
|
export {
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
563
|
+
freezeWorkflow,
|
|
564
|
+
unfreezeWorkflow,
|
|
565
|
+
isMouseNearHighlightedNode,
|
|
566
|
+
getNodeUnderMouse,
|
|
567
|
+
updateHighlightedNodes,
|
|
547
568
|
};
|