[evolution] Bug 684302 - Prompt to close message window on reply should be inline
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Bug 684302 - Prompt to close message window on reply should be inline
- Date: Tue, 4 Jun 2013 20:13:53 +0000 (UTC)
commit d54a3443d8bf8bb97a0de108d3eb8216b01846b5
Author: Matthew Barnes <mbarnes redhat com>
Date: Tue Jun 4 16:09:47 2013 -0400
Bug 684302 - Prompt to close message window on reply should be inline
Pop-up dialog is far too intrusive. Instead ask the question as an
inline alert in the message window, which does not interrupt the user.
mail/e-mail-browser.c | 123 ++++++++++++++++++++++++++++++++----------------
mail/e-mail-browser.h | 2 +
mail/mail.error.xml | 11 ++---
3 files changed, 88 insertions(+), 48 deletions(-)
---
diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
index 030b7e4..8c5e4bb 100644
--- a/mail/e-mail-browser.c
+++ b/mail/e-mail-browser.c
@@ -59,6 +59,9 @@ struct _EMailBrowserPrivate {
GtkWidget *preview_pane;
GtkWidget *statusbar;
+ EAlert *close_on_reply_alert;
+ gulong close_on_reply_response_handler_id;
+
guint show_deleted : 1;
};
@@ -359,6 +362,30 @@ mail_browser_status_message_cb (EMailBrowser *browser,
}
static void
+mail_browser_close_on_reply_response_cb (EAlert *alert,
+ gint response_id,
+ EMailBrowser *browser)
+{
+ /* Disconnect the signal handler, but leave the EAlert
+ * itself in place so we know it's already been presented. */
+ g_signal_handler_disconnect (
+ browser->priv->close_on_reply_alert,
+ browser->priv->close_on_reply_response_handler_id);
+ browser->priv->close_on_reply_response_handler_id = 0;
+
+ if (response_id == GTK_RESPONSE_YES) {
+ e_mail_browser_set_close_on_reply_policy (
+ browser, E_AUTOMATIC_ACTION_POLICY_ALWAYS);
+ e_mail_browser_close (browser);
+ }
+
+ if (response_id == GTK_RESPONSE_NO) {
+ e_mail_browser_set_close_on_reply_policy (
+ browser, E_AUTOMATIC_ACTION_POLICY_NEVER);
+ }
+}
+
+static void
mail_browser_set_backend (EMailBrowser *browser,
EMailBackend *backend)
{
@@ -509,6 +536,13 @@ mail_browser_dispose (GObject *object)
priv = E_MAIL_BROWSER_GET_PRIVATE (object);
+ if (priv->close_on_reply_response_handler_id > 0) {
+ g_signal_handler_disconnect (
+ priv->close_on_reply_alert,
+ priv->close_on_reply_response_handler_id);
+ priv->close_on_reply_response_handler_id = 0;
+ }
+
g_clear_object (&priv->backend);
g_clear_object (&priv->ui_manager);
g_clear_object (&priv->focus_tracker);
@@ -516,6 +550,7 @@ mail_browser_dispose (GObject *object)
g_clear_object (&priv->main_toolbar);
g_clear_object (&priv->preview_pane);
g_clear_object (&priv->statusbar);
+ g_clear_object (&priv->close_on_reply_alert);
if (priv->message_list != NULL) {
/* This will cancel a regen operation. */
@@ -801,15 +836,18 @@ mail_browser_set_message (EMailReader *reader,
const gchar *uid)
{
EMailReaderInterface *interface;
+ EMailBrowser *browser;
CamelMessageInfo *info;
CamelFolder *folder;
+ browser = E_MAIL_BROWSER (reader);
+
/* Chain up to parent's set_message() method. */
interface = g_type_default_interface_peek (E_TYPE_MAIL_READER);
interface->set_message (reader, uid);
if (uid == NULL) {
- e_mail_browser_close (E_MAIL_BROWSER (reader));
+ e_mail_browser_close (browser);
return;
}
@@ -831,7 +869,6 @@ mail_browser_composer_created (EMailReader *reader,
{
EMailBrowser *browser;
EAutomaticActionPolicy policy;
- gboolean close_browser;
/* Do not prompt if there is no source message. It means
* the user wants to start a brand new message, presumably
@@ -842,46 +879,19 @@ mail_browser_composer_created (EMailReader *reader,
browser = E_MAIL_BROWSER (reader);
policy = e_mail_browser_get_close_on_reply_policy (browser);
- if (policy == E_AUTOMATIC_ACTION_POLICY_ALWAYS) {
- close_browser = TRUE;
- } else if (policy == E_AUTOMATIC_ACTION_POLICY_NEVER) {
- close_browser = FALSE;
- } else {
- GtkWidget *dialog;
- GtkWindow *parent;
- EShell *shell;
- EMailBackend *backend;
- EShellBackend *shell_backend;
- gint response;
-
- backend = e_mail_reader_get_backend (reader);
-
- shell_backend = E_SHELL_BACKEND (backend);
- shell = e_shell_backend_get_shell (shell_backend);
-
- parent = e_shell_get_active_window (shell);
- if (parent == NULL)
- parent = e_mail_reader_get_window (reader);
-
- dialog = e_alert_dialog_new_for_args (
- parent, "mail:ask-reply-close-browser", NULL);
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- close_browser =
- (response == GTK_RESPONSE_YES) ||
- (response == GTK_RESPONSE_OK);
-
- if (response == GTK_RESPONSE_OK)
- e_mail_browser_set_close_on_reply_policy (
- browser, E_AUTOMATIC_ACTION_POLICY_ALWAYS);
- else if (response == GTK_RESPONSE_CANCEL)
- e_mail_browser_set_close_on_reply_policy (
- browser, E_AUTOMATIC_ACTION_POLICY_NEVER);
- }
+ switch (policy) {
+ case E_AUTOMATIC_ACTION_POLICY_ALWAYS:
+ e_mail_browser_close (browser);
+ break;
- if (close_browser)
- e_mail_browser_close (E_MAIL_BROWSER (reader));
+ case E_AUTOMATIC_ACTION_POLICY_NEVER:
+ /* do nothing */
+ break;
+
+ case E_AUTOMATIC_ACTION_POLICY_ASK:
+ e_mail_browser_ask_close_on_reply (browser);
+ break;
+ }
}
static void
@@ -1045,6 +1055,37 @@ e_mail_browser_close (EMailBrowser *browser)
gtk_widget_destroy (GTK_WIDGET (browser));
}
+void
+e_mail_browser_ask_close_on_reply (EMailBrowser *browser)
+{
+ EAlertSink *alert_sink;
+ EAlert *alert;
+ gulong handler_id;
+
+ g_return_if_fail (E_IS_MAIL_BROWSER (browser));
+
+ /* Do nothing if the question has already been presented, even if
+ * the user dismissed it without answering. We only present the
+ * question once per browser window, lest it become annoying. */
+ if (browser->priv->close_on_reply_alert != NULL)
+ return;
+
+ alert = e_alert_new ("mail:browser-close-on-reply", NULL);
+
+ handler_id = g_signal_connect (
+ alert, "response",
+ G_CALLBACK (mail_browser_close_on_reply_response_cb),
+ browser);
+
+ browser->priv->close_on_reply_alert = g_object_ref (alert);
+ browser->priv->close_on_reply_response_handler_id = handler_id;
+
+ alert_sink = e_mail_reader_get_alert_sink (E_MAIL_READER (browser));
+ e_alert_sink_submit_alert (alert_sink, alert);
+
+ g_object_unref (alert);
+}
+
EAutomaticActionPolicy
e_mail_browser_get_close_on_reply_policy (EMailBrowser *browser)
{
diff --git a/mail/e-mail-browser.h b/mail/e-mail-browser.h
index dce6922..1d32042 100644
--- a/mail/e-mail-browser.h
+++ b/mail/e-mail-browser.h
@@ -66,6 +66,8 @@ GtkWidget * e_mail_browser_new (EMailBackend *backend,
const gchar *message_uid,
EMailFormatterMode display_mode);
void e_mail_browser_close (EMailBrowser *browser);
+void e_mail_browser_ask_close_on_reply
+ (EMailBrowser *browser);
EAutomaticActionPolicy
e_mail_browser_get_close_on_reply_policy
(EMailBrowser *browser);
diff --git a/mail/mail.error.xml b/mail/mail.error.xml
index d523b54..f067ed3 100644
--- a/mail/mail.error.xml
+++ b/mail/mail.error.xml
@@ -393,13 +393,10 @@ An mbox account will be created to preserve the old mbox folders. You can delete
<button _label="In Current _Folder Only" response="GTK_RESPONSE_NO"/>
</error>
- <error id="ask-reply-close-browser" type="question" default="GTK_RESPONSE_NO">
- <_primary>Close message window.</_primary>
- <_secondary xml:space="preserve">Would you like to close the message window?</_secondary>
- <button _label="_Yes" response="GTK_RESPONSE_YES"/>
- <button _label="_No" response="GTK_RESPONSE_NO"/>
- <button _label="_Always" response="GTK_RESPONSE_OK"/>
- <button _label="N_ever" response="GTK_RESPONSE_CANCEL"/>
+ <error id="browser-close-on-reply" type="question" default="GTK_RESPONSE_NO">
+ <_secondary>Should Evolution close this window when replying or forwarding?</_secondary>
+ <button _label="_Yes, Always" response="GTK_RESPONSE_YES"/>
+ <button _label="_No, Never" response="GTK_RESPONSE_NO"/>
</error>
<error id="ask-folder-drop-copy" type="question" default="GTK_RESPONSE_YES">
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]