From e67bd12168b81827ec4719575a95bc8b6812a0a3 Mon Sep 17 00:00:00 2001 From: Austin Mroz Date: Mon, 22 Sep 2025 13:32:58 -0500 Subject: [PATCH] Reimplement disconnect/reconnect logic, add test --- src/scripts/proxyWidget.ts | 11 ++++++++--- tests-ui/tests/widgets/proxyWidget.test.ts | 20 ++++++++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/scripts/proxyWidget.ts b/src/scripts/proxyWidget.ts index 295309e024..3020411947 100644 --- a/src/scripts/proxyWidget.ts +++ b/src/scripts/proxyWidget.ts @@ -103,7 +103,7 @@ function resolveLinkedWidget( } function addProxyFromOverlay(subgraphNode: SubgraphNode, overlay: Overlay) { let [linkedNode, linkedWidget] = resolveLinkedWidget(overlay) - const backingWidget = linkedWidget ?? disconnectedWidget + let backingWidget = linkedWidget ?? disconnectedWidget if (overlay.widgetName == '$$canvas-image-preview') overlay.node = new Proxy(subgraphNode, { get(_t, p) { @@ -135,10 +135,10 @@ function addProxyFromOverlay(subgraphNode: SubgraphNode, overlay: Overlay) { */ const handler = { get(_t: IBaseWidget, property: string, receiver: object) { - if (property == '_overlay') return overlay let redirectedTarget: object = backingWidget let redirectedReceiver = receiver - if (property == 'value') redirectedReceiver = backingWidget + if (property == '_overlay') return overlay + else if (property == 'value') redirectedReceiver = backingWidget if (overlay.hasOwnProperty(property)) { redirectedTarget = overlay redirectedReceiver = overlay @@ -149,6 +149,11 @@ function addProxyFromOverlay(subgraphNode: SubgraphNode, overlay: Overlay) { let redirectedTarget: object = backingWidget let redirectedReceiver = receiver if (property == 'value') redirectedReceiver = backingWidget + else if (property == 'computedHeight') { + //update linkage regularly, but no more than once per frame + ;[linkedNode, linkedWidget] = resolveLinkedWidget(overlay) + backingWidget = linkedWidget ?? disconnectedWidget + } if (overlay.hasOwnProperty(property)) { redirectedTarget = overlay redirectedReceiver = overlay diff --git a/tests-ui/tests/widgets/proxyWidget.test.ts b/tests-ui/tests/widgets/proxyWidget.test.ts index bd38c119cc..0101611e7b 100644 --- a/tests-ui/tests/widgets/proxyWidget.test.ts +++ b/tests-ui/tests/widgets/proxyWidget.test.ts @@ -87,9 +87,9 @@ describe('Subgraph proxyWidgets', () => { ['1', 'stringWidget'] ]) expect(subgraphNode.widgets.length).toBe(1) - expect(subgraphNode.widgets![0].value).toBe('value') + expect(subgraphNode.widgets[0].value).toBe('value') innerNodes[0].widgets![0].value = 'test' - expect(subgraphNode.widgets![0].value).toBe('test') + expect(subgraphNode.widgets[0].value).toBe('test') subgraphNode.widgets[0].value = 'test2' expect(innerNodes[0].widgets![0].value).toBe('test2') }) @@ -110,4 +110,20 @@ describe('Subgraph proxyWidgets', () => { expect(innerNodes[0].widgets[0].last_y).toBe(11) expect(innerNodes[0].widgets[0].computedHeight).toBe(12) }) + test('Can detatch and re-attach widgets', () => { + const [subgraphNode, innerNodes] = setupSubgraph(1) + innerNodes[0].addWidget('text', 'stringWidget', 'value', () => {}) + subgraphNode.properties.proxyWidgets = JSON.stringify([ + ['1', 'stringWidget'] + ]) + if (!innerNodes[0].widgets) throw new Error('node has no widgets') + expect(subgraphNode.widgets[0].value).toBe('value') + const poppedWidget = innerNodes[0].widgets.pop() + //simulate new draw frame + subgraphNode.widgets[0].computedHeight = 10 + expect(subgraphNode.widgets[0].value).toBe(undefined) + innerNodes[0].widgets.push(poppedWidget!) + subgraphNode.widgets[0].computedHeight = 10 + expect(subgraphNode.widgets[0].value).toBe('value') + }) })