[evolution] Bug 240905 - Can't edit Follow Up flag



commit b0d3546a9d1009ab519d26631444f4331da8e3d6
Author: Milan Crha <mcrha redhat com>
Date:   Mon Jul 23 23:42:31 2018 +0200

    Bug 240905 - Can't edit Follow Up flag
    
    Closes https://bugzilla.gnome.org/show_bug.cgi?id=240905

 src/mail/e-mail-reader.c                | 52 ++++++++++++++++++++++++++-------
 src/mail/e-mail-reader.h                |  4 ++-
 src/mail/e-mail-tag-editor.c            | 14 +--------
 src/mail/em-utils.c                     | 38 +++++++++++++++---------
 src/mail/mail-dialogs.ui                | 19 ++----------
 src/modules/mail/e-mail-shell-content.c | 18 ++++++++++++
 6 files changed, 90 insertions(+), 55 deletions(-)
---
diff --git a/src/mail/e-mail-reader.c b/src/mail/e-mail-reader.c
index eeda54709c..98dde18a82 100644
--- a/src/mail/e-mail-reader.c
+++ b/src/mail/e-mail-reader.c
@@ -718,19 +718,17 @@ static void
 action_mail_flag_clear_cb (GtkAction *action,
                            EMailReader *reader)
 {
-       EMailDisplay *display;
        CamelFolder *folder;
        GtkWindow *window;
        GPtrArray *uids;
 
        folder = e_mail_reader_ref_folder (reader);
-       display = e_mail_reader_get_mail_display (reader);
        uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        window = e_mail_reader_get_window (reader);
 
        em_utils_flag_for_followup_clear (window, folder, uids);
 
-       e_mail_display_reload (display);
+       e_mail_reader_reload (reader);
 
        g_clear_object (&folder);
        g_ptr_array_unref (uids);
@@ -740,19 +738,17 @@ static void
 action_mail_flag_completed_cb (GtkAction *action,
                                EMailReader *reader)
 {
-       EMailDisplay *display;
        CamelFolder *folder;
        GtkWindow *window;
        GPtrArray *uids;
 
        folder = e_mail_reader_ref_folder (reader);
-       display = e_mail_reader_get_mail_display (reader);
        uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        window = e_mail_reader_get_window (reader);
 
        em_utils_flag_for_followup_completed (window, folder, uids);
 
-       e_mail_display_reload (display);
+       e_mail_reader_reload (reader);
 
        g_clear_object (&folder);
        g_ptr_array_unref (uids);
@@ -770,6 +766,8 @@ action_mail_flag_for_followup_cb (GtkAction *action,
 
        em_utils_flag_for_followup (reader, folder, uids);
 
+       e_mail_reader_reload (reader);
+
        g_clear_object (&folder);
        g_ptr_array_unref (uids);
 }
@@ -3310,6 +3308,29 @@ mail_reader_manage_followup_flag (EMailReader *reader,
                mail_reader_remove_followup_alert (reader);
 }
 
+static void
+mail_reader_reload (EMailReader *reader)
+{
+       CamelFolder *folder;
+       GPtrArray *uids;
+       EMailDisplay *mail_display;
+
+       g_return_if_fail (E_IS_MAIL_READER (reader));
+
+       folder = e_mail_reader_ref_folder (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
+
+       if (uids && uids->len == 1)
+               mail_reader_manage_followup_flag (reader, folder, uids->pdata[0]);
+
+       g_clear_object (&folder);
+       if (uids)
+               g_ptr_array_unref (uids);
+
+       mail_display = e_mail_reader_get_mail_display (reader);
+       e_mail_display_reload (mail_display);
+}
+
 static void
 mail_reader_message_loaded_cb (CamelFolder *folder,
                                GAsyncResult *result,
@@ -3881,7 +3902,6 @@ mail_reader_update_actions (EMailReader *reader,
        gboolean any_messages_selected;
        gboolean enable_flag_clear;
        gboolean enable_flag_completed;
-       gboolean enable_flag_for_followup;
        gboolean have_enabled_account;
        gboolean multiple_messages_selected;
        gboolean selection_has_attachment_messages;
@@ -3913,8 +3933,6 @@ mail_reader_update_actions (EMailReader *reader,
                (state & E_MAIL_READER_SELECTION_FLAG_CLEAR);
        enable_flag_completed =
                (state & E_MAIL_READER_SELECTION_FLAG_COMPLETED);
-       enable_flag_for_followup =
-               (state & E_MAIL_READER_SELECTION_FLAG_FOLLOWUP);
        selection_has_attachment_messages =
                (state & E_MAIL_READER_SELECTION_HAS_ATTACHMENTS);
        selection_has_deleted_messages =
@@ -4060,7 +4078,7 @@ mail_reader_update_actions (EMailReader *reader,
        gtk_action_set_sensitive (action, sensitive);
 
        action_name = "mail-flag-for-followup";
-       sensitive = enable_flag_for_followup;
+       sensitive = any_messages_selected;
        action = e_mail_reader_get_action (reader, action_name);
        gtk_action_set_sensitive (action, sensitive);
 
@@ -4371,6 +4389,7 @@ e_mail_reader_default_init (EMailReaderInterface *iface)
        iface->show_search_bar = mail_reader_show_search_bar;
        iface->update_actions = mail_reader_update_actions;
        iface->close_on_delete_or_junk = mail_reader_close_on_delete_or_junk;
+       iface->reload = mail_reader_reload;
 
        g_object_interface_install_property (
                iface,
@@ -5967,3 +5986,16 @@ e_mail_reader_connect_remote_content (EMailReader *reader)
        g_signal_connect (mail_display, "load-changed",
                G_CALLBACK (mail_reader_display_load_changed_cb), reader);
 }
+
+void
+e_mail_reader_reload (EMailReader *reader)
+{
+       EMailReaderInterface *iface;
+
+       g_return_if_fail (E_IS_MAIL_READER (reader));
+
+       iface = E_MAIL_READER_GET_INTERFACE (reader);
+       g_return_if_fail (iface->reload != NULL);
+
+       iface->reload (reader);
+}
diff --git a/src/mail/e-mail-reader.h b/src/mail/e-mail-reader.h
index 8d3ab2a922..7cf77432bc 100644
--- a/src/mail/e-mail-reader.h
+++ b/src/mail/e-mail-reader.h
@@ -136,9 +136,10 @@ struct _EMailReaderInterface {
                                                 guint32 state);
        gboolean        (*close_on_delete_or_junk)
                                                (EMailReader *reader);
+       void            (*reload)               (EMailReader *reader);
 
        /* Padding for future expansion */
-       gpointer reserved[3];
+       gpointer reserved[2];
 };
 
 GType          e_mail_reader_get_type          (void);
@@ -212,6 +213,7 @@ void                e_mail_reader_composer_created  (EMailReader *reader,
                                                 CamelMimeMessage *message);
 void           e_mail_reader_connect_remote_content
                                                (EMailReader *reader);
+void           e_mail_reader_reload            (EMailReader *reader);
 
 G_END_DECLS
 
diff --git a/src/mail/e-mail-tag-editor.c b/src/mail/e-mail-tag-editor.c
index 73958de824..fbca4d21b6 100644
--- a/src/mail/e-mail-tag-editor.c
+++ b/src/mail/e-mail-tag-editor.c
@@ -56,14 +56,6 @@ enum {
 
 G_DEFINE_TYPE (EMailTagEditor, e_mail_tag_editor, GTK_TYPE_DIALOG)
 
-static void
-mail_tag_editor_clear_clicked_cb (EMailTagEditor *editor)
-{
-       gtk_combo_box_set_active (editor->priv->combo_entry, DEFAULT_FLAG);
-       e_date_edit_set_time (editor->priv->target_date, (time_t) -1);
-       e_mail_tag_editor_set_completed (editor, FALSE);
-}
-
 static void
 mail_tag_editor_set_property (GObject *object,
                               guint property_id,
@@ -166,6 +158,7 @@ e_mail_tag_editor_init (EMailTagEditor *editor)
        gtk_dialog_add_buttons (
                dialog,
                _("_Cancel"), GTK_RESPONSE_CANCEL,
+               _("Cl_ear"), GTK_RESPONSE_REJECT,
                _("_OK"), GTK_RESPONSE_OK,
                NULL);
 
@@ -222,11 +215,6 @@ e_mail_tag_editor_init (EMailTagEditor *editor)
                G_BINDING_BIDIRECTIONAL |
                G_BINDING_SYNC_CREATE);
 
-       widget = e_builder_get_widget (builder, "clear");
-       g_signal_connect_swapped (
-               widget, "clicked",
-               G_CALLBACK (mail_tag_editor_clear_clicked_cb), editor);
-
        g_object_unref (builder);
 }
 
diff --git a/src/mail/em-utils.c b/src/mail/em-utils.c
index f92e9e124c..2d3c03dbc2 100644
--- a/src/mail/em-utils.c
+++ b/src/mail/em-utils.c
@@ -236,11 +236,11 @@ em_utils_flag_for_followup (EMailReader *reader,
                             CamelFolder *folder,
                             GPtrArray *uids)
 {
-       EMailDisplay *display;
        GtkWidget *editor;
        GtkWindow *window;
        CamelNameValueArray *tags;
        guint ii, tags_len;
+       gint response;
 
        g_return_if_fail (E_IS_MAIL_READER (reader));
        g_return_if_fail (CAMEL_IS_FOLDER (folder));
@@ -285,14 +285,19 @@ em_utils_flag_for_followup (EMailReader *reader,
                }
        }
 
-       if (gtk_dialog_run (GTK_DIALOG (editor)) != GTK_RESPONSE_OK)
+       response = gtk_dialog_run (GTK_DIALOG (editor));
+       if (response != GTK_RESPONSE_OK && response != GTK_RESPONSE_REJECT)
                goto exit;
 
-       tags = e_mail_tag_editor_get_tag_list (E_MAIL_TAG_EDITOR (editor));
-       if (tags == NULL)
-               goto exit;
+       if (response == GTK_RESPONSE_OK) {
+               tags = e_mail_tag_editor_get_tag_list (E_MAIL_TAG_EDITOR (editor));
+               if (!tags)
+                       goto exit;
+       } else {
+               tags = NULL;
+       }
 
-       tags_len = camel_name_value_array_get_length (tags);
+       tags_len = tags ? camel_name_value_array_get_length (tags) : 0;
 
        camel_folder_freeze (folder);
        for (ii = 0; ii < uids->len; ii++) {
@@ -306,13 +311,19 @@ em_utils_flag_for_followup (EMailReader *reader,
 
                camel_message_info_freeze_notifications (info);
 
-               for (jj = 0; jj < tags_len; jj++) {
-                       const gchar *name = NULL, *value = NULL;
+               if (response == GTK_RESPONSE_REJECT) {
+                       camel_message_info_set_user_tag (info, "follow-up", NULL);
+                       camel_message_info_set_user_tag (info, "due-by", NULL);
+                       camel_message_info_set_user_tag (info, "completed-on", NULL);
+               } else {
+                       for (jj = 0; jj < tags_len; jj++) {
+                               const gchar *name = NULL, *value = NULL;
 
-                       if (!camel_name_value_array_get (tags, jj, &name, &value))
-                               continue;
+                               if (!camel_name_value_array_get (tags, jj, &name, &value))
+                                       continue;
 
-                       camel_message_info_set_user_tag (info, name, value);
+                               camel_message_info_set_user_tag (info, name, value);
+                       }
                }
 
                camel_message_info_thaw_notifications (info);
@@ -322,9 +333,6 @@ em_utils_flag_for_followup (EMailReader *reader,
        camel_folder_thaw (folder);
        camel_name_value_array_free (tags);
 
-       display = e_mail_reader_get_mail_display (reader);
-       e_mail_display_reload (display);
-
 exit:
        gtk_widget_destroy (GTK_WIDGET (editor));
 }
@@ -354,9 +362,11 @@ em_utils_flag_for_followup_clear (GtkWindow *parent,
                CamelMessageInfo *mi = camel_folder_get_message_info (folder, uids->pdata[i]);
 
                if (mi) {
+                       camel_message_info_freeze_notifications (mi);
                        camel_message_info_set_user_tag (mi, "follow-up", NULL);
                        camel_message_info_set_user_tag (mi, "due-by", NULL);
                        camel_message_info_set_user_tag (mi, "completed-on", NULL);
+                       camel_message_info_thaw_notifications (mi);
                        g_clear_object (&mi);
                }
        }
diff --git a/src/mail/mail-dialogs.ui b/src/mail/mail-dialogs.ui
index b8b40a4589..2753424f06 100644
--- a/src/mail/mail-dialogs.ui
+++ b/src/mail/mail-dialogs.ui
@@ -145,21 +145,6 @@ Please select a follow up action from the “Flag” menu.</property>
             <property name="y_options"/>
           </packing>
         </child>
-        <child>
-          <object class="GtkButton" id="clear">
-            <property name="label" translatable="yes">_Clear</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
-            <property name="use_underline">True</property>
-          </object>
-          <packing>
-            <property name="left_attach">2</property>
-            <property name="right_attach">3</property>
-            <property name="x_options">GTK_FILL</property>
-            <property name="y_options"/>
-          </packing>
-        </child>
         <child>
           <object class="EDateEdit" id="target_date">
             <property name="allow-no-date-set">True</property>
@@ -167,7 +152,7 @@ Please select a follow up action from the “Flag” menu.</property>
           </object>
           <packing>
             <property name="left_attach">1</property>
-            <property name="right_attach">3</property>
+            <property name="right_attach">2</property>
             <property name="top_attach">1</property>
             <property name="bottom_attach">2</property>
             <property name="y_options">GTK_FILL</property>
@@ -184,7 +169,7 @@ Please select a follow up action from the “Flag” menu.</property>
           </object>
           <packing>
             <property name="left_attach">1</property>
-            <property name="right_attach">3</property>
+            <property name="right_attach">2</property>
             <property name="top_attach">2</property>
             <property name="bottom_attach">3</property>
             <property name="x_options">GTK_FILL</property>
diff --git a/src/modules/mail/e-mail-shell-content.c b/src/modules/mail/e-mail-shell-content.c
index e12a05e1b4..03f4394c16 100644
--- a/src/modules/mail/e-mail-shell-content.c
+++ b/src/modules/mail/e-mail-shell-content.c
@@ -578,6 +578,23 @@ mail_shell_content_set_folder (EMailReader *reader,
        e_mail_reader_set_folder (reader, folder);
 }
 
+static void
+mail_shell_content_reload (EMailReader *reader)
+{
+       EMailShellContent *mail_shell_content;
+
+       mail_shell_content = E_MAIL_SHELL_CONTENT (reader);
+
+       if (!mail_shell_content->priv->mail_view)
+               return;
+
+       /* Forward this to our internal EMailView, which
+        * also implements the EMailReader interface. */
+       reader = E_MAIL_READER (mail_shell_content->priv->mail_view);
+
+       e_mail_reader_reload (reader);
+}
+
 static void
 e_mail_shell_content_class_init (EMailShellContentClass *class)
 {
@@ -666,6 +683,7 @@ e_mail_shell_content_reader_init (EMailReaderInterface *iface)
        iface->get_window = mail_shell_content_get_window;
        iface->set_folder = mail_shell_content_set_folder;
        iface->open_selected_mail = mail_shell_content_open_selected_mail;
+       iface->reload = mail_shell_content_reload;
 }
 
 static void


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