@@ -4,11 +4,14 @@ import { LGraphCanvas } from '@/lib/litegraph/src/LGraphCanvas'
44import { LGraphNode } from '@/lib/litegraph/src/LGraphNode'
55import { LLink , type ResolvedConnection } from '@/lib/litegraph/src/LLink'
66import { RecursionError } from '@/lib/litegraph/src/infrastructure/RecursionError'
7- import type { ISubgraphInput } from '@/lib/litegraph/src/interfaces'
8- import {
9- type INodeInputSlot ,
10- type ISlotType ,
11- type NodeId
7+ import type {
8+ ISubgraphInput ,
9+ IWidgetLocator
10+ } from '@/lib/litegraph/src/interfaces'
11+ import type {
12+ INodeInputSlot ,
13+ ISlotType ,
14+ NodeId
1215} from '@/lib/litegraph/src/litegraph'
1316import { NodeInputSlot } from '@/lib/litegraph/src/node/NodeInputSlot'
1417import { NodeOutputSlot } from '@/lib/litegraph/src/node/NodeOutputSlot'
@@ -78,9 +81,10 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {
7881 const existingInput = this . inputs . find ( ( i ) => i . name == name )
7982 if ( existingInput ) {
8083 const linkId = subgraphInput . linkIds [ 0 ]
81- const { inputNode } = subgraph . links [ linkId ] . resolve ( subgraph )
84+ const { inputNode, input } = subgraph . links [ linkId ] . resolve ( subgraph )
8285 const widget = inputNode ?. widgets ?. find ?.( ( w ) => w . name == name )
83- if ( widget ) this . #setWidget( subgraphInput , existingInput , widget )
86+ if ( widget )
87+ this . #setWidget( subgraphInput , existingInput , widget , input ?. widget )
8488 return
8589 }
8690 const input = this . addInput ( name , type )
@@ -185,13 +189,14 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {
185189
186190 subgraphInput . events . addEventListener (
187191 'input-connected' ,
188- ( ) => {
192+ ( e ) => {
189193 if ( input . _widget ) return
190194
191195 const widget = subgraphInput . _widget
192196 if ( ! widget ) return
193197
194- this . #setWidget( subgraphInput , input , widget )
198+ const widgetLocator = e . detail . input . widget
199+ this . #setWidget( subgraphInput , input , widget , widgetLocator )
195200 } ,
196201 { signal }
197202 )
@@ -301,7 +306,7 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {
301306 const widget = resolved . inputNode . getWidgetFromSlot ( resolved . input )
302307 if ( ! widget ) continue
303308
304- this . #setWidget( subgraphInput , input , widget )
309+ this . #setWidget( subgraphInput , input , widget , resolved . input . widget )
305310 break
306311 }
307312 }
@@ -310,11 +315,13 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {
310315 #setWidget(
311316 subgraphInput : Readonly < SubgraphInput > ,
312317 input : INodeInputSlot ,
313- widget : Readonly < IBaseWidget >
318+ widget : Readonly < IBaseWidget > ,
319+ inputWidget : IWidgetLocator | undefined
314320 ) {
315321 // Use the first matching widget
316- const targetWidget = toConcreteWidget ( widget , this )
317- const promotedWidget = targetWidget . createCopyForNode ( this )
322+ const promotedWidget = toConcreteWidget ( widget , this ) . createCopyForNode (
323+ this
324+ )
318325
319326 Object . assign ( promotedWidget , {
320327 get name ( ) {
@@ -372,11 +379,9 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {
372379 // NOTE: This code creates linked chains of prototypes for passing across
373380 // multiple levels of subgraphs. As part of this, it intentionally avoids
374381 // creating new objects. Have care when making changes.
375- const backingInput =
376- targetWidget . node . findInputSlot ( widget . name , true ) ?. widget ?? { }
377382 input . widget ??= { name : subgraphInput . name }
378383 input . widget . name = subgraphInput . name
379- Object . setPrototypeOf ( input . widget , backingInput )
384+ if ( inputWidget ) Object . setPrototypeOf ( input . widget , inputWidget )
380385
381386 input . _widget = promotedWidget
382387 }
0 commit comments