[evolution] Bug 787612 - Option to 'Go to the previous message after message deletion'



commit 209351ace5f1be5293bfe902e9b1fb1edbe4955d
Author: Milan Crha <mcrha redhat com>
Date:   Wed Sep 13 19:30:40 2017 +0200

    Bug 787612 - Option to 'Go to the previous message after message deletion'

 data/org.gnome.evolution.mail.gschema.xml.in  |    5 +++
 src/mail/e-mail-browser.c                     |   22 +++++++++++-
 src/mail/e-mail-paned-view.c                  |   22 +++++++++++-
 src/mail/e-mail-reader-utils.c                |   23 ++++++++++++
 src/mail/e-mail-reader-utils.h                |    3 ++
 src/mail/e-mail-reader.c                      |   48 +++++++++++++++++++++++-
 src/mail/e-mail-reader.h                      |    5 +++
 src/mail/mail-config.ui                       |   16 ++++++++
 src/modules/mail/e-mail-shell-content.c       |   21 ++++++++++-
 src/modules/mail/em-mailer-prefs.c            |    6 +++
 src/modules/settings/e-settings-mail-reader.c |    5 +++
 11 files changed, 171 insertions(+), 5 deletions(-)
---
diff --git a/data/org.gnome.evolution.mail.gschema.xml.in b/data/org.gnome.evolution.mail.gschema.xml.in
index a46fb8b..bc3eb31 100644
--- a/data/org.gnome.evolution.mail.gschema.xml.in
+++ b/data/org.gnome.evolution.mail.gschema.xml.in
@@ -698,6 +698,11 @@
       <_summary>Show start up wizard</_summary>
       <_description>Whether show start up wizard when there is no mail account configured.</_description>
     </key>
+    <key name="delete-selects-previous" type="b">
+      <default>false</default>
+      <_summary>Whether go to the previous message after message deletion</_summary>
+      <_description>If set to true, goes to the previous message when the selected is deleted; or to the 
next message, when it's set to false.</_description>
+    </key>
 
     <!-- The following keys are deprecated. -->
 
