From 728b534c1092f81e2b88ddfc4e644d04cfb58796 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Wed, 18 May 2022 00:28:35 +0200 Subject: [PATCH 1/6] Support template and custom widget --- src/Previewer.js | 41 ++++++++++++++++++++++++++++++- src/demos/Custom widget/main.blp | 10 ++++++++ src/demos/Custom widget/main.js | 21 ++++++++++++++++ src/demos/Custom widget/main.json | 6 +++++ src/overrides.js | 10 ++++---- src/workbench.gresource.xml | 8 +++--- 6 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/demos/Custom widget/main.blp create mode 100644 src/demos/Custom widget/main.js create mode 100644 src/demos/Custom widget/main.json diff --git a/src/Previewer.js b/src/Previewer.js index 6588c69ea..788483906 100644 --- a/src/Previewer.js +++ b/src/Previewer.js @@ -66,15 +66,18 @@ export default function Previewer({ let text = panel_ui.xml.trim(); let target_id; let tree; + let template; try { tree = ltx.parse(text); - [target_id, text] = targetBuildable(tree); + [target_id, text, template] = targetBuildable(tree); } catch (err) { + logError(err); logger.debug(err); } if (!target_id) return; + workbench.template = template; try { assertBuildable(tree); @@ -177,6 +180,39 @@ export function scopeStylesheet(style) { return str; } +const text_encoder = new TextEncoder(); + +function getTemplate(tree) { + const original = tree.toString(); + // console.log(original); + + const template = tree.getChild("template"); + if (!template) return; + + const { parent } = template.attrs; + if (!parent) return; + + const klass = getObjectClass(parent); + if (!klass) return; + + const object = new klass(); + if (!(object instanceof Gtk.Widget)) return; + + tree.remove(template); + + const el = new ltx.Element("object", { + class: parent, + id: "workbench_target", + }); + template.children.forEach((child) => { + el.cnode(child); + }); + + tree.cnode(el); + + return [el.attrs.id, tree.toString(), text_encoder.encode(original)]; +} + function findPreviewable(tree) { for (const child of tree.getChildren("object")) { const class_name = child.attrs.class; @@ -223,6 +259,9 @@ function setChild(object, child) { } export function targetBuildable(tree) { + const template = getTemplate(tree); + if (template) return template; + const child = findPreviewable(tree); if (!child) { return [null, ""]; diff --git a/src/demos/Custom widget/main.blp b/src/demos/Custom widget/main.blp new file mode 100644 index 000000000..52cc51c9e --- /dev/null +++ b/src/demos/Custom widget/main.blp @@ -0,0 +1,10 @@ +using Gtk 4.0; + +template AwesomeWidget: Box { + Button button { + label: "Custom Widget"; + halign: center; + valign: center; + hexpand: true; + } +} diff --git a/src/demos/Custom widget/main.js b/src/demos/Custom widget/main.js new file mode 100644 index 000000000..10e28ad02 --- /dev/null +++ b/src/demos/Custom widget/main.js @@ -0,0 +1,21 @@ +import GObject from "gi://GObject"; +import Gtk from "gi://Gtk?version=4.0"; + +Gtk.init(); + +const AwesomeWidget = GObject.registerClass( + { + GTypeName: "AwesomeWidget", + Template: workbench.template, + Children: ["button"], + }, + class AwesomeWidget extends Gtk.Box { + _init(params = {}) { + super._init(params); + } + } +); + +const widget = new AwesomeWidget(); +log(widget); +log(widget.button); diff --git a/src/demos/Custom widget/main.json b/src/demos/Custom widget/main.json new file mode 100644 index 000000000..c02625ce6 --- /dev/null +++ b/src/demos/Custom widget/main.json @@ -0,0 +1,6 @@ +{ + "name": "Custom widget", + "category": "user_interface", + "description": "A custom widget using a UI template", + "panels": ["code", "ui", "preview"] +} diff --git a/src/overrides.js b/src/overrides.js index 4ff15cc66..ba7a52a6a 100644 --- a/src/overrides.js +++ b/src/overrides.js @@ -17,8 +17,8 @@ system.exit = function exit(code) { // there is no unregister equivalent to registerClass and // this is what GNOME Shell does too according to Verde // https://github.com/sonnyp/Workbench/issues/50 -const _registerClass = GObject.registerClass; -GObject.registerClass = function registerClass(klass, ...args) { - klass.GTypeName = klass.GTypeName + Math.random().toString().split("0.")[1]; - return _registerClass(klass, ...args); -}; +// const _registerClass = GObject.registerClass; +// GObject.registerClass = function registerClass(klass, ...args) { +// klass.GTypeName = klass.GTypeName + Math.random().toString().split("0.")[1]; +// return _registerClass(klass, ...args); +// }; diff --git a/src/workbench.gresource.xml b/src/workbench.gresource.xml index f67a47c1d..67ee42665 100644 --- a/src/workbench.gresource.xml +++ b/src/workbench.gresource.xml @@ -4,6 +4,11 @@ window.ui shortcutsWindow.ui style.css + demos/Application window/main.json + demos/Application window/main.blp + demos/Custom widget/main.blp + demos/Custom widget/main.js + demos/Custom widget/main.json demos/Notifications/main.js demos/Notifications/main.json demos/Notifications/main.blp @@ -21,9 +26,6 @@ demos/Welcome/main.json demos/Welcome/main.blp demos/Welcome/main.ui - demos/Application window/main.json - demos/Application window/main.blp - demos/Application window/main.ui language-specs/blueprint.lang From 80e274d8b28f62855f2c4d205a6eed7cbf21e0ed Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Sat, 21 May 2022 14:05:07 +0200 Subject: [PATCH 2/6] cool --- src/{ => Library}/demos/Custom widget/main.blp | 0 src/{ => Library}/demos/Custom widget/main.js | 0 src/{ => Library}/demos/Custom widget/main.json | 0 src/Previewer/External.js | 4 ---- src/window.js | 2 ++ 5 files changed, 2 insertions(+), 4 deletions(-) rename src/{ => Library}/demos/Custom widget/main.blp (100%) rename src/{ => Library}/demos/Custom widget/main.js (100%) rename src/{ => Library}/demos/Custom widget/main.json (100%) diff --git a/src/demos/Custom widget/main.blp b/src/Library/demos/Custom widget/main.blp similarity index 100% rename from src/demos/Custom widget/main.blp rename to src/Library/demos/Custom widget/main.blp diff --git a/src/demos/Custom widget/main.js b/src/Library/demos/Custom widget/main.js similarity index 100% rename from src/demos/Custom widget/main.js rename to src/Library/demos/Custom widget/main.js diff --git a/src/demos/Custom widget/main.json b/src/Library/demos/Custom widget/main.json similarity index 100% rename from src/demos/Custom widget/main.json rename to src/Library/demos/Custom widget/main.json diff --git a/src/Previewer/External.js b/src/Previewer/External.js index babbc3eba..a6d68966d 100644 --- a/src/Previewer/External.js +++ b/src/Previewer/External.js @@ -21,10 +21,6 @@ export default function Previewer({ builder, onWindowChange }) { })(); const dbus_proxy = DBusPreviewer(); - dbus_proxy.connectSignal("Ready", () => { - updateColorScheme(); - }); - dbus_proxy.connectSignal("WindowOpen", (proxy, name_owner, [open]) => { onWindowChange(open); }); diff --git a/src/window.js b/src/window.js index 945a92f0d..7ba8b88a4 100644 --- a/src/window.js +++ b/src/window.js @@ -365,6 +365,8 @@ export default function Window({ application }) { settings.set_boolean("has-edits", false); languages.forEach(({ document }) => document.start()); + + console.scrollToEnd(); } Library({ flap: builder.get_object("flap"), openDemo, window, application }); From 82a6cf76e0b6becbb0690c8e827b79078e7a60f2 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Sat, 21 May 2022 14:13:43 +0200 Subject: [PATCH 3/6] ok --- src/Library/demos/Custom widget/main.blp | 10 ---------- src/Library/demos/Custom widget/main.js | 21 --------------------- src/Library/demos/Custom widget/main.json | 6 ------ src/workbench.gresource.xml | 3 --- 4 files changed, 40 deletions(-) delete mode 100644 src/Library/demos/Custom widget/main.blp delete mode 100644 src/Library/demos/Custom widget/main.js delete mode 100644 src/Library/demos/Custom widget/main.json diff --git a/src/Library/demos/Custom widget/main.blp b/src/Library/demos/Custom widget/main.blp deleted file mode 100644 index 52cc51c9e..000000000 --- a/src/Library/demos/Custom widget/main.blp +++ /dev/null @@ -1,10 +0,0 @@ -using Gtk 4.0; - -template AwesomeWidget: Box { - Button button { - label: "Custom Widget"; - halign: center; - valign: center; - hexpand: true; - } -} diff --git a/src/Library/demos/Custom widget/main.js b/src/Library/demos/Custom widget/main.js deleted file mode 100644 index 10e28ad02..000000000 --- a/src/Library/demos/Custom widget/main.js +++ /dev/null @@ -1,21 +0,0 @@ -import GObject from "gi://GObject"; -import Gtk from "gi://Gtk?version=4.0"; - -Gtk.init(); - -const AwesomeWidget = GObject.registerClass( - { - GTypeName: "AwesomeWidget", - Template: workbench.template, - Children: ["button"], - }, - class AwesomeWidget extends Gtk.Box { - _init(params = {}) { - super._init(params); - } - } -); - -const widget = new AwesomeWidget(); -log(widget); -log(widget.button); diff --git a/src/Library/demos/Custom widget/main.json b/src/Library/demos/Custom widget/main.json deleted file mode 100644 index c02625ce6..000000000 --- a/src/Library/demos/Custom widget/main.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Custom widget", - "category": "user_interface", - "description": "A custom widget using a UI template", - "panels": ["code", "ui", "preview"] -} diff --git a/src/workbench.gresource.xml b/src/workbench.gresource.xml index 00cebaef7..9e269a13c 100644 --- a/src/workbench.gresource.xml +++ b/src/workbench.gresource.xml @@ -5,9 +5,6 @@ shortcutsWindow.ui style.css Library/Library.ui - Library/demos/Custom widget/main.blp - Library/demos/Custom widget/main.js - Library/demos/Custom widget/main.json Library/demos/Notifications/main.js Library/demos/Notifications/main.json Library/demos/Notifications/main.blp From 1cb11ead5eb4fb2cd32d2d3b90a8465df584803a Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Sat, 21 May 2022 14:15:19 +0200 Subject: [PATCH 4/6] ok2 --- src/Library/demos/Custom widget/main.blp | 10 ++++++++++ src/Library/demos/Custom widget/main.js | 21 +++++++++++++++++++++ src/Library/demos/Custom widget/main.json | 6 ++++++ 3 files changed, 37 insertions(+) create mode 100644 src/Library/demos/Custom widget/main.blp create mode 100644 src/Library/demos/Custom widget/main.js create mode 100644 src/Library/demos/Custom widget/main.json diff --git a/src/Library/demos/Custom widget/main.blp b/src/Library/demos/Custom widget/main.blp new file mode 100644 index 000000000..52cc51c9e --- /dev/null +++ b/src/Library/demos/Custom widget/main.blp @@ -0,0 +1,10 @@ +using Gtk 4.0; + +template AwesomeWidget: Box { + Button button { + label: "Custom Widget"; + halign: center; + valign: center; + hexpand: true; + } +} diff --git a/src/Library/demos/Custom widget/main.js b/src/Library/demos/Custom widget/main.js new file mode 100644 index 000000000..10e28ad02 --- /dev/null +++ b/src/Library/demos/Custom widget/main.js @@ -0,0 +1,21 @@ +import GObject from "gi://GObject"; +import Gtk from "gi://Gtk?version=4.0"; + +Gtk.init(); + +const AwesomeWidget = GObject.registerClass( + { + GTypeName: "AwesomeWidget", + Template: workbench.template, + Children: ["button"], + }, + class AwesomeWidget extends Gtk.Box { + _init(params = {}) { + super._init(params); + } + } +); + +const widget = new AwesomeWidget(); +log(widget); +log(widget.button); diff --git a/src/Library/demos/Custom widget/main.json b/src/Library/demos/Custom widget/main.json new file mode 100644 index 000000000..c02625ce6 --- /dev/null +++ b/src/Library/demos/Custom widget/main.json @@ -0,0 +1,6 @@ +{ + "name": "Custom widget", + "category": "user_interface", + "description": "A custom widget using a UI template", + "panels": ["code", "ui", "preview"] +} From 3f2a5c2d129a4b896a14059ec61a79cfb183e036 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Sat, 21 May 2022 14:18:22 +0200 Subject: [PATCH 5/6] foobar --- src/workbench.gresource.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/workbench.gresource.xml b/src/workbench.gresource.xml index 9e269a13c..fc2c28c85 100644 --- a/src/workbench.gresource.xml +++ b/src/workbench.gresource.xml @@ -9,6 +9,9 @@ Library/demos/Notifications/main.json Library/demos/Notifications/main.blp Library/demos/Notifications/main.ui + Library/demos/Custom widget/main.blp + Library/demos/Custom widget/main.js + Library/demos/Custom widget/main.json Library/demos/Toasts/main.js Library/demos/Toasts/main.json Library/demos/Toasts/main.blp From 7ae9f4ff4d7b0583e5d3af78b8f777f1d267c331 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Mon, 23 May 2022 00:42:56 +0200 Subject: [PATCH 6/6] remove code stuff --- src/Library/demos/Custom widget/main.blp | 10 ---------- src/Library/demos/Custom widget/main.js | 21 --------------------- src/Library/demos/Custom widget/main.json | 6 ------ src/Previewer/Previewer.js | 9 ++------- src/overrides.js | 10 +++++----- src/workbench.gresource.xml | 3 --- 6 files changed, 7 insertions(+), 52 deletions(-) delete mode 100644 src/Library/demos/Custom widget/main.blp delete mode 100644 src/Library/demos/Custom widget/main.js delete mode 100644 src/Library/demos/Custom widget/main.json diff --git a/src/Library/demos/Custom widget/main.blp b/src/Library/demos/Custom widget/main.blp deleted file mode 100644 index 52cc51c9e..000000000 --- a/src/Library/demos/Custom widget/main.blp +++ /dev/null @@ -1,10 +0,0 @@ -using Gtk 4.0; - -template AwesomeWidget: Box { - Button button { - label: "Custom Widget"; - halign: center; - valign: center; - hexpand: true; - } -} diff --git a/src/Library/demos/Custom widget/main.js b/src/Library/demos/Custom widget/main.js deleted file mode 100644 index 10e28ad02..000000000 --- a/src/Library/demos/Custom widget/main.js +++ /dev/null @@ -1,21 +0,0 @@ -import GObject from "gi://GObject"; -import Gtk from "gi://Gtk?version=4.0"; - -Gtk.init(); - -const AwesomeWidget = GObject.registerClass( - { - GTypeName: "AwesomeWidget", - Template: workbench.template, - Children: ["button"], - }, - class AwesomeWidget extends Gtk.Box { - _init(params = {}) { - super._init(params); - } - } -); - -const widget = new AwesomeWidget(); -log(widget); -log(widget.button); diff --git a/src/Library/demos/Custom widget/main.json b/src/Library/demos/Custom widget/main.json deleted file mode 100644 index c02625ce6..000000000 --- a/src/Library/demos/Custom widget/main.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Custom widget", - "category": "user_interface", - "description": "A custom widget using a UI template", - "panels": ["code", "ui", "preview"] -} diff --git a/src/Previewer/Previewer.js b/src/Previewer/Previewer.js index bd5e5f63a..28707b7df 100644 --- a/src/Previewer/Previewer.js +++ b/src/Previewer/Previewer.js @@ -94,7 +94,7 @@ export default function Previewer({ try { tree = ltx.parse(text); - [target_id, text /* template */] = targetBuildable(tree); + [target_id, text] = targetBuildable(tree); } catch (err) { logError(err); logger.debug(err); @@ -211,12 +211,7 @@ export function scopeStylesheet(style) { return str; } -const text_encoder = new TextEncoder(); - function getTemplate(tree) { - const original = tree.toString(); - // console.log(original); - const template = tree.getChild("template"); if (!template) return; @@ -241,7 +236,7 @@ function getTemplate(tree) { tree.cnode(el); - return [el.attrs.id, tree.toString(), text_encoder.encode(original)]; + return [el.attrs.id, tree.toString()]; } function findPreviewable(tree) { diff --git a/src/overrides.js b/src/overrides.js index ba7a52a6a..4ff15cc66 100644 --- a/src/overrides.js +++ b/src/overrides.js @@ -17,8 +17,8 @@ system.exit = function exit(code) { // there is no unregister equivalent to registerClass and // this is what GNOME Shell does too according to Verde // https://github.com/sonnyp/Workbench/issues/50 -// const _registerClass = GObject.registerClass; -// GObject.registerClass = function registerClass(klass, ...args) { -// klass.GTypeName = klass.GTypeName + Math.random().toString().split("0.")[1]; -// return _registerClass(klass, ...args); -// }; +const _registerClass = GObject.registerClass; +GObject.registerClass = function registerClass(klass, ...args) { + klass.GTypeName = klass.GTypeName + Math.random().toString().split("0.")[1]; + return _registerClass(klass, ...args); +}; diff --git a/src/workbench.gresource.xml b/src/workbench.gresource.xml index fc2c28c85..9e269a13c 100644 --- a/src/workbench.gresource.xml +++ b/src/workbench.gresource.xml @@ -9,9 +9,6 @@ Library/demos/Notifications/main.json Library/demos/Notifications/main.blp Library/demos/Notifications/main.ui - Library/demos/Custom widget/main.blp - Library/demos/Custom widget/main.js - Library/demos/Custom widget/main.json Library/demos/Toasts/main.js Library/demos/Toasts/main.json Library/demos/Toasts/main.blp