Skip to content

Commit def6010

Browse files
[refactor] Remove parentSubgraphNode property from widgets (#1145)
1 parent efdb808 commit def6010

File tree

4 files changed

+4
-55
lines changed

4 files changed

+4
-55
lines changed

src/subgraph/SubgraphNode.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,6 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {
190190
// Use the first matching widget
191191
const promotedWidget = toConcreteWidget(widget, this).createCopyForNode(this)
192192

193-
// Set parentSubgraphNode for all promoted widgets to track their origin
194-
promotedWidget.parentSubgraphNode = this
195-
196193
Object.assign(promotedWidget, {
197194
get name() {
198195
return subgraphInput.name
@@ -332,7 +329,6 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {
332329
override onRemoved(): void {
333330
// Clean up all promoted widgets
334331
for (const widget of this.widgets) {
335-
widget.parentSubgraphNode = undefined
336332
this.subgraph.events.dispatch("widget-demoted", { widget, subgraphNode: this })
337333
}
338334

src/types/widgets.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { CanvasColour, Point, RequiredProps, Size } from "../interfaces"
22
import type { CanvasPointer, LGraphCanvas, LGraphNode } from "../litegraph"
33
import type { CanvasPointerEvent } from "./events"
4-
import type { NodeLike } from "./NodeLike"
54

65
export interface IWidgetOptions<TValues = unknown[]> {
76
on?: string
@@ -202,14 +201,6 @@ export interface IBaseWidget<
202201

203202
tooltip?: string
204203

205-
/**
206-
* Reference to the subgraph container node when this widget is promoted from a subgraph.
207-
* This allows the widget to know which SubgraphNode it belongs to in the parent graph.
208-
* @remarks This property is a runtime reference and should not be serialized.
209-
* It will be undefined after deserialization and needs to be reconstructed.
210-
*/
211-
parentSubgraphNode?: NodeLike
212-
213204
// TODO: Confirm this format
214205
callback?(
215206
value: any,

src/widgets/BaseWidget.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { Point } from "@/interfaces"
22
import type { CanvasPointer, LGraphCanvas, LGraphNode, Size } from "@/litegraph"
33
import type { CanvasPointerEvent } from "@/types/events"
4-
import type { NodeLike } from "@/types/NodeLike"
54
import type { IBaseWidget } from "@/types/widgets"
65

76
import { drawTextInArea } from "@/draw"
@@ -57,12 +56,6 @@ export abstract class BaseWidget<TWidget extends IBaseWidget = IBaseWidget> impl
5756
return this.#node
5857
}
5958

60-
/**
61-
* Reference to the subgraph container node when this widget is promoted from a subgraph.
62-
* This allows the widget to know which SubgraphNode it belongs to in the parent graph.
63-
*/
64-
parentSubgraphNode?: NodeLike
65-
6659
linkedWidgets?: IBaseWidget[]
6760
name: string
6861
options: TWidget["options"]

test/subgraph/SubgraphWidgetPromotion.test.ts

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,9 @@ describe("SubgraphWidgetPromotion", () => {
5555
expect(subgraphNode.widgets[0].name).toBe("value") // Uses subgraph input name
5656
expect(subgraphNode.widgets[0].type).toBe("number")
5757
expect(subgraphNode.widgets[0].value).toBe(42)
58-
expect(subgraphNode.widgets[0].parentSubgraphNode).toBe(subgraphNode)
5958
})
6059

61-
it("should set parentSubgraphNode for all promoted widget types", () => {
60+
it("should promote all widget types", () => {
6261
const subgraph = createTestSubgraph({
6362
inputs: [
6463
{ name: "numberInput", type: "number" },
@@ -83,13 +82,9 @@ describe("SubgraphWidgetPromotion", () => {
8382

8483
const subgraphNode = createTestSubgraphNode(subgraph)
8584

86-
// All widgets should be promoted with parentSubgraphNode set
85+
// All widgets should be promoted
8786
expect(subgraphNode.widgets).toHaveLength(3)
8887

89-
for (const widget of subgraphNode.widgets) {
90-
expect(widget.parentSubgraphNode).toBe(subgraphNode)
91-
}
92-
9388
// Check specific widget values
9489
expect(subgraphNode.widgets[0].value).toBe(100)
9590
expect(subgraphNode.widgets[1].value).toBe("test")
@@ -113,7 +108,6 @@ describe("SubgraphWidgetPromotion", () => {
113108
const promotedEvents = eventCapture.getEventsByType("widget-promoted")
114109
expect(promotedEvents).toHaveLength(1)
115110
expect(promotedEvents[0].detail.widget).toBeDefined()
116-
expect(promotedEvents[0].detail.widget.parentSubgraphNode).toBe(subgraphNode)
117111
expect(promotedEvents[0].detail.subgraphNode).toBe(subgraphNode)
118112

119113
eventCapture.cleanup()
@@ -192,58 +186,33 @@ describe("SubgraphWidgetPromotion", () => {
192186
expect(subgraphNode.widgets).toHaveLength(2)
193187
expect(subgraphNode.widgets[0].name).toBe("input1")
194188
expect(subgraphNode.widgets[0].value).toBe(10)
195-
expect(subgraphNode.widgets[0].parentSubgraphNode).toBe(subgraphNode)
196189

197190
expect(subgraphNode.widgets[1].name).toBe("input2")
198191
expect(subgraphNode.widgets[1].value).toBe("hello")
199-
expect(subgraphNode.widgets[1].parentSubgraphNode).toBe(subgraphNode)
200192
})
201193

202-
it("should clean up parentSubgraphNode on node removal", () => {
194+
it("should fire widget-demoted events when node is removed", () => {
203195
const subgraph = createTestSubgraph({
204196
inputs: [{ name: "input", type: "number" }],
205197
})
206198

207199
const { node } = createNodeWithWidget("Test Node")
208200
const subgraphNode = setupPromotedWidget(subgraph, node)
209-
const promotedWidget = subgraphNode.widgets[0]
210201

211-
expect(promotedWidget.parentSubgraphNode).toBe(subgraphNode)
202+
expect(subgraphNode.widgets).toHaveLength(1)
212203

213204
const eventCapture = createEventCapture(subgraph.events, ["widget-demoted"])
214205

215206
// Remove the subgraph node
216207
subgraphNode.onRemoved()
217208

218-
// parentSubgraphNode should be cleared
219-
expect(promotedWidget.parentSubgraphNode).toBeUndefined()
220-
221209
// Should fire demoted events for all widgets
222210
const demotedEvents = eventCapture.getEventsByType("widget-demoted")
223211
expect(demotedEvents).toHaveLength(1)
224212

225213
eventCapture.cleanup()
226214
})
227215

228-
it("should handle DOM widgets with parentSubgraphNode", () => {
229-
const subgraph = createTestSubgraph({
230-
inputs: [{ name: "domInput", type: "custom" }],
231-
})
232-
233-
const { node, widget } = createNodeWithWidget("DOM Node", "custom", "custom value", "custom")
234-
235-
// Make it a DOM widget
236-
widget.element = document.createElement("div")
237-
238-
const subgraphNode = setupPromotedWidget(subgraph, node)
239-
240-
// DOM widget should be promoted with parentSubgraphNode
241-
expect(subgraphNode.widgets).toHaveLength(1)
242-
const promotedWidget = subgraphNode.widgets[0]
243-
expect(promotedWidget.parentSubgraphNode).toBe(subgraphNode)
244-
expect(promotedWidget.name).toBe("domInput")
245-
})
246-
247216
it("should not promote widget if input is not connected", () => {
248217
const subgraph = createTestSubgraph({
249218
inputs: [{ name: "input", type: "number" }],

0 commit comments

Comments
 (0)