shellMountOperation: Implement new dialog design
Update the layout of the ShellMountPasswordDialog dialog according to the new dialog design: - Center-align all the elements of the dialog - Align the work-spinner to the right (or left with RTL layouts) of the password entry - Show the entry-labels as hint text of the entry See https://gitlab.gnome.org/GNOME/gnome-shell/issues/1343 https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
This commit is contained in:
parent
dc578a9e79
commit
7a1f4f9af3
@ -95,6 +95,19 @@
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-password-grid {
|
||||||
|
spacing-rows: 8px;
|
||||||
|
spacing-columns: 4px;
|
||||||
|
|
||||||
|
.prompt-dialog-password-entry {
|
||||||
|
width: auto;
|
||||||
|
|
||||||
|
// 4px (spacing) + 16px (spinner-width)
|
||||||
|
&:ltr { margin-left: 20px; }
|
||||||
|
&:rtl { margin-right: 20px; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.prompt-dialog-password-layout {
|
.prompt-dialog-password-layout {
|
||||||
spacing: 8px;
|
spacing: 8px;
|
||||||
}
|
}
|
||||||
@ -114,11 +127,6 @@
|
|||||||
color: $warning_color;
|
color: $warning_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.prompt-dialog-grid {
|
|
||||||
spacing-rows: 15px;
|
|
||||||
spacing-columns: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Polkit Dialog */
|
/* Polkit Dialog */
|
||||||
|
|
||||||
|
@ -269,21 +269,18 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
|
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
|
||||||
|
|
||||||
let content = new Dialog.MessageDialogContent({ title, description });
|
let content = new Dialog.MessageDialogContent({ title, description });
|
||||||
this.contentLayout.add_actor(content);
|
|
||||||
|
|
||||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
let passwordGridLayout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
|
let passwordGrid = new St.Widget({
|
||||||
layout_manager: layout });
|
style_class: 'prompt-dialog-password-grid',
|
||||||
layout.hookup_style(grid);
|
layout_manager: passwordGridLayout,
|
||||||
let rtl = grid.get_text_direction() === Clutter.TextDirection.RTL;
|
});
|
||||||
|
passwordGridLayout.hookup_style(passwordGrid);
|
||||||
|
|
||||||
|
let rtl = passwordGrid.get_text_direction() === Clutter.TextDirection.RTL;
|
||||||
|
let curGridRow = 0;
|
||||||
|
|
||||||
if (flags & Gio.AskPasswordFlags.TCRYPT) {
|
if (flags & Gio.AskPasswordFlags.TCRYPT) {
|
||||||
this._keyfilesLabel = new St.Label({
|
|
||||||
style_class: 'prompt-dialog-keyfiles-label',
|
|
||||||
visible: false,
|
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
|
||||||
});
|
|
||||||
|
|
||||||
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
|
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
|
||||||
content.add_child(this._hiddenVolume);
|
content.add_child(this._hiddenVolume);
|
||||||
|
|
||||||
@ -294,6 +291,7 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
this._keyfilesCheckbox.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
|
this._keyfilesCheckbox.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
|
||||||
content.add_child(this._keyfilesCheckbox);
|
content.add_child(this._keyfilesCheckbox);
|
||||||
|
|
||||||
|
this._keyfilesLabel = new St.Label({ visible: false });
|
||||||
this._keyfilesLabel.clutter_text.set_markup(
|
this._keyfilesLabel.clutter_text.set_markup(
|
||||||
/* Translators: %s is the Disks application */
|
/* Translators: %s is the Disks application */
|
||||||
_("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
|
_("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
|
||||||
@ -302,71 +300,65 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
this._keyfilesLabel.clutter_text.line_wrap = true;
|
this._keyfilesLabel.clutter_text.line_wrap = true;
|
||||||
content.add_child(this._keyfilesLabel);
|
content.add_child(this._keyfilesLabel);
|
||||||
|
|
||||||
this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
|
||||||
text: _("PIM Number"),
|
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
|
||||||
this._pimEntry = new St.PasswordEntry({
|
this._pimEntry = new St.PasswordEntry({
|
||||||
style_class: 'prompt-dialog-password-entry',
|
style_class: 'prompt-dialog-password-entry',
|
||||||
|
hint_text: _('Enter PIM Number…'),
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
});
|
});
|
||||||
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||||
ShellEntry.addContextMenu(this._pimEntry);
|
ShellEntry.addContextMenu(this._pimEntry);
|
||||||
|
|
||||||
if (rtl) {
|
if (rtl)
|
||||||
layout.attach(this._pimEntry, 0, 0, 1, 1);
|
passwordGridLayout.attach(this._pimEntry, 1, curGridRow, 1, 1);
|
||||||
layout.attach(this._pimLabel, 1, 0, 1, 1);
|
else
|
||||||
} else {
|
passwordGridLayout.attach(this._pimEntry, 0, curGridRow, 1, 1);
|
||||||
layout.attach(this._pimLabel, 0, 0, 1, 1);
|
curGridRow += 1;
|
||||||
layout.attach(this._pimEntry, 1, 0, 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._pimErrorMessageLabel = new St.Label({ style_class: 'prompt-dialog-password-entry',
|
|
||||||
text: _("The PIM must be a number or empty."),
|
|
||||||
visible: false });
|
|
||||||
layout.attach(this._pimErrorMessageLabel, 0, 2, 2, 1);
|
|
||||||
} else {
|
} else {
|
||||||
this._hiddenVolume = null;
|
this._hiddenVolume = null;
|
||||||
this._systemVolume = null;
|
this._systemVolume = null;
|
||||||
this._pimEntry = null;
|
this._pimEntry = null;
|
||||||
this._pimErrorMessageLabel = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
|
||||||
text: _("Password"),
|
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
|
||||||
this._passwordEntry = new St.PasswordEntry({
|
this._passwordEntry = new St.PasswordEntry({
|
||||||
style_class: 'prompt-dialog-password-entry',
|
style_class: 'prompt-dialog-password-entry',
|
||||||
|
hint_text: _('Enter Password…'),
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
});
|
});
|
||||||
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||||
ShellEntry.addContextMenu(this._passwordEntry);
|
|
||||||
this.setInitialKeyFocus(this._passwordEntry);
|
this.setInitialKeyFocus(this._passwordEntry);
|
||||||
|
ShellEntry.addContextMenu(this._passwordEntry);
|
||||||
|
|
||||||
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
|
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
|
||||||
animate: true,
|
animate: true,
|
||||||
});
|
});
|
||||||
this._passwordEntry.secondary_icon = this._workSpinner;
|
|
||||||
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
|
|
||||||
|
|
||||||
if (rtl) {
|
if (rtl) {
|
||||||
layout.attach(this._passwordEntry, 0, 1, 1, 1);
|
passwordGridLayout.attach(this._workSpinner, 0, curGridRow, 1, 1);
|
||||||
layout.attach(this._passwordLabel, 1, 1, 1, 1);
|
passwordGridLayout.attach(this._passwordEntry, 1, curGridRow, 1, 1);
|
||||||
layout.attach(this._capsLockWarningLabel, 0, 2, 1, 1);
|
|
||||||
} else {
|
} else {
|
||||||
layout.attach(this._passwordLabel, 0, 1, 1, 1);
|
passwordGridLayout.attach(this._passwordEntry, 0, curGridRow, 1, 1);
|
||||||
layout.attach(this._passwordEntry, 1, 1, 1, 1);
|
passwordGridLayout.attach(this._workSpinner, 1, curGridRow, 1, 1);
|
||||||
layout.attach(this._capsLockWarningLabel, 1, 2, 1, 1);
|
|
||||||
}
|
}
|
||||||
|
curGridRow += 1;
|
||||||
|
|
||||||
content.add_child(grid);
|
let warningBox = new St.BoxLayout({ vertical: true });
|
||||||
|
|
||||||
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
|
let capsLockWarning = new ShellEntry.CapsLockWarning();
|
||||||
text: _("Sorry, that didn’t work. Please try again.") });
|
warningBox.add_child(capsLockWarning);
|
||||||
|
|
||||||
|
this._errorMessageLabel = new St.Label({
|
||||||
|
style_class: 'prompt-dialog-error-label',
|
||||||
|
opacity: 0,
|
||||||
|
});
|
||||||
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._errorMessageLabel.clutter_text.line_wrap = true;
|
this._errorMessageLabel.clutter_text.line_wrap = true;
|
||||||
this._errorMessageLabel.hide();
|
warningBox.add_child(this._errorMessageLabel);
|
||||||
content.add_child(this._errorMessageLabel);
|
|
||||||
|
passwordGridLayout.attach(warningBox, 0, curGridRow, 2, 1);
|
||||||
|
|
||||||
|
content.add_child(passwordGrid);
|
||||||
|
|
||||||
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
|
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
|
||||||
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
|
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
|
||||||
@ -377,6 +369,8 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
this._rememberChoice = null;
|
this._rememberChoice = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.contentLayout.add_child(content);
|
||||||
|
|
||||||
this._defaultButtons = [{
|
this._defaultButtons = [{
|
||||||
label: _("Cancel"),
|
label: _("Cancel"),
|
||||||
action: this._onCancelButton.bind(this),
|
action: this._onCancelButton.bind(this),
|
||||||
@ -402,9 +396,10 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
reaskPassword() {
|
reaskPassword() {
|
||||||
this._passwordEntry.set_text('');
|
|
||||||
this._errorMessageLabel.show();
|
|
||||||
this._workSpinner.stop();
|
this._workSpinner.stop();
|
||||||
|
this._passwordEntry.set_text('');
|
||||||
|
this._errorMessageLabel.text = _('Sorry, that didn’t work. Please try again.');
|
||||||
|
this._errorMessageLabel.opacity = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onCancelButton() {
|
_onCancelButton() {
|
||||||
@ -417,14 +412,17 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
|
|
||||||
_onEntryActivate() {
|
_onEntryActivate() {
|
||||||
let pim = 0;
|
let pim = 0;
|
||||||
if (this._pimEntry !== null)
|
if (this._pimEntry !== null) {
|
||||||
pim = this._pimEntry.get_text();
|
pim = this._pimEntry.get_text();
|
||||||
if (isNaN(pim)) {
|
|
||||||
this._pimEntry.set_text('');
|
if (isNaN(pim)) {
|
||||||
this._pimErrorMessageLabel.show();
|
this._pimEntry.set_text('');
|
||||||
return;
|
this._errorMessageLabel.text = _('The PIM must be a number or empty.');
|
||||||
} else if (this._pimErrorMessageLabel !== null) {
|
this._errorMessageLabel.opacity = 255;
|
||||||
this._pimErrorMessageLabel.hide();
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._errorMessageLabel.opacity = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
|
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
|
||||||
|
Loading…
Reference in New Issue
Block a user