Merge pull request #165 from ilyabesk/node_connect_hooks

Remade lost changes from pull request #154
This commit is contained in:
Javi Agenjo
2021-01-04 13:20:30 +01:00
committed by GitHub
2 changed files with 107 additions and 91 deletions

31
src/litegraph.d.ts vendored
View File

@@ -740,7 +740,7 @@ export declare class LGraphNode {
name: string, name: string,
type: string | -1, type: string | -1,
extra_info?: Partial<INodeOutputSlot> extra_info?: Partial<INodeOutputSlot>
): void; ): INodeOutputSlot;
/** /**
* add a new output slot to use in this node * add a new output slot to use in this node
* @param array of triplets like [[name,type,extra_info],[...]] * @param array of triplets like [[name,type,extra_info],[...]]
@@ -760,7 +760,7 @@ export declare class LGraphNode {
name: string, name: string,
type: string | -1, type: string | -1,
extra_info?: Partial<INodeInputSlot> extra_info?: Partial<INodeInputSlot>
): void; ): INodeInputSlot;
/** /**
* add several new input slots in this node * add several new input slots in this node
* @param array of triplets like [[name,type,extra_info],[...]] * @param array of triplets like [[name,type,extra_info],[...]]
@@ -953,13 +953,34 @@ export declare class LGraphNode {
/** /**
* if returns false the incoming connection will be canceled * if returns false the incoming connection will be canceled
* Called by `LGraph.connect` * Called by `LGraph.connect`
* @param inputIndex target input slot number
* @param outputType type of output slot
* @param outputSlot output slot object
* @param outputNode node containing the output
* @param outputIndex index of output slot
*/ */
onConnectInput?( onConnectInput?(
inputIndex: number, inputIndex: number,
type: INodeOutputSlot["type"], outputType: INodeOutputSlot["type"],
outputSlot: INodeOutputSlot, outputSlot: INodeOutputSlot,
_this: this, outputNode: LGraphNode,
slotIndex: number outputIndex: number
): boolean;
/**
* if returns false the incoming connection will be canceled
* Called by `LGraph.connect`
* @param outputIndex target output slot number
* @param inputType type of input slot
* @param inputSlot input slot object
* @param inputNode node containing the input
* @param inputIndex index of input slot
*/
onConnectOutput?(
outputIndex: number,
inputType: INodeInputSlot["type"],
inputSlot: INodeInputSlot,
inputNode: LGraphNode,
inputIndex: number
): boolean; ): boolean;
/** /**

View File

@@ -3709,99 +3709,94 @@
} }
var changed = false; var changed = false;
//if there is something already plugged there, disconnect
if (target_node.inputs[target_slot].link != null) {
this.graph.beforeChange();
target_node.disconnectInput(target_slot);
changed = true;
}
//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 input = target_node.inputs[target_slot];
var output = this.outputs[slot];
var link_info = null; var link_info = null;
//this slots cannot be connected (different types) if (LiteGraph.isValidConnection(output.type, input.type)) {
if (!LiteGraph.isValidConnection(output.type, input.type)) if (target_node.onBeforeConnectInput) {
{ // This way node can choose another slot (if selected is occupied)
this.setDirtyCanvas(false, true); target_slot = target_node.onBeforeConnectInput(target_slot);
if(changed) }
this.graph.connectionChange(this, link_info);
return null;
}
if(!changed) //if there is something already plugged there, disconnect
this.graph.beforeChange(); if (target_node.inputs[target_slot].link != null) {
target_node.disconnectInput(target_slot);
}
//create link class //why here??
link_info = new LLink( //this.setDirtyCanvas(false,true);
++this.graph.last_link_id, //this.graph.connectionChange( this );
input.type,
this.id,
slot,
target_node.id,
target_slot
);
//add to graph links list //allows nodes to block connection
this.graph.links[link_info.id] = link_info; if (target_node.onConnectInput) {
if ( target_node.onConnectInput(target_slot, output.type, output, this, slot) === false ) {
return null;
}
}
if (this.onConnectOutput) {
if ( this.onConnectOutput(slot, input.type, input, target_node, target_slot) === false ) {
return null;
}
}
//connect in output link_info = new LLink(
if (output.links == null) { ++this.graph.last_link_id,
output.links = []; input.type,
} this.id,
output.links.push(link_info.id); slot,
//connect in input target_node.id,
target_node.inputs[target_slot].link = link_info.id; target_slot
if (this.graph) { );
this.graph._version++;
} //add to graph links list
if (this.onConnectionsChange) { this.graph.links[link_info.id] = link_info;
this.onConnectionsChange(
LiteGraph.OUTPUT, //connect in output
slot, if (output.links == null) {
true, output.links = [];
link_info, }
output output.links.push(link_info.id);
); //connect in input
} //link_info has been created now, so its updated target_node.inputs[target_slot].link = link_info.id;
if (target_node.onConnectionsChange) { if (this.graph) {
target_node.onConnectionsChange( this.graph._version++;
LiteGraph.INPUT, }
target_slot, if (this.onConnectionsChange) {
true, this.onConnectionsChange(
link_info, LiteGraph.OUTPUT,
input slot,
); true,
} link_info,
if (this.graph && this.graph.onNodeConnectionChange) { output
this.graph.onNodeConnectionChange( );
LiteGraph.INPUT, } //link_info has been created now, so its updated
target_node, if (target_node.onConnectionsChange) {
target_slot, target_node.onConnectionsChange(
this, LiteGraph.INPUT,
slot target_slot,
); true,
this.graph.onNodeConnectionChange( link_info,
LiteGraph.OUTPUT, input
this, );
slot, }
target_node, if (this.graph && this.graph.onNodeConnectionChange) {
target_slot this.graph.onNodeConnectionChange(
); LiteGraph.INPUT,
} target_node,
target_slot,
this,
slot
);
this.graph.onNodeConnectionChange(
LiteGraph.OUTPUT,
this,
slot,
target_node,
target_slot
);
}
}
this.setDirtyCanvas(false, true); this.setDirtyCanvas(false, true);
this.graph.afterChange(); this.graph.afterChange();