Dragging models onto node inputs now works when unambiguous.
This commit is contained in:
@@ -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}.`);
|
||||||
|
|||||||
Reference in New Issue
Block a user