Skip to content

Commit 7d3ae89

Browse files
committed
Keep the widget array itself reactive, Add proxy support (to be cleaned up soon)
1 parent 1120c48 commit 7d3ae89

File tree

5 files changed

+34
-8
lines changed

5 files changed

+34
-8
lines changed

src/composables/graph/useGraphNodeManager.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export interface WidgetSlotMetadata {
4343
* Value and metadata (label, hidden, disabled, etc.) are accessed via widgetValueStore.
4444
*/
4545
export interface SafeWidgetData {
46+
nodeId: NodeId
4647
name: string
4748
type: string
4849
/** Callback to invoke when widget value changes (wraps LiteGraph callback + triggerDraw) */
@@ -210,9 +211,19 @@ function safeWidgetMapper(
210211
advanced: widget.advanced
211212
}
212213
: undefined
214+
const subgraphId = node.isSubgraphNode() && node.subgraph.id
215+
216+
const localId = isProxyWidget(widget)
217+
? widget._overlay?.nodeId
218+
: undefined
219+
const nodeId = subgraphId && localId ? `${subgraphId}:${localId}` : '-1'
220+
const name = isProxyWidget(widget)
221+
? widget._overlay.widgetName
222+
: widget.name
213223

214224
return {
215-
name: widget.name,
225+
nodeId,
226+
name,
216227
type: widget.type,
217228
...sharedEnhancements,
218229
callback,
@@ -223,6 +234,7 @@ function safeWidgetMapper(
223234
}
224235
} catch (error) {
225236
return {
237+
nodeId: String(node.id),
226238
name: widget.name || 'unknown',
227239
type: widget.type || 'text'
228240
}
@@ -240,6 +252,15 @@ export function extractVueNodeData(node: LGraphNode): VueNodeData {
240252
// Extract safe widget data
241253
const slotMetadata = new Map<string, WidgetSlotMetadata>()
242254

255+
const reactiveWidgets = shallowReactive<IBaseWidget[]>(node.widgets ?? [])
256+
Object.defineProperty(node, 'widgets', {
257+
get() {
258+
return reactiveWidgets
259+
},
260+
set(v) {
261+
reactiveWidgets.splice(0, reactiveWidgets.length, ...v)
262+
}
263+
})
243264
const reactiveInputs = shallowReactive<INodeInputSlot[]>(node.inputs ?? [])
244265
Object.defineProperty(node, 'inputs', {
245266
get() {

src/core/graph/subgraph/proxyWidget.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ function newProxyWidget(
152152
computedHeight: undefined,
153153
isProxyWidget: true,
154154
last_y: undefined,
155-
name,
155+
label: name,
156+
name: widgetName,
156157
node: subgraphNode,
157158
onRemove: undefined,
158159
promoted: undefined,

src/renderer/extensions/vueNodes/components/LGraphNodePreview.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ const nodeData = computed<VueNodeData>(() => {
5656
const widgets = Object.entries(nodeDef.inputs || {})
5757
.filter(([_, input]) => widgetStore.inputIsWidget(input))
5858
.map(([name, input]) => ({
59+
nodeId: '-1',
5960
name,
6061
type: input.widgetType || input.type,
6162
value:

src/renderer/extensions/vueNodes/components/NodeWidgets.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ describe('NodeWidgets', () => {
1313
const createMockWidget = (
1414
overrides: Partial<SafeWidgetData> = {}
1515
): SafeWidgetData => ({
16+
nodeId: 'test_node',
1617
name: 'test_widget',
1718
type: 'combo',
1819
options: undefined,

src/renderer/extensions/vueNodes/components/NodeWidgets.vue

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ const processedWidgets = computed((): ProcessedWidget[] => {
175175
const { slotMetadata } = widget
176176
177177
// Get metadata from store (registered during BaseWidget.setNodeId)
178-
const widgetState = widgetValueStore.getWidget(nodeId, widget.name)
178+
const bareWidgetId = String(widget.nodeId ?? nodeId).replace(/^(.*:)+/, '')
179+
const widgetState = widgetValueStore.getWidget(bareWidgetId, widget.name)
179180
180181
// Get value from store (falls back to undefined if not registered)
181182
const value = widgetState?.value as WidgetValue
@@ -187,11 +188,12 @@ const processedWidgets = computed((): ProcessedWidget[] => {
187188
: storeOptions
188189
189190
// Derive border style from store metadata
190-
const borderStyle = widgetState?.promoted
191-
? 'ring ring-component-node-widget-promoted'
192-
: widgetState?.advanced
193-
? 'ring ring-component-node-widget-advanced'
194-
: undefined
191+
const borderStyle =
192+
widgetState?.promoted && String(widgetState?.nodeId) === String(nodeId)
193+
? 'ring ring-component-node-widget-promoted'
194+
: widgetState?.advanced
195+
? 'ring ring-component-node-widget-advanced'
196+
: undefined
195197
196198
const simplified: SimplifiedWidget = {
197199
name: widget.name,

0 commit comments

Comments
 (0)