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:
parent
073dbc3a04
commit
ae92c1c4eb
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
122
js/dbusServices/extensions/ui/extension-error-page.ui
Normal file
122
js/dbusServices/extensions/ui/extension-error-page.ui
Normal 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">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>
|
@ -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">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">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>
|
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user