diff options
-rw-r--r-- | core/gjs/src/astalify.ts | 33 | ||||
-rw-r--r-- | core/gjs/src/gobject.ts | 16 | ||||
-rw-r--r-- | core/lua/astal/widget.lua | 8 |
3 files changed, 34 insertions, 23 deletions
diff --git a/core/gjs/src/astalify.ts b/core/gjs/src/astalify.ts index 85d7531..29e7a5f 100644 --- a/core/gjs/src/astalify.ts +++ b/core/gjs/src/astalify.ts @@ -25,18 +25,17 @@ function mergeBindings(array: any[]) { function setProp(obj: any, prop: string, value: any) { try { + // the setter method has to be used because + // array like properties are not bound correctly as props const setter = `set_${snakeify(prop)}` if (typeof obj[setter] === "function") return obj[setter](value) - if (Object.hasOwn(obj, prop)) - return (obj[prop] = value) + 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 default function astalify< @@ -183,6 +182,19 @@ export default function astalify< return acc }, []) + // setup bindings handlers + for (const [prop, binding] of bindings) { + if (prop === "child" || prop === "children") { + this.connect("destroy", binding.subscribe((v: any) => { + this._setChildren(v) + })) + } + this.connect("destroy", binding.subscribe((v: any) => { + setProp(this, prop, v) + })) + setProp(this, prop, binding.get()) + } + // set children const mergedChildren = mergeBindings(children.flat(Infinity)) if (mergedChildren instanceof Binding) { @@ -208,19 +220,6 @@ export default function astalify< } } - // setup bindings handlers - for (const [prop, binding] of bindings) { - if (prop === "child" || prop === "children") { - this.connect("destroy", binding.subscribe((v: any) => { - this._setChildren(v) - })) - } - this.connect("destroy", binding.subscribe((v: any) => { - setProp(this, prop, v) - })) - setProp(this, prop, binding.get()) - } - Object.assign(this, props) setup?.(this) } diff --git a/core/gjs/src/gobject.ts b/core/gjs/src/gobject.ts index 0b3551d..2658555 100644 --- a/core/gjs/src/gobject.ts +++ b/core/gjs/src/gobject.ts @@ -67,6 +67,18 @@ export function property(declaration: PropertyDeclaration = Object) { }, }) + Object.defineProperty(target, `set_${name.replace("-", "_")}`, { + value: function (v: any) { + this[prop] = v + } + }) + + Object.defineProperty(target, `get_${name.replace("-", "_")}`, { + value: function () { + return this[prop] + } + }) + target.constructor[meta].Properties[kebabify(prop)] = pspec(name, ParamFlags.READWRITE, declaration) } @@ -81,10 +93,10 @@ export function property(declaration: PropertyDeclaration = Object) { } export function signal(...params: Array<{ $gtype: GObject.GType } | typeof Object>): -(target: any, signal: any, desc?: PropertyDescriptor) => void + (target: any, signal: any, desc?: PropertyDescriptor) => void export function signal(declaration?: SignalDeclaration): -(target: any, signal: any, desc?: PropertyDescriptor) => void + (target: any, signal: any, desc?: PropertyDescriptor) => void export function signal( declaration?: SignalDeclaration | { $gtype: GObject.GType } | typeof Object, diff --git a/core/lua/astal/widget.lua b/core/lua/astal/widget.lua index 8f49409..73fe3b6 100644 --- a/core/lua/astal/widget.lua +++ b/core/lua/astal/widget.lua @@ -206,6 +206,10 @@ local function astalify(ctor) -- construct, attach bindings, add children local widget = ctor() + for prop, value in pairs(props) do + widget[prop] = value + end + if getmetatable(children) == Binding then set_children(widget, children:get()) widget.on_destroy = children:subscribe(function(v) @@ -223,10 +227,6 @@ local function astalify(ctor) end) end - for prop, value in pairs(props) do - widget[prop] = value - end - if type(setup) == "function" then setup(widget) end |