[gnome-shell] dbusServices/extensions: Split error page from window



commit ae92c1c4eb07ea34feb9a962119d08c3fc1fb130
Author: Florian Müllner <fmuellner gnome org>
Date:   Fri Jul 30 00:26:05 2021 +0200

    dbusServices/extensions: Split error page from window
    
    The error UI comprises the bits that are actually custom. Splitting them
    out from the off-the-shelf window makes it easier to replace the dialog
    with libadwaita's dedicated preference window.
    
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2012>

 js/dbusServices/extensions/extensionPrefsDialog.js |  88 +++++++-------
 .../extensions/ui/extension-error-page.ui          | 122 +++++++++++++++++++
 .../extensions/ui/extension-prefs-dialog.ui        | 131 ---------------------
 .../org.gnome.Shell.Extensions.src.gresource.xml   |   2 +-
 4 files changed, 169 insertions(+), 174 deletions(-)
---
diff --git a/js/dbusServices/extensions/extensionPrefsDialog.js 
b/js/dbusServices/extensions/extensionPrefsDialog.js
index f9d533a8bb..8fa6a533b2 100644
--- a/js/dbusServices/extensions/extensionPrefsDialog.js
+++ b/js/dbusServices/extensions/extensionPrefsDialog.js
@@ -7,25 +7,53 @@ const ExtensionUtils = imports.misc.extensionUtils;
 
 var ExtensionPrefsDialog = GObject.registerClass({
     GTypeName: 'ExtensionPrefsDialog',
-    Template: 'resource:///org/gnome/Shell/Extensions/ui/extension-prefs-dialog.ui',
+}, class ExtensionPrefsDialog extends Gtk.Window {
+    _init(extension) {
+        super._init({
+            title: extension.metadata.name,
+            default_width: 600,
+            default_height: 400,
+        });
+        this.set_titlebar(new Gtk.HeaderBar());
+
+        try {
+            ExtensionUtils.installImporter(extension);
+
+            // give extension prefs access to their own extension object
+            ExtensionUtils.getCurrentExtension = () => extension;
+
+            const prefsModule = extension.imports.prefs;
+            prefsModule.init(extension.metadata);
+
+            const widget = prefsModule.buildPrefsWidget();
+            this.set_child(widget);
+        } catch (e) {
+            this.set_child(new ExtensionPrefsErrorPage(extension, e));
+            logError(e, 'Failed to open preferences');
+        }
+    }
+});
+
+const ExtensionPrefsErrorPage = GObject.registerClass({
+    GTypeName: 'ExtensionPrefsErrorPage',
+    Template: 'resource:///org/gnome/Shell/Extensions/ui/extension-error-page.ui',
     InternalChildren: [
-        'stack',
         'expander',
         'expanderArrow',
         'revealer',
         'errorView',
     ],
-}, class ExtensionPrefsDialog extends Gtk.Window {
-    _init(extension) {
+}, class ExtensionPrefsErrorPage extends Gtk.Widget {
+    _init(extension, error) {
         super._init({
-            title: extension.metadata.name,
+            layout_manager: new Gtk.BinLayout(),
         });
 
         this._uuid = extension.uuid;
         this._url = extension.metadata.url || '';
 
         this._actionGroup = new Gio.SimpleActionGroup();
-        this.insert_action_group('win', this._actionGroup);
+        this.insert_action_group('page', this._actionGroup);
 
         this._initActions();
         this._addCustomStylesheet();
@@ -50,61 +78,38 @@ var ExtensionPrefsDialog = GObject.registerClass({
         this._revealer.connect('notify::child-revealed',
             () => this._syncExpandedStyle());
 
-        try {
-            ExtensionUtils.installImporter(extension);
-
-            // give extension prefs access to their own extension object
-            ExtensionUtils.getCurrentExtension = () => extension;
-
-            const prefsModule = extension.imports.prefs;
-            prefsModule.init(extension.metadata);
-
-            const widget = prefsModule.buildPrefsWidget();
-            this._stack.add_named(widget, 'prefs');
-            this._stack.visible_child = widget;
-        } catch (e) {
-            this._setError(e);
-            logError(e, 'Failed to open preferences');
-        }
-    }
-
-    _syncExpandedStyle() {
-        if (this._revealer.reveal_child)
-            this._expander.add_css_class('expanded');
-        else if (!this._revealer.child_revealed)
-            this._expander.remove_css_class('expanded');
-    }
-
-    _setError(exc) {
-        this._errorView.buffer.text = `${exc}\n\nStack trace:\n`;
+        this._errorView.buffer.text = `${error}\n\nStack trace:\n`;
         // Indent stack trace.
         this._errorView.buffer.text +=
-            exc.stack.split('\n').map(line => `  ${line}`).join('\n');
+            error.stack.split('\n').map(line => `  ${line}`).join('\n');
 
         // markdown for pasting in gitlab issues
         let lines = [
             `The settings of extension ${this._uuid} had an error:`,
             '```',
-            `${exc}`,
+            `${error}`,
             '```',
             '',
             'Stack trace:',
             '```',
-            exc.stack.replace(/\n$/, ''), // stack without trailing newline
+            error.stack.replace(/\n$/, ''), // stack without trailing newline
             '```',
             '',
         ];
         this._errorMarkdown = lines.join('\n');
-        this._actionGroup.lookup('copy-error').enabled = true;
+    }
+
+    _syncExpandedStyle() {
+        if (this._revealer.reveal_child)
+            this._expander.add_css_class('expanded');
+        else if (!this._revealer.child_revealed)
+            this._expander.remove_css_class('expanded');
     }
 
     _initActions() {
         let action;
 
-        action = new Gio.SimpleAction({
-            name: 'copy-error',
-            enabled: false,
-        });
+        action = new Gio.SimpleAction({ name: 'copy-error' });
         action.connect('activate', () => {
             const clipboard = this.get_display().get_clipboard();
             clipboard.set(this._errorMarkdown);
@@ -135,4 +140,3 @@ var ExtensionPrefsDialog = GObject.registerClass({
             Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
     }
 });
-
diff --git a/js/dbusServices/extensions/ui/extension-error-page.ui 
b/js/dbusServices/extensions/ui/extension-error-page.ui
new file mode 100644
index 0000000000..eb0a044cc8
--- /dev/null
+++ b/js/dbusServices/extensions/ui/extension-error-page.ui
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <template class="ExtensionPrefsErrorPage" parent="GtkWidget">
+    <child>
+      <object class="GtkScrolledWindow">
+        <property name="hscrollbar-policy">never</property>
+        <property name="propagate-natural-height">True</property>
+        <child>
+          <object class="GtkViewport">
+            <child>
+              <object class="GtkBox">
+                <property name="orientation">vertical</property>
+                <property name="margin-start">100</property>
+                <property name="margin-end">100</property>
+                <property name="margin-top">100</property>
+                <property name="margin-bottom">60</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="label" translatable="yes">Something’s gone wrong</property>
+                    <attributes>
+                      <attribute name="scale" value="1.44"/> <!-- x-large -->
+                    </attributes>
+                    <style>
+                      <class name="dim-label"/>
+                    </style>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="label" translatable="yes">We’re very sorry, but there’s been a problem: 
the settings for this extension can’t be displayed. We recommend that you report the issue to the extension 
authors.</property>
+                    <property name="justify">center</property>
+                    <property name="wrap">True</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkFrame">
+                    <property name="margin-top">12</property>
+                    <child>
+                      <object class="GtkBox">
+                        <property name="hexpand">True</property>
+                        <property name="orientation">vertical</property>
+                        <child>
+                          <object class="GtkBox" id="expander">
+                            <property name="spacing">6</property>
+                            <style>
+                              <class name="expander"/>
+                            </style>
+                            <child>
+                              <object class="GtkImage" id="expanderArrow">
+                                <property name="icon-name">pan-end-symbolic</property>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="label" translatable="yes">Technical Details</property>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRevealer" id="revealer">
+                            <child>
+                              <object class="GtkBox">
+                                <property name="orientation">vertical</property>
+                                <child>
+                                  <object class="GtkTextView" id="errorView">
+                                    <property name="monospace">True</property>
+                                    <property name="editable">False</property>
+                                    <property name="wrap-mode">word</property>
+                                    <property name="left-margin">12</property>
+                                    <property name="right-margin">12</property>
+                                    <property name="top-margin">12</property>
+                                    <property name="bottom-margin">12</property>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkBox">
+                                    <style>
+                                      <class name="expander-toolbar"/>
+                                    </style>
+                                    <child>
+                                      <object class="GtkButton">
+                                        <property name="receives-default">True</property>
+                                        <property name="action-name">page.copy-error</property>
+                                        <property name="has-frame">False</property>
+                                        <property name="icon-name">edit-copy-symbolic</property>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="homeButton">
+                                        <property name="visible"
+                                                  bind-source="homeButton"
+                                                  bind-property="sensitive"
+                                                  bind-flags="sync-create"/>
+                                        <property name="hexpand">True</property>
+                                        <property name="halign">end</property>
+                                        <property name="label" translatable="yes">Homepage</property>
+                                        <property name="tooltip-text" translatable="yes">Visit extension 
homepage</property>
+                                        <property name="receives-default">True</property>
+                                        <property name="has-frame">False</property>
+                                        <property name="action-name">page.show-url</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/js/dbusServices/org.gnome.Shell.Extensions.src.gresource.xml 
b/js/dbusServices/org.gnome.Shell.Extensions.src.gresource.xml
index bca8c75ecb..c3b81cfc21 100644
--- a/js/dbusServices/org.gnome.Shell.Extensions.src.gresource.xml
+++ b/js/dbusServices/org.gnome.Shell.Extensions.src.gresource.xml
@@ -14,6 +14,6 @@
 
   <gresource prefix="/org/gnome/Shell/Extensions">
     <file>css/application.css</file>
-    <file>ui/extension-prefs-dialog.ui</file>
+    <file>ui/extension-error-page.ui</file>
   </gresource>
 </gresources>


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