diff options
author | Aylur <[email protected]> | 2024-07-18 18:35:51 +0200 |
---|---|---|
committer | Aylur <[email protected]> | 2024-07-18 18:35:51 +0200 |
commit | a1f9272f4576fd3c366581464223e08a35ccf99f (patch) | |
tree | bcd09747d6ec3b5aab077a897cf3cfa451b50a40 | |
parent | 62d71a3c843689cce26de0ede1a1f3569adb45f4 (diff) |
fix(gjs): binding setters
Array and List types do not work as property from Vala, but their setter
methods do
-rw-r--r-- | gjs/src/astalify.ts | 19 |
1 files changed, 17 insertions, 2 deletions
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<C extends { new(...args: any): Gtk.Widget }> = InstanceType<C> & { 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) })) } |