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>
This commit is contained in:
Florian Müllner 2021-07-30 00:26:05 +02:00 committed by Marge Bot
parent 073dbc3a04
commit ae92c1c4eb
4 changed files with 176 additions and 181 deletions

View File

@ -7,25 +7,53 @@ const ExtensionUtils = imports.misc.extensionUtils;
var ExtensionPrefsDialog = GObject.registerClass({ var ExtensionPrefsDialog = GObject.registerClass({
GTypeName: 'ExtensionPrefsDialog', 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: [ InternalChildren: [
'stack',
'expander', 'expander',
'expanderArrow', 'expanderArrow',
'revealer', 'revealer',
'errorView', 'errorView',
], ],
}, class ExtensionPrefsDialog extends Gtk.Window { }, class ExtensionPrefsErrorPage extends Gtk.Widget {
_init(extension) { _init(extension, error) {
super._init({ super._init({
title: extension.metadata.name, layout_manager: new Gtk.BinLayout(),
}); });
this._uuid = extension.uuid; this._uuid = extension.uuid;
this._url = extension.metadata.url || ''; this._url = extension.metadata.url || '';
this._actionGroup = new Gio.SimpleActionGroup(); this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('win', this._actionGroup); this.insert_action_group('page', this._actionGroup);
this._initActions(); this._initActions();
this._addCustomStylesheet(); this._addCustomStylesheet();
@ -50,22 +78,25 @@ var ExtensionPrefsDialog = GObject.registerClass({
this._revealer.connect('notify::child-revealed', this._revealer.connect('notify::child-revealed',
() => this._syncExpandedStyle()); () => this._syncExpandedStyle());
try { this._errorView.buffer.text = `${error}\n\nStack trace:\n`;
ExtensionUtils.installImporter(extension); // Indent stack trace.
this._errorView.buffer.text +=
error.stack.split('\n').map(line => ` ${line}`).join('\n');
// give extension prefs access to their own extension object // markdown for pasting in gitlab issues
ExtensionUtils.getCurrentExtension = () => extension; let lines = [
`The settings of extension ${this._uuid} had an error:`,
const prefsModule = extension.imports.prefs; '```',
prefsModule.init(extension.metadata); `${error}`,
'```',
const widget = prefsModule.buildPrefsWidget(); '',
this._stack.add_named(widget, 'prefs'); 'Stack trace:',
this._stack.visible_child = widget; '```',
} catch (e) { error.stack.replace(/\n$/, ''), // stack without trailing newline
this._setError(e); '```',
logError(e, 'Failed to open preferences'); '',
} ];
this._errorMarkdown = lines.join('\n');
} }
_syncExpandedStyle() { _syncExpandedStyle() {
@ -75,36 +106,10 @@ var ExtensionPrefsDialog = GObject.registerClass({
this._expander.remove_css_class('expanded'); this._expander.remove_css_class('expanded');
} }
_setError(exc) {
this._errorView.buffer.text = `${exc}\n\nStack trace:\n`;
// Indent stack trace.
this._errorView.buffer.text +=
exc.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}`,
'```',
'',
'Stack trace:',
'```',
exc.stack.replace(/\n$/, ''), // stack without trailing newline
'```',
'',
];
this._errorMarkdown = lines.join('\n');
this._actionGroup.lookup('copy-error').enabled = true;
}
_initActions() { _initActions() {
let action; let action;
action = new Gio.SimpleAction({ action = new Gio.SimpleAction({ name: 'copy-error' });
name: 'copy-error',
enabled: false,
});
action.connect('activate', () => { action.connect('activate', () => {
const clipboard = this.get_display().get_clipboard(); const clipboard = this.get_display().get_clipboard();
clipboard.set(this._errorMarkdown); clipboard.set(this._errorMarkdown);
@ -135,4 +140,3 @@ var ExtensionPrefsDialog = GObject.registerClass({
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
} }
}); });

View File

@ -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">Somethings 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">Were very sorry, but theres been a problem: the settings for this extension cant 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>

View File

@ -1,131 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="ExtensionPrefsDialog" parent="GtkWindow">
<property name="default-width">600</property>
<property name="default-height">400</property>
<child type="titlebar">
<object class="GtkHeaderBar"/>
</child>
<child>
<object class="GtkStack" id="stack">
<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">Somethings 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">Were very sorry, but theres been a problem: the settings for this extension cant 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">win.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">win.show-url</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</template>
</interface>

View File

@ -14,6 +14,6 @@
<gresource prefix="/org/gnome/Shell/Extensions"> <gresource prefix="/org/gnome/Shell/Extensions">
<file>css/application.css</file> <file>css/application.css</file>
<file>ui/extension-prefs-dialog.ui</file> <file>ui/extension-error-page.ui</file>
</gresource> </gresource>
</gresources> </gresources>