[gjs/ewlsh/bind-property-fields] Add API to bind class fields to GObject properties




commit 762ccf8fbaa57918e050aae2479aa566642c2be0
Author: Evan Welsh <contact evanwelsh com>
Date:   Thu Dec 30 12:16:01 2021 -0800

    Add API to bind class fields to GObject properties

 modules/core/_common.js           |  2 +-
 modules/core/overrides/GObject.js | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)
---
diff --git a/modules/core/_common.js b/modules/core/_common.js
index 780483b9..b36d5a80 100644
--- a/modules/core/_common.js
+++ b/modules/core/_common.js
@@ -81,7 +81,7 @@ function _checkAccessors(proto, pspec, GObject, {generateAccessors = true, acces
     const readable = flags & GObject.ParamFlags.READABLE;
     const writable = flags & GObject.ParamFlags.WRITABLE;
     if (!propdesc || (readable && !propdesc.get) || (writable && !propdesc.set))
-        propdesc = _generateAccessors(pspec, propdesc, GObject);
+        propdesc = _generateAccessors(pspec, propdesc, GObject, accessorMappingSymbol);
 
     if (generateAccessors) {
         if (!dashPropdesc)
diff --git a/modules/core/overrides/GObject.js b/modules/core/overrides/GObject.js
index 1b5fccdc..a29c098e 100644
--- a/modules/core/overrides/GObject.js
+++ b/modules/core/overrides/GObject.js
@@ -573,6 +573,25 @@ function _init() {
     const {toString} = GObject.Object.prototype;
 
     Object.assign(GObject.Object.prototype, {
+        bindPropertyFields() {
+            const accessorMap = this.constructor.prototype[_accessorMapping];
+
+            if (!accessorMap)
+                return;
+
+            Object.entries(accessorMap).forEach(([key, accessor]) => {
+                const descriptor = Object.getOwnPropertyDescriptor(this, key);
+
+                if (descriptor && 'value' in descriptor) {
+                    const value = descriptor.value;
+
+                    Object.defineProperty(this, key, accessor);
+                    // Don't override the default value with undefined
+                    if (value !== undefined)
+                        this[key] = value;
+                }
+            });
+        },
         toString() {
             if (!this.constructor)
                 return Object.prototype.toString.call(this);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]