diff --git a/src/mail/e-mail-browser.c b/src/mail/e-mail-browser.c
index 1928ae4..de246c4 100644
--- a/src/mail/e-mail-browser.c
+++ b/src/mail/e-mail-browser.c
@@ -75,7 +75,8 @@ enum {
        PROP_MARK_SEEN_ALWAYS,
        PROP_SHOW_DELETED,
        PROP_SHOW_JUNK,
-       PROP_UI_MANAGER
+       PROP_UI_MANAGER,
+       PROP_DELETE_SELECTS_PREVIOUS
 };
 
 /* This is too trivial to put in a file.
@@ -467,6 +468,12 @@ mail_browser_set_property (GObject *object,
                                E_MAIL_READER (object),
                                g_value_get_boolean (value));
                        return;
+
+               case PROP_DELETE_SELECTS_PREVIOUS:
+                       e_mail_reader_set_delete_selects_previous (
+                               E_MAIL_READER (object),
+                               g_value_get_boolean (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -555,6 +562,13 @@ mail_browser_get_property (GObject *object,
                                e_mail_reader_get_mark_seen_always (
                                E_MAIL_READER (object)));
                        return;
+
+               case PROP_DELETE_SELECTS_PREVIOUS:
+                       g_value_set_boolean (
+                               value,
+                               e_mail_reader_get_delete_selects_previous (
+                               E_MAIL_READER (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -1035,6 +1049,12 @@ e_mail_browser_class_init (EMailBrowserClass *class)
                PROP_MARK_SEEN_ALWAYS,
                "mark-seen-always");
 
+       /* Inherited from EMailReader */
+       g_object_class_override_property (
+               object_class,
+               PROP_DELETE_SELECTS_PREVIOUS,
+               "delete-selects-previous");
+
        g_object_class_install_property (
                object_class,
                PROP_SHOW_DELETED,
diff --git a/src/mail/e-mail-paned-view.c b/src/mail/e-mail-paned-view.c
index cb7e94e..acc66e1 100644
--- a/src/mail/e-mail-paned-view.c
+++ b/src/mail/e-mail-paned-view.c
@@ -64,7 +64,8 @@ enum {
        PROP_FORWARD_STYLE,
        PROP_GROUP_BY_THREADS,
        PROP_REPLY_STYLE,
-       PROP_MARK_SEEN_ALWAYS
+       PROP_MARK_SEEN_ALWAYS,
+       PROP_DELETE_SELECTS_PREVIOUS
 };
 
 #define STATE_KEY_GROUP_BY_THREADS     "GroupByThreads"
@@ -319,6 +320,12 @@ mail_paned_view_set_property (GObject *object,
                                E_MAIL_READER (object),
                                g_value_get_boolean (value));
                        return;
+
+               case PROP_DELETE_SELECTS_PREVIOUS:
+                       e_mail_reader_set_delete_selects_previous (
+                               E_MAIL_READER (object),
+                               g_value_get_boolean (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -358,6 +365,13 @@ mail_paned_view_get_property (GObject *object,
                                e_mail_reader_get_mark_seen_always (
                                E_MAIL_READER (object)));
                        return;
+
+               case PROP_DELETE_SELECTS_PREVIOUS:
+                       g_value_set_boolean (
+                               value,
+                               e_mail_reader_get_delete_selects_previous (
+                               E_MAIL_READER (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -1150,6 +1164,12 @@ e_mail_paned_view_class_init (EMailPanedViewClass *class)
                object_class,
                PROP_MARK_SEEN_ALWAYS,
                "mark-seen-always");
+
+       /* Inherited from EMailReader */
+       g_object_class_override_property (
+               object_class,
+               PROP_DELETE_SELECTS_PREVIOUS,
+               "delete-selects-previous");
 }
 
 static void
diff --git a/src/mail/e-mail-reader-utils.c b/src/mail/e-mail-reader-utils.c
index 89f48c7..34c0ad4 100644
--- a/src/mail/e-mail-reader-utils.c
+++ b/src/mail/e-mail-reader-utils.c
@@ -2935,6 +2935,29 @@ e_mail_reader_select_next_message (EMailReader *reader,
                        MESSAGE_LIST_SELECT_PREVIOUS, 0, 0);
 }
 
+void
+e_mail_reader_select_previous_message (EMailReader *reader,
+                                      gboolean or_else_next)
+{
+       GtkWidget *message_list;
+       gboolean hide_deleted;
+       gboolean success;
+
+       g_return_if_fail (E_IS_MAIL_READER (reader));
+
+       hide_deleted = e_mail_reader_get_hide_deleted (reader);
+       message_list = e_mail_reader_get_message_list (reader);
+
+       success = message_list_select (
+               MESSAGE_LIST (message_list),
+               MESSAGE_LIST_SELECT_PREVIOUS, 0, 0);
+
+       if (!success && (hide_deleted || or_else_next))
+               message_list_select (
+                       MESSAGE_LIST (message_list),
+                       MESSAGE_LIST_SELECT_NEXT, 0, 0);
+}
+
 /* Helper for e_mail_reader_create_filter_from_selected() */
 static void
 mail_reader_create_filter_cb (GObject *source_object,
diff --git a/src/mail/e-mail-reader-utils.h b/src/mail/e-mail-reader-utils.h
index 1fbd338..115079f 100644
--- a/src/mail/e-mail-reader-utils.h
+++ b/src/mail/e-mail-reader-utils.h
@@ -91,6 +91,9 @@ void          e_mail_reader_save_messages     (EMailReader *reader);
 void           e_mail_reader_select_next_message
                                                (EMailReader *reader,
                                                 gboolean or_else_previous);
+void           e_mail_reader_select_previous_message
+                                               (EMailReader *reader,
+                                                gboolean or_else_next);
 void           e_mail_reader_create_filter_from_selected
                                                (EMailReader *reader,
                                                 gint filter_type);
diff --git a/src/mail/e-mail-reader.c b/src/mail/e-mail-reader.c
index c2ad8f7..a0927a5 100644
--- a/src/mail/e-mail-reader.c
+++ b/src/mail/e-mail-reader.c
@@ -89,6 +89,7 @@ struct _EMailReaderPrivate {
 
        guint group_by_threads : 1;
        guint mark_seen_always : 1;
+       guint delete_selects_previous : 1;
 
        /* to be able to start the mark_seen timeout only after
         * the message is loaded into the EMailDisplay */
@@ -507,8 +508,12 @@ action_mail_delete_cb (GtkAction *action,
        /* FIXME Verify all selected messages are deletable.
         *       But handle it by disabling this action. */
 
-       if (e_mail_reader_mark_selected (reader, mask, set) != 0)
-               e_mail_reader_select_next_message (reader, FALSE);
+       if (e_mail_reader_mark_selected (reader, mask, set) != 0) {
+               if (e_mail_reader_get_delete_selects_previous (reader))
+                       e_mail_reader_select_previous_message (reader, FALSE);
+               else
+                       e_mail_reader_select_next_message (reader, FALSE);
+       }
 }
 
 static void
@@ -4109,6 +4114,15 @@ e_mail_reader_default_init (EMailReaderInterface *iface)
                        FALSE,
                        G_PARAM_READWRITE));
 
+       g_object_interface_install_property (
+               iface,
+               g_param_spec_boolean (
+                       "delete-selects-previous",
+                       "Delete Selects Previous",
+                       "Whether go to the previous message after message deletion",
+                       FALSE,
+                       G_PARAM_READWRITE));
+
        signals[CHANGED] = g_signal_new (
                "changed",
                G_OBJECT_CLASS_TYPE (iface),
@@ -5057,6 +5071,36 @@ e_mail_reader_set_mark_seen_always (EMailReader *reader,
        g_object_notify (G_OBJECT (reader), "mark-seen-always");
 }
 
+gboolean
+e_mail_reader_get_delete_selects_previous (EMailReader *reader)
+{
+       EMailReaderPrivate *priv;
+
+       g_return_val_if_fail (E_IS_MAIL_READER (reader), FALSE);
+
+       priv = E_MAIL_READER_GET_PRIVATE (reader);
+
+       return priv->delete_selects_previous;
+}
+
+void
+e_mail_reader_set_delete_selects_previous (EMailReader *reader,
+                                          gboolean delete_selects_previous)
+{
+       EMailReaderPrivate *priv;
+
+       g_return_if_fail (E_IS_MAIL_READER (reader));
+
+       priv = E_MAIL_READER_GET_PRIVATE (reader);
+
+       if (priv->delete_selects_previous == delete_selects_previous)
+               return;
+
+       priv->delete_selects_previous = delete_selects_previous;
+
+       g_object_notify (G_OBJECT (reader), "delete-selects-previous");
+}
+
 void
 e_mail_reader_create_charset_menu (EMailReader *reader,
                                    GtkUIManager *ui_manager,
diff --git a/src/mail/e-mail-reader.h b/src/mail/e-mail-reader.h
index a2cebaf..6f3fb26 100644
--- a/src/mail/e-mail-reader.h
+++ b/src/mail/e-mail-reader.h
@@ -180,6 +180,11 @@ gboolean   e_mail_reader_get_mark_seen_always
 void           e_mail_reader_set_mark_seen_always
                                                (EMailReader *reader,
                                                 gboolean mark_seen_always);
+gboolean       e_mail_reader_get_delete_selects_previous
+                                               (EMailReader *reader);
+void           e_mail_reader_set_delete_selects_previous
+                                               (EMailReader *reader,
+                                                gboolean delete_selects_previous);
 void           e_mail_reader_create_charset_menu
                                                (EMailReader *reader,
                                                 GtkUIManager *ui_manager,
diff --git a/src/mail/mail-config.ui b/src/mail/mail-config.ui
index 22e975c..3613380 100644
--- a/src/mail/mail-config.ui
+++ b/src/mail/mail-config.ui
@@ -2151,6 +2151,22 @@
                         <property name="position">2</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkCheckButton" id="chkDeleteSelectsPrevious">
+                        <property name="label" translatable="yes">Go to the previ_ous message after message 
deletion</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="xalign">0.5</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">3</property>
+                      </packing>
+                    </child>
                   </object>
                 </child>
               </object>
diff --git a/src/modules/mail/e-mail-shell-content.c b/src/modules/mail/e-mail-shell-content.c
index 60ac7a3..39c6356 100644
--- a/src/modules/mail/e-mail-shell-content.c
+++ b/src/modules/mail/e-mail-shell-content.c
@@ -53,7 +53,8 @@ enum {
        PROP_MAIL_VIEW,
        PROP_REPLY_STYLE,
        PROP_MARK_SEEN_ALWAYS,
-       PROP_TO_DO_PANE
+       PROP_TO_DO_PANE,
+       PROP_DELETE_SELECTS_PREVIOUS
 };
 
 /* Forward Declarations */
@@ -134,6 +135,12 @@ mail_shell_content_set_property (GObject *object,
                                E_MAIL_READER (object),
                                g_value_get_boolean (value));
                        return;
+
+               case PROP_DELETE_SELECTS_PREVIOUS:
+                       e_mail_reader_set_delete_selects_previous (
+                               E_MAIL_READER (object),
+                               g_value_get_boolean (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -181,6 +188,12 @@ mail_shell_content_get_property (GObject *object,
                                value, e_mail_shell_content_get_to_do_pane (
                                E_MAIL_SHELL_CONTENT (object)));
                        return;
+
+               case PROP_DELETE_SELECTS_PREVIOUS:
+                       g_value_set_boolean (
+                               value, e_mail_reader_get_delete_selects_previous (
+                               E_MAIL_READER (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -535,6 +548,12 @@ e_mail_shell_content_class_init (EMailShellContentClass *class)
                PROP_MARK_SEEN_ALWAYS,
                "mark-seen-always");
 
+       /* Inherited from EMailReader */
+       g_object_class_override_property (
+               object_class,
+               PROP_DELETE_SELECTS_PREVIOUS,
+               "delete-selects-previous");
+
        g_object_class_install_property (
                object_class,
                PROP_TO_DO_PANE,
diff --git a/src/modules/mail/em-mailer-prefs.c b/src/modules/mail/em-mailer-prefs.c
index 1949f8d..3dea3d4 100644
--- a/src/modules/mail/em-mailer-prefs.c
+++ b/src/modules/mail/em-mailer-prefs.c
@@ -1288,6 +1288,12 @@ em_mailer_prefs_construct (EMMailerPrefs *prefs,
                widget, "active",
                G_SETTINGS_BIND_DEFAULT);
 
+       widget = e_builder_get_widget (prefs->priv->builder, "chkDeleteSelectsPrevious");
+       g_settings_bind (
+               settings, "delete-selects-previous",
+               widget, "active",
+               G_SETTINGS_BIND_DEFAULT);
+
        /* Mail Fonts */
        widget = e_builder_get_widget (prefs->priv->builder, "radFontUseSame");
        g_settings_bind (
diff --git a/src/modules/settings/e-settings-mail-reader.c b/src/modules/settings/e-settings-mail-reader.c
index 2875d0f..780a181 100644
--- a/src/modules/settings/e-settings-mail-reader.c
+++ b/src/modules/settings/e-settings-mail-reader.c
@@ -64,6 +64,11 @@ settings_mail_reader_idle_cb (EExtension *extension)
                extensible, "mark-seen-always",
                G_SETTINGS_BIND_GET);
 
+       g_settings_bind (
+               settings, "delete-selects-previous",
+               extensible, "delete-selects-previous",
+               G_SETTINGS_BIND_GET);
+
        g_object_unref (settings);
 
        action_group = e_mail_reader_get_action_group (


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]