Add slot compatibility checking for subgraph slots (#1182)

This commit is contained in:
Benjamin Lu
2025-08-01 18:38:57 -04:00
committed by GitHub
parent 04b03e22f8
commit 6fa2e8e3ca
14 changed files with 624 additions and 39 deletions

View File

@@ -1,13 +1,16 @@
import type { SubgraphInput } from "./SubgraphInput"
import type { SubgraphOutputNode } from "./SubgraphOutputNode"
import type { INodeOutputSlot, Point, ReadOnlyRect } from "@/interfaces"
import type { INodeInputSlot, INodeOutputSlot, Point, ReadOnlyRect } from "@/interfaces"
import type { LGraphNode } from "@/LGraphNode"
import type { RerouteId } from "@/Reroute"
import { LiteGraph } from "@/litegraph"
import { LLink } from "@/LLink"
import { NodeSlotType } from "@/types/globalEnums"
import { removeFromArray } from "@/utils/collections"
import { SubgraphSlot } from "./SubgraphSlotBase"
import { isNodeSlot, isSubgraphInput } from "./subgraphUtils"
/**
* An output "slot" from a subgraph to a parent graph.
@@ -26,6 +29,9 @@ export class SubgraphOutput extends SubgraphSlot {
override connect(slot: INodeOutputSlot, node: LGraphNode, afterRerouteId?: RerouteId): LLink | undefined {
const { subgraph } = this.parent
// Validate type compatibility
if (!LiteGraph.isValidConnection(slot.type, this.type)) return
// Allow nodes to block connection
const outputIndex = node.outputs.indexOf(slot)
if (outputIndex === -1) throw new Error("Slot is not an output of the given node")
@@ -111,4 +117,21 @@ export class SubgraphOutput extends SubgraphSlot {
pos[0] = left + height * 0.5
pos[1] = top + height * 0.5
}
/**
* Checks if this slot is a valid target for a connection from the given slot.
* For SubgraphOutput (which acts as an input inside the subgraph),
* the fromSlot should be an output slot.
*/
override isValidTarget(fromSlot: INodeInputSlot | INodeOutputSlot | SubgraphInput | SubgraphOutput): boolean {
if (isNodeSlot(fromSlot)) {
return "links" in fromSlot && LiteGraph.isValidConnection(fromSlot.type, this.type)
}
if (isSubgraphInput(fromSlot)) {
return LiteGraph.isValidConnection(fromSlot.type, this.type)
}
return false
}
}