Dragging models onto node inputs now works when unambiguous.

This commit is contained in:
Christian Bastian
2024-04-02 03:14:13 -04:00
parent 748e9ab3e6
commit 549554fc64

View File

@@ -1302,7 +1302,7 @@ class ModelGrid {
* @returns {int} * @returns {int}
*/ */
static modelWidgetIndex(nodeType) { static modelWidgetIndex(nodeType) {
return 0; return nodeType === undefined ? -1 : 0;
} }
/** /**
@@ -1396,7 +1396,7 @@ class ModelGrid {
const nodeType = modelNodeType[modelType]; const nodeType = modelNodeType[modelType];
const widgetIndex = ModelGrid.modelWidgetIndex(nodeType); const widgetIndex = ModelGrid.modelWidgetIndex(nodeType);
let node = LiteGraph.createNode(nodeType, null, []); let node = LiteGraph.createNode(nodeType, null, []);
if (node) { if (widgetIndex !== -1 && node) {
node.widgets[widgetIndex].value = path; node.widgets[widgetIndex].value = path;
const selectedNodes = app.canvas.selected_nodes; const selectedNodes = app.canvas.selected_nodes;
let isSelectedNode = false; let isSelectedNode = false;
@@ -1425,7 +1425,7 @@ class ModelGrid {
const selectedNode = selectedNodes[i]; const selectedNode = selectedNodes[i];
const nodeType = modelNodeType[modelType]; const nodeType = modelNodeType[modelType];
const widgetIndex = ModelGrid.modelWidgetIndex(nodeType); const widgetIndex = ModelGrid.modelWidgetIndex(nodeType);
const target = selectedNode.widgets[widgetIndex].element; const target = selectedNode?.widgets[widgetIndex]?.element;
if (target && target.type === "textarea") { if (target && target.type === "textarea") {
target.value = ModelGrid.insertEmbeddingIntoText(target.value, embeddingFile, removeEmbeddingExtension); target.value = ModelGrid.insertEmbeddingIntoText(target.value, embeddingFile, removeEmbeddingExtension);
success = true; success = true;
@@ -1438,41 +1438,72 @@ class ModelGrid {
} }
buttonAlert(event.target, success, "✔", "✖", "✚"); buttonAlert(event.target, success, "✔", "✖", "✚");
} }
static #getWidgetComboIndices(node, value) {
const widgetIndices = [];
node?.widgets?.forEach((widget, index) => {
if (widget.type === "combo" && widget.options.values?.includes(value)) {
widgetIndices.push(index);
}
});
return widgetIndices;
}
/** /**
* @param {Event} event * @param {Event} event
* @param {string} modelType * @param {string} modelType
* @param {string} path * @param {string} path
* @param {boolean} removeEmbeddingExtension * @param {boolean} removeEmbeddingExtension
* @param {boolean} strictDragToAdd * @param {boolean} strictlyOnWidget
*/ */
static #dragAddModel(event, modelType, path, removeEmbeddingExtension, strictDragToAdd) { static #dragAddModel(event, modelType, path, removeEmbeddingExtension, strictlyOnWidget) {
const target = document.elementFromPoint(event.x, event.y); const target = document.elementFromPoint(event.x, event.y);
if (modelType !== "embeddings" && target.id === "graph-canvas") { if (modelType !== "embeddings" && target.id === "graph-canvas") {
const nodeType = modelNodeType[modelType];
const widgetIndex = ModelGrid.modelWidgetIndex(nodeType);
const pos = app.canvas.convertEventToCanvasOffset(event); const pos = app.canvas.convertEventToCanvasOffset(event);
const nodeAtPos = app.graph.getNodeOnPos(pos[0], pos[1], app.canvas.visible_nodes); const node = app.graph.getNodeOnPos(pos[0], pos[1], app.canvas.visible_nodes);
let draggedOnNode = nodeAtPos && nodeAtPos.type === nodeType; let widgetIndex = -1;
if (strictDragToAdd) { if (widgetIndex === -1) {
const draggedOnWidget = app.canvas.processNodeWidgets(nodeAtPos, pos, event) === nodeAtPos.widgets[widgetIndex]; const widgetIndices = this.#getWidgetComboIndices(node, path);
draggedOnNode = draggedOnNode && draggedOnWidget; if (widgetIndices.length === 0) {
widgetIndex = -1;
}
else if (widgetIndices.length === 1) {
widgetIndex = widgetIndices[0];
if (strictlyOnWidget) {
const draggedWidget = app.canvas.processNodeWidgets(node, pos, event);
const widget = node.widgets[widgetIndex];
if (draggedWidget != widget) { // != check NOT same object
widgetIndex = -1;
}
}
}
else {
// ambiguous widget (strictlyOnWidget always true)
const draggedWidget = app.canvas.processNodeWidgets(node, pos, event);
widgetIndex = widgetIndices.findIndex((index) => {
return draggedWidget == node.widgets[index]; // == check same object
});
}
} }
if (draggedOnNode) { if (widgetIndex !== -1) {
let node = nodeAtPos;
node.widgets[widgetIndex].value = path; node.widgets[widgetIndex].value = path;
app.canvas.selectNode(node); app.canvas.selectNode(node);
} }
else { else {
let node = LiteGraph.createNode(nodeType, null, []); const expectedNodeType = modelNodeType[modelType];
if (node) { const newNode = LiteGraph.createNode(expectedNodeType, null, []);
node.pos[0] = pos[0]; let newWidgetIndex = ModelGrid.modelWidgetIndex(expectedNodeType);
node.pos[1] = pos[1]; if (newWidgetIndex === -1) {
node.widgets[widgetIndex].value = path; newWidgetIndex = this.#getWidgetComboIndices(newNode, path)[0] ?? -1;
app.graph.add(node, {doProcessChange: true}); }
app.canvas.selectNode(node); if (newNode !== undefined && newNode !== null && newWidgetIndex !== -1) {
newNode.pos[0] = pos[0];
newNode.pos[1] = pos[1];
newNode.widgets[newWidgetIndex].value = path;
app.graph.add(newNode, {doProcessChange: true});
app.canvas.selectNode(newNode);
} }
} }
event.stopPropagation(); event.stopPropagation();
@@ -1512,9 +1543,11 @@ class ModelGrid {
else if (nodeType) { else if (nodeType) {
const node = LiteGraph.createNode(nodeType, null, []); const node = LiteGraph.createNode(nodeType, null, []);
const widgetIndex = ModelGrid.modelWidgetIndex(nodeType); const widgetIndex = ModelGrid.modelWidgetIndex(nodeType);
node.widgets[widgetIndex].value = path; if (widgetIndex !== -1) {
app.canvas.copyToClipboard([node]); node.widgets[widgetIndex].value = path;
success = true; app.canvas.copyToClipboard([node]);
success = true;
}
} }
else { else {
console.warn(`Unable to copy unknown model type '${modelType}.`); console.warn(`Unable to copy unknown model type '${modelType}.`);