Reimplement disconnect/reconnect logic, add test

This commit is contained in:
Austin Mroz
2025-09-22 13:32:58 -05:00
parent ebe92ed884
commit e67bd12168
2 changed files with 26 additions and 5 deletions

View File

@@ -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

View File

@@ -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')
})
})