From a1f9272f4576fd3c366581464223e08a35ccf99f Mon Sep 17 00:00:00 2001 From: Aylur Date: Thu, 18 Jul 2024 18:35:51 +0200 Subject: fix(gjs): binding setters Array and List types do not work as property from Vala, but their setter methods do --- gjs/src/astalify.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'gjs/src') diff --git a/gjs/src/astalify.ts b/gjs/src/astalify.ts index d99711d..ad39da0 100644 --- a/gjs/src/astalify.ts +++ b/gjs/src/astalify.ts @@ -63,6 +63,21 @@ function mergeBindings(array: any[]) { return Variable.derive(bindings, getValues)() } +function setProp(obj: any, prop: string, value: any) { + try { + const setter = `set_${snakeify(prop)}` + if (typeof obj[setter] === "function") + return obj[setter](value) + + if (Object.hasOwn(obj, prop)) + return (obj[prop] = value) + } catch (error) { + console.error(`could not set property "${prop}" on ${obj}:`, error) + } + + console.error(`could not set property "${prop}" on ${obj}`) +} + export type Widget = InstanceType & { className: string css: string @@ -112,7 +127,7 @@ function ctor(self: any, config: any = {}, children: any = []) { const bindings = Object.keys(props).reduce((acc: any, prop) => { if (props[prop] instanceof Binding) { const binding = props[prop] - self[`set_${snakeify(prop)}`](binding.get()) + setProp(self, prop, binding.get()) delete props[prop] return [...acc, [prop, binding]] } @@ -148,7 +163,7 @@ function ctor(self: any, config: any = {}, children: any = []) { })) } self.connect("destroy", bind.subscribe((v: any) => { - self[`set_${snakeify(prop)}`](v) + setProp(self, prop, v) })) } -- cgit v1.2.3