diff --git a/src/litegraph.d.ts b/src/litegraph.d.ts index ec4cbaf95..b35ce01c7 100644 --- a/src/litegraph.d.ts +++ b/src/litegraph.d.ts @@ -938,6 +938,17 @@ export declare class LGraphNode { _this: this, slotIndex: number ): boolean; + + /** + * Called just before connection (or disconnect - if input is linked). + * A convenient place to switch to another input, or create new one. + * This allow for ability to automatically add slots if needed + * @param inputIndex + * @return selected input slot index, can differ from parameter value + */ + onBeforeConnectInput?( + inputIndex: number + ): number; /** a connection changed (new one or removed) (LiteGraph.INPUT or LiteGraph.OUTPUT, slot, true if connected, link_info, input_info or output_info ) */ onConnectionsChange( diff --git a/src/litegraph.js b/src/litegraph.js index 0c0c1347a..bd4d74512 100755 --- a/src/litegraph.js +++ b/src/litegraph.js @@ -3592,28 +3592,33 @@ return null; } - //if there is something already plugged there, disconnect - if (target_node.inputs[target_slot].link != null) { - target_node.disconnectInput(target_slot); - } - - //why here?? - //this.setDirtyCanvas(false,true); - //this.graph.connectionChange( this ); - - var output = this.outputs[slot]; - - //allows nodes to block connection - if (target_node.onConnectInput) { - if ( target_node.onConnectInput(target_slot, output.type, output, this, slot) === false ) { - return null; - } - } - - var input = target_node.inputs[target_slot]; - var link_info = null; - if (LiteGraph.isValidConnection(output.type, input.type)) { + if (target_node.onBeforeConnectInput) { + // This way node can choose another slot (if selected is occupied) + target_slot = target_node.onBeforeConnectInput(target_slot); + } + + //if there is something already plugged there, disconnect + if (target_node.inputs[target_slot].link != null) { + target_node.disconnectInput(target_slot); + } + + //why here?? + //this.setDirtyCanvas(false,true); + //this.graph.connectionChange( this ); + + var output = this.outputs[slot]; + + //allows nodes to block connection + if (target_node.onConnectInput) { + if ( target_node.onConnectInput(target_slot, output.type, output, this, slot) === false ) { + return null; + } + } + + var input = target_node.inputs[target_slot]; + var link_info = null; + link_info = new LLink( ++this.graph.last_link_id, input.type,