diff --git a/js/extensionPrefs/main.js b/js/extensionPrefs/main.js
index 4a8ace085..10f022c0b 100644
--- a/js/extensionPrefs/main.js
+++ b/js/extensionPrefs/main.js
@@ -3,7 +3,7 @@ imports.gi.versions.Gdk = '3.0';
imports.gi.versions.Gtk = '3.0';
const Gettext = imports.gettext;
-const { Gdk, GLib, Gio, GObject, Gtk, Pango } = imports.gi;
+const { Gdk, GLib, Gio, GObject, Gtk } = imports.gi;
const Format = imports.format;
const _ = Gettext.gettext;
@@ -471,8 +471,18 @@ var Expander = GObject.registerClass({
}
});
-var ExtensionRow = GObject.registerClass(
-class ExtensionRow extends Gtk.ListBoxRow {
+var ExtensionRow = GObject.registerClass({
+ GTypeName: 'ExtensionRow',
+ Template: 'resource:///org/gnome/shell/ui/extension-row.ui',
+ Children: [
+ 'prefsButton',
+ ],
+ InternalChildren: [
+ 'nameLabel',
+ 'descriptionLabel',
+ 'switch',
+ ],
+}, class ExtensionRow extends Gtk.ListBoxRow {
_init(extension) {
super._init();
@@ -480,9 +490,23 @@ class ExtensionRow extends Gtk.ListBoxRow {
this._extension = extension;
this._prefsModule = null;
- this.connect('destroy', this._onDestroy.bind(this));
+ let name = GLib.markup_escape_text(this.name, -1);
+ this._nameLabel.label = name;
- this._buildUI();
+ let desc = this._extension.metadata.description.split('\n')[0];
+ this._descriptionLabel.label = desc;
+
+ this.prefsButton.visible = this.hasPrefs;
+
+ this._notifyActiveId = this._switch.connect('notify::active', () => {
+ if (this._switch.active)
+ this._app.shellProxy.EnableExtensionRemote(this.uuid);
+ else
+ this._app.shellProxy.DisableExtensionRemote(this.uuid);
+ });
+ this._switch.connect('state-set', () => true);
+
+ this.connect('destroy', this._onDestroy.bind(this));
this._extensionStateChangedId = this._app.shellProxy.connectSignal(
'ExtensionStateChanged', (p, sender, [uuid, newState]) => {
@@ -490,14 +514,9 @@ class ExtensionRow extends Gtk.ListBoxRow {
return;
this._extension = ExtensionUtils.deserializeExtension(newState);
- let state = this._extension.state == ExtensionState.ENABLED;
-
- this._switch.block_signal_handler(this._notifyActiveId);
- this._switch.state = state;
- this._switch.unblock_signal_handler(this._notifyActiveId);
-
- this._switch.sensitive = this._canToggle();
+ this._updateState();
});
+ this._updateState();
}
get uuid() {
@@ -516,6 +535,16 @@ class ExtensionRow extends Gtk.ListBoxRow {
return this._extension.metadata.url;
}
+ _updateState() {
+ let state = this._extension.state === ExtensionState.ENABLED;
+
+ this._switch.block_signal_handler(this._notifyActiveId);
+ this._switch.state = state;
+ this._switch.unblock_signal_handler(this._notifyActiveId);
+
+ this._switch.sensitive = this._canToggle();
+ }
+
_onDestroy() {
if (!this._app.shellProxy)
return;
@@ -525,58 +554,6 @@ class ExtensionRow extends Gtk.ListBoxRow {
this._extensionStateChangedId = 0;
}
- _buildUI() {
- let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
- hexpand: true, margin_end: 24, spacing: 24,
- margin: 12 });
- this.add(hbox);
-
- let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
- spacing: 6, hexpand: true });
- hbox.add(vbox);
-
- let name = GLib.markup_escape_text(this.name, -1);
- let label = new Gtk.Label({ label: '' + name + '',
- use_markup: true,
- halign: Gtk.Align.START });
- vbox.add(label);
-
- let desc = this._extension.metadata.description.split('\n')[0];
- label = new Gtk.Label({
- label: desc,
- ellipsize: Pango.EllipsizeMode.END,
- max_width_chars: 60,
- xalign: 0,
- yalign: 0,
- });
- vbox.add(label);
-
- let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
- visible: this.hasPrefs,
- no_show_all: true });
- button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
- icon_size: Gtk.IconSize.BUTTON,
- visible: true }));
- button.get_style_context().add_class('circular');
- hbox.add(button);
-
- this.prefsButton = button;
-
- this._switch = new Gtk.Switch({
- valign: Gtk.Align.CENTER,
- sensitive: this._canToggle(),
- state: this._extension.state === ExtensionState.ENABLED,
- });
- this._notifyActiveId = this._switch.connect('notify::active', () => {
- if (this._switch.active)
- this._app.shellProxy.EnableExtensionRemote(this.uuid);
- else
- this._app.shellProxy.DisableExtensionRemote(this.uuid);
- });
- this._switch.connect('state-set', () => true);
- hbox.add(this._switch);
- }
-
_canToggle() {
return this._extension.canChange;
}
diff --git a/js/extensionPrefs/ui/extension-row.ui b/js/extensionPrefs/ui/extension-row.ui
new file mode 100644
index 000000000..6f50f9add
--- /dev/null
+++ b/js/extensionPrefs/ui/extension-row.ui
@@ -0,0 +1,74 @@
+
+
+
+
+
+ True
+ False
+
+
+
+
+
diff --git a/js/prefs-resources.gresource.xml b/js/prefs-resources.gresource.xml
index 20f966aa8..193d305d0 100644
--- a/js/prefs-resources.gresource.xml
+++ b/js/prefs-resources.gresource.xml
@@ -8,6 +8,7 @@
misc/fileUtils.js
misc/params.js
+ extensionPrefs/ui/extension-row.ui
extensionPrefs/ui/extensions-window.ui