summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/gjs/src/astalify.ts33
-rw-r--r--core/gjs/src/gobject.ts16
-rw-r--r--core/lua/astal/widget.lua8
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