Add initial replacement account server details pane.
This commit is contained in:
parent
b289170c1a
commit
688040663a
8 changed files with 594 additions and 3 deletions
|
|
@ -21,6 +21,7 @@ src/client/accounts/accounts-editor.vala
|
||||||
src/client/accounts/accounts-editor-edit-pane.vala
|
src/client/accounts/accounts-editor-edit-pane.vala
|
||||||
src/client/accounts/accounts-editor-remove-pane.vala
|
src/client/accounts/accounts-editor-remove-pane.vala
|
||||||
src/client/accounts/accounts-editor-row.vala
|
src/client/accounts/accounts-editor-row.vala
|
||||||
|
src/client/accounts/accounts-editor-servers-pane.vala
|
||||||
src/client/accounts/add-edit-page.vala
|
src/client/accounts/add-edit-page.vala
|
||||||
src/client/accounts/editor.vala
|
src/client/accounts/editor.vala
|
||||||
src/client/accounts/goa-service-information.vala
|
src/client/accounts/goa-service-information.vala
|
||||||
|
|
@ -413,6 +414,7 @@ ui/account_spinner.glade
|
||||||
ui/accounts_editor.ui
|
ui/accounts_editor.ui
|
||||||
ui/accounts_editor_edit_pane.ui
|
ui/accounts_editor_edit_pane.ui
|
||||||
ui/accounts_editor_remove_pane.ui
|
ui/accounts_editor_remove_pane.ui
|
||||||
|
ui/accounts_editor_servers_pane.ui
|
||||||
ui/certificate_warning_dialog.glade
|
ui/certificate_warning_dialog.glade
|
||||||
ui/composer-headerbar.ui
|
ui/composer-headerbar.ui
|
||||||
ui/composer-link-popover.ui
|
ui/composer-link-popover.ui
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ public class Accounts.EditorEditPane : Gtk.Grid {
|
||||||
|
|
||||||
[GtkCallback]
|
[GtkCallback]
|
||||||
private void on_server_settings_clicked() {
|
private void on_server_settings_clicked() {
|
||||||
|
this.editor.push(new EditorServersPane(this.editor, this.account));
|
||||||
}
|
}
|
||||||
|
|
||||||
[GtkCallback]
|
[GtkCallback]
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ internal class Accounts.AddRow : EditorRow {
|
||||||
|
|
||||||
|
|
||||||
public AddRow() {
|
public AddRow() {
|
||||||
|
get_style_context().add_class("geary-add-row");
|
||||||
Gtk.Image add_icon = new Gtk.Image.from_icon_name(
|
Gtk.Image add_icon = new Gtk.Image.from_icon_name(
|
||||||
"list-add-symbolic", Gtk.IconSize.BUTTON
|
"list-add-symbolic", Gtk.IconSize.BUTTON
|
||||||
);
|
);
|
||||||
|
|
|
||||||
413
src/client/accounts/accounts-editor-servers-pane.vala
Normal file
413
src/client/accounts/accounts-editor-servers-pane.vala
Normal file
|
|
@ -0,0 +1,413 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2016 Software Freedom Conservancy Inc.
|
||||||
|
* Copyright 2018 Michael Gratton <mike@vee.net>
|
||||||
|
*
|
||||||
|
* This software is licensed under the GNU Lesser General Public License
|
||||||
|
* (version 2.1 or later). See the COPYING file in this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main account editor window.
|
||||||
|
*/
|
||||||
|
[GtkTemplate (ui = "/org/gnome/Geary/accounts_editor_servers_pane.ui")]
|
||||||
|
public class Accounts.EditorServersPane : Gtk.Grid {
|
||||||
|
|
||||||
|
|
||||||
|
private weak Editor editor; // circular ref
|
||||||
|
private Geary.AccountInformation account;
|
||||||
|
|
||||||
|
[GtkChild]
|
||||||
|
private Gtk.ListBox details_list;
|
||||||
|
|
||||||
|
[GtkChild]
|
||||||
|
private Gtk.ListBox receiving_list;
|
||||||
|
|
||||||
|
[GtkChild]
|
||||||
|
private Gtk.ListBox sending_list;
|
||||||
|
|
||||||
|
|
||||||
|
public EditorServersPane(Editor editor, Geary.AccountInformation account) {
|
||||||
|
this.editor = editor;
|
||||||
|
this.account = account;
|
||||||
|
|
||||||
|
this.details_list.set_header_func(Editor.seperator_headers);
|
||||||
|
this.details_list.add(new ServiceProviderRow(this.account));
|
||||||
|
// Only add an account provider if it is esoteric enough.
|
||||||
|
if (this.account.imap.mediator is GoaMediator) {
|
||||||
|
this.details_list.add(new AccountProviderRow(this.account));
|
||||||
|
}
|
||||||
|
this.details_list.add(new EmailPrefetchRow(this.account));
|
||||||
|
this.details_list.add(new SaveDraftsRow(this.account));
|
||||||
|
|
||||||
|
this.receiving_list.set_header_func(Editor.seperator_headers);
|
||||||
|
build_service(account.imap, this.receiving_list);
|
||||||
|
|
||||||
|
this.sending_list.set_header_func(Editor.seperator_headers);
|
||||||
|
build_service(account.smtp, this.sending_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void build_service(Geary.ServiceInformation service,
|
||||||
|
Gtk.ListBox settings_list) {
|
||||||
|
settings_list.add(new ServiceHostRow(this.account, service));
|
||||||
|
settings_list.add(new ServiceSecurityRow(this.account, service));
|
||||||
|
settings_list.add(new ServiceAuthRow(this.account, service));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private abstract class Accounts.ServerAccountRow<V> : LabelledEditorRow {
|
||||||
|
|
||||||
|
|
||||||
|
protected Geary.AccountInformation account;
|
||||||
|
|
||||||
|
protected V value;
|
||||||
|
|
||||||
|
|
||||||
|
public ServerAccountRow(Geary.AccountInformation account,
|
||||||
|
string label,
|
||||||
|
V value) {
|
||||||
|
base(label);
|
||||||
|
this.account = account;
|
||||||
|
|
||||||
|
set_dim_label(true);
|
||||||
|
|
||||||
|
this.value = value;
|
||||||
|
|
||||||
|
Gtk.Widget? widget = value as Gtk.Widget;
|
||||||
|
if (widget != null) {
|
||||||
|
widget.valign = Gtk.Align.CENTER;
|
||||||
|
widget.show();
|
||||||
|
this.layout.add(widget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void update();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class Accounts.ServiceProviderRow : ServerAccountRow<Gtk.Label> {
|
||||||
|
|
||||||
|
|
||||||
|
public ServiceProviderRow(Geary.AccountInformation account) {
|
||||||
|
base(
|
||||||
|
account,
|
||||||
|
// Translators: This label describes service hosting the
|
||||||
|
// email account, e.g. GMail, Yahoo, Outlook.com, or some
|
||||||
|
// other generic IMAP service.
|
||||||
|
_("Service provider"),
|
||||||
|
new Gtk.Label("")
|
||||||
|
);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update() {
|
||||||
|
string? details = this.account.service_label;
|
||||||
|
switch (this.account.service_provider) {
|
||||||
|
case Geary.ServiceProvider.GMAIL:
|
||||||
|
details = _("GMail");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Geary.ServiceProvider.OUTLOOK:
|
||||||
|
details = _("Outlook.com");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Geary.ServiceProvider.YAHOO:
|
||||||
|
details = _("Yahoo");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this.value.set_text(details);
|
||||||
|
// Can't change this, so dim it out
|
||||||
|
this.value.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class Accounts.AccountProviderRow : ServerAccountRow<Gtk.Label> {
|
||||||
|
|
||||||
|
|
||||||
|
public AccountProviderRow(Geary.AccountInformation account) {
|
||||||
|
base(
|
||||||
|
account,
|
||||||
|
// Translators: This label describes the program that
|
||||||
|
// created the account, e.g. an SSO service like GOA, or
|
||||||
|
// locally by Geary.
|
||||||
|
_("Account source"),
|
||||||
|
new Gtk.Label("")
|
||||||
|
);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update() {
|
||||||
|
string? source = null;
|
||||||
|
if (this.account.imap.mediator is GoaMediator) {
|
||||||
|
source = _("GNOME Online Accounts");
|
||||||
|
} else {
|
||||||
|
source = _("Geary");
|
||||||
|
}
|
||||||
|
this.value.set_text(source);
|
||||||
|
// Can't change this, so dim it out
|
||||||
|
this.value.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class Accounts.SaveDraftsRow : ServerAccountRow<Gtk.Switch> {
|
||||||
|
|
||||||
|
|
||||||
|
public SaveDraftsRow(Geary.AccountInformation account) {
|
||||||
|
base(
|
||||||
|
account,
|
||||||
|
// Translators: This label describes an account
|
||||||
|
// preference.
|
||||||
|
_("Save drafts on server"),
|
||||||
|
new Gtk.Switch()
|
||||||
|
);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update() {
|
||||||
|
this.value.state = this.account.save_drafts;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class Accounts.EmailPrefetchRow : ServerAccountRow<Gtk.ComboBoxText> {
|
||||||
|
|
||||||
|
|
||||||
|
private static bool row_separator(Gtk.TreeModel model, Gtk.TreeIter iter) {
|
||||||
|
GLib.Value v;
|
||||||
|
model.get_value(iter, 0, out v);
|
||||||
|
return v.get_string() == ".";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public EmailPrefetchRow(Geary.AccountInformation account) {
|
||||||
|
Gtk.ComboBoxText combo = new Gtk.ComboBoxText();
|
||||||
|
combo.set_row_separator_func(row_separator);
|
||||||
|
combo.append("14", _("2 weeks back")); // IDs are # of days
|
||||||
|
combo.append("30", _("1 month back"));
|
||||||
|
combo.append("90", _("3 months back"));
|
||||||
|
combo.append("180", _("6 months back"));
|
||||||
|
combo.append("365", _("1 year back"));
|
||||||
|
combo.append("730", _("2 years back"));
|
||||||
|
combo.append("1461", _("4 years back"));
|
||||||
|
combo.append(".", "."); // Separator
|
||||||
|
combo.append("-1", _("Everything"));
|
||||||
|
|
||||||
|
base(
|
||||||
|
account,
|
||||||
|
// Translators: This label describes the account
|
||||||
|
// preference for the length of time (weeks, months or
|
||||||
|
// years) that past email should be downloaded.
|
||||||
|
_("Download mail"),
|
||||||
|
combo
|
||||||
|
);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update() {
|
||||||
|
this.value.set_active_id(this.account.prefetch_period_days.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private abstract class Accounts.ServerServiceRow<V> : ServerAccountRow<V> {
|
||||||
|
|
||||||
|
|
||||||
|
protected Geary.ServiceInformation service;
|
||||||
|
|
||||||
|
public virtual bool is_value_editable {
|
||||||
|
get {
|
||||||
|
return (
|
||||||
|
this.account.service_provider == Geary.ServiceProvider.OTHER &&
|
||||||
|
!this.is_goa_account
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// XXX convenience method until we get a better way of doing this.
|
||||||
|
protected bool is_goa_account {
|
||||||
|
get { return (this.service.mediator is GoaMediator); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ServerServiceRow(Geary.AccountInformation account,
|
||||||
|
Geary.ServiceInformation service,
|
||||||
|
string label,
|
||||||
|
V value) {
|
||||||
|
base(account, label, value);
|
||||||
|
this.service = service;
|
||||||
|
|
||||||
|
Gtk.Widget? widget = value as Gtk.Widget;
|
||||||
|
if (widget != null && !this.is_value_editable) {
|
||||||
|
if (widget is Gtk.Label) {
|
||||||
|
widget.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
|
||||||
|
} else {
|
||||||
|
widget.set_sensitive(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class Accounts.ServiceHostRow : ServerServiceRow<Gtk.Label> {
|
||||||
|
|
||||||
|
public ServiceHostRow(Geary.AccountInformation account,
|
||||||
|
Geary.ServiceInformation service) {
|
||||||
|
string label = _("Unknown");
|
||||||
|
switch (service.protocol) {
|
||||||
|
case Geary.Protocol.IMAP:
|
||||||
|
// Translators: This label describes the host name or IP
|
||||||
|
// address and port used by an account's IMAP service.
|
||||||
|
label = _("IMAP server");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Geary.Protocol.SMTP:
|
||||||
|
// Translators: This label describes the host name or IP
|
||||||
|
// address and port used by an account's SMTP service.
|
||||||
|
label = _("SMTP server");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
base(
|
||||||
|
account,
|
||||||
|
service,
|
||||||
|
label,
|
||||||
|
new Gtk.Label("")
|
||||||
|
);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update() {
|
||||||
|
this.value.set_text(
|
||||||
|
Geary.String.is_empty(this.service.host)
|
||||||
|
? _("None")
|
||||||
|
: "%s:%d".printf(this.service.host, this.service.port)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class Accounts.ServiceSecurityRow :
|
||||||
|
ServerServiceRow<Gtk.ComboBoxText> {
|
||||||
|
|
||||||
|
private const string INSECURE_ICON = "channel-insecure-symbolic";
|
||||||
|
private const string SECURE_ICON = "channel-secure-symbolic";
|
||||||
|
|
||||||
|
public ServiceSecurityRow(Geary.AccountInformation account,
|
||||||
|
Geary.ServiceInformation service) {
|
||||||
|
Gtk.ListStore store = new Gtk.ListStore(
|
||||||
|
3, typeof(string), typeof(string), typeof(string)
|
||||||
|
);
|
||||||
|
Gtk.TreeIter iter;
|
||||||
|
store.append(out iter);
|
||||||
|
store.set(iter, 0, "none", 1, INSECURE_ICON, 2, _("None"));
|
||||||
|
store.append(out iter);
|
||||||
|
store.set(iter, 0, "start-tls", 1, SECURE_ICON, 2, _("StartTLS"));
|
||||||
|
store.append(out iter);
|
||||||
|
store.set(iter, 0, "tls", 1, SECURE_ICON, 2, _("TLS"));
|
||||||
|
|
||||||
|
Gtk.ComboBox combo = new Gtk.ComboBox.with_model(store);
|
||||||
|
combo.set_id_column(0);
|
||||||
|
|
||||||
|
Gtk.CellRendererText text_renderer = new Gtk.CellRendererText();
|
||||||
|
combo.pack_start(text_renderer, true);
|
||||||
|
combo.add_attribute(text_renderer, "text", 2);
|
||||||
|
|
||||||
|
Gtk.CellRendererPixbuf icon_renderer = new Gtk.CellRendererPixbuf();
|
||||||
|
combo.pack_start(icon_renderer, true);
|
||||||
|
combo.add_attribute(icon_renderer, "icon_name", 1);
|
||||||
|
|
||||||
|
base(
|
||||||
|
account,
|
||||||
|
service,
|
||||||
|
// Translators: This label describes what form of secure
|
||||||
|
// connection (TLS, StartTLS, etc) used by an account's
|
||||||
|
// IMAP or SMTP service.
|
||||||
|
_("Transport security"),
|
||||||
|
combo
|
||||||
|
);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update() {
|
||||||
|
if (this.service.use_ssl) {
|
||||||
|
this.value.set_active_id("tls");
|
||||||
|
} else if (this.service.use_starttls) {
|
||||||
|
this.value.set_active_id("start-tls");
|
||||||
|
} else {
|
||||||
|
this.value.set_active_id("none");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class Accounts.ServiceAuthRow : ServerServiceRow<Gtk.Label> {
|
||||||
|
|
||||||
|
public ServiceAuthRow(Geary.AccountInformation account,
|
||||||
|
Geary.ServiceInformation service) {
|
||||||
|
base(
|
||||||
|
account,
|
||||||
|
service,
|
||||||
|
// Translators: This label describes the authentication
|
||||||
|
// scheme used by an account's IMAP or SMTP service.
|
||||||
|
_("Login"),
|
||||||
|
new Gtk.Label("")
|
||||||
|
);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update() {
|
||||||
|
string? label = null;
|
||||||
|
if (this.service.credentials != null) {
|
||||||
|
string method = _("Unknown");
|
||||||
|
switch (this.service.credentials.supported_method) {
|
||||||
|
case Geary.Credentials.Method.PASSWORD:
|
||||||
|
// Translators: This is used when an account's IMAP or
|
||||||
|
// SMTP service uses password auth. The string
|
||||||
|
// replacement is the service's login name.
|
||||||
|
method = _("%s with password");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Geary.Credentials.Method.OAUTH2:
|
||||||
|
// Translators: This is used when an account's IMAP or
|
||||||
|
// SMTP service uses OAuth2. The string replacement is
|
||||||
|
// the service's login name.
|
||||||
|
method = _("%s via OAuth2");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
string? login = this.service.credentials.user;
|
||||||
|
if (Geary.String.is_empty(login)) {
|
||||||
|
login = _("Unknown");
|
||||||
|
}
|
||||||
|
|
||||||
|
label = method.printf(login);
|
||||||
|
} else if (this.service.protocol == Geary.Protocol.SMTP &&
|
||||||
|
this.service.smtp_use_imap_credentials) {
|
||||||
|
label = _("Use IMAP server login");
|
||||||
|
} else {
|
||||||
|
// Translators: This is used when no auth scheme is used
|
||||||
|
// by an account's IMAP or SMTP service.
|
||||||
|
label = _("None");
|
||||||
|
}
|
||||||
|
this.value.set_text(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -23,6 +23,7 @@ geary_client_vala_sources = files(
|
||||||
'accounts/accounts-editor-edit-pane.vala',
|
'accounts/accounts-editor-edit-pane.vala',
|
||||||
'accounts/accounts-editor-remove-pane.vala',
|
'accounts/accounts-editor-remove-pane.vala',
|
||||||
'accounts/accounts-editor-row.vala',
|
'accounts/accounts-editor-row.vala',
|
||||||
|
'accounts/accounts-editor-servers-pane.vala',
|
||||||
'accounts/add-edit-page.vala',
|
'accounts/add-edit-page.vala',
|
||||||
'accounts/goa-service-information.vala',
|
'accounts/goa-service-information.vala',
|
||||||
'accounts/local-service-information.vala',
|
'accounts/local-service-information.vala',
|
||||||
|
|
|
||||||
138
ui/accounts_editor_servers_pane.ui
Normal file
138
ui/accounts_editor_servers_pane.ui
Normal file
|
|
@ -0,0 +1,138 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Generated with glade 3.22.0 -->
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk+" version="3.20"/>
|
||||||
|
<template class="AccountsEditorServersPane" parent="GtkGrid">
|
||||||
|
<property name="name">1</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="vexpand">True</property>
|
||||||
|
<property name="hscrollbar_policy">never</property>
|
||||||
|
<property name="min_content_height">400</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkViewport">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkGrid">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkFrame">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="label_xalign">0</property>
|
||||||
|
<property name="shadow_type">in</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox" id="receiving_list">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="selection_mode">none</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child type="label_item">
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">Receiving</property>
|
||||||
|
<style>
|
||||||
|
<class name="geary-settings-heading"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkFrame">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="label_xalign">0</property>
|
||||||
|
<property name="shadow_type">in</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox" id="sending_list">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="selection_mode">none</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child type="label_item">
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">Sending</property>
|
||||||
|
<style>
|
||||||
|
<class name="geary-settings-heading"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkFrame">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="label_xalign">0</property>
|
||||||
|
<property name="shadow_type">in</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox" id="details_list">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="selection_mode">none</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child type="label_item">
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<style>
|
||||||
|
<class name="geary-account-view"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
39
ui/geary.css
39
ui/geary.css
|
|
@ -200,8 +200,43 @@ label.geary-settings-heading {
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
row.geary-settings {
|
row.geary-settings {
|
||||||
padding: 18px;
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
row.geary-settings > grid > * {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
row.geary-settings > grid > * {
|
||||||
|
margin: 18px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
row.geary-settings > grid > *:first-child:dir(ltr),
|
||||||
|
row.geary-settings > grid > *:last-child:dir(rtl) {
|
||||||
|
margin-left: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
row.geary-settings > grid > *:last-child:dir(ltr),
|
||||||
|
row.geary-settings > grid > *:first-child:dir(rtl) {
|
||||||
|
margin-right: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
row.geary-settings > grid > image:dir(ltr) {
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
row.geary-settings > grid > image:dir(rtl) {
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
row.geary-settings > grid > combobox,
|
||||||
|
row.geary-settings:not(.geary-add-row) > grid > image,
|
||||||
|
row.geary-settings > grid > switch {
|
||||||
|
/* These use more space than labels, so set their valign to center
|
||||||
|
when adding them and free up some space around them here to keep a
|
||||||
|
consistent row height. */
|
||||||
|
margin: 0 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
buttonbox.geary-settings {
|
buttonbox.geary-settings {
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
<file compressed="true" preprocess="xml-stripblanks">accounts_editor.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">accounts_editor.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">accounts_editor_edit_pane.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">accounts_editor_edit_pane.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">accounts_editor_remove_pane.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">accounts_editor_remove_pane.ui</file>
|
||||||
|
<file compressed="true" preprocess="xml-stripblanks">accounts_editor_servers_pane.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">certificate_warning_dialog.glade</file>
|
<file compressed="true" preprocess="xml-stripblanks">certificate_warning_dialog.glade</file>
|
||||||
<file compressed="true">client-web-view.js</file>
|
<file compressed="true">client-web-view.js</file>
|
||||||
<file compressed="true">client-web-view-allow-remote-images.js</file>
|
<file compressed="true">client-web-view-allow-remote-images.js</file>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue