[evolution/gnome-3-34] I#603 - Cannot reply to the first message in a collapsed thread



commit e349a9b335b3ef2c8cb1dbda8fcb99d98c02f6d0
Author: Milan Crha <mcrha redhat com>
Date:   Mon Sep 9 12:00:00 2019 +0200

    I#603 - Cannot reply to the first message in a collapsed thread
    
    Closes https://gitlab.gnome.org/GNOME/evolution/issues/603

 src/mail/e-mail-reader.c | 32 +++++++++++++++++++++++++---
 src/mail/message-list.c  | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+), 3 deletions(-)
---
diff --git a/src/mail/e-mail-reader.c b/src/mail/e-mail-reader.c
index d0eea1c11c..9898602880 100644
--- a/src/mail/e-mail-reader.c
+++ b/src/mail/e-mail-reader.c
@@ -786,7 +786,7 @@ action_mail_forward_cb (GtkAction *action,
        GPtrArray *uids;
 
        window = e_mail_reader_get_window (reader);
-       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
+       uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
        if (em_utils_ask_open_many (window, uids->len)) {
@@ -838,7 +838,7 @@ action_mail_forward_inline_cb (GtkAction *action,
        GPtrArray *uids;
 
        window = e_mail_reader_get_window (reader);
-       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
+       uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
        if (em_utils_ask_open_many (window, uids->len)) {
@@ -864,7 +864,7 @@ action_mail_forward_quoted_cb (GtkAction *action,
        GPtrArray *uids;
 
        window = e_mail_reader_get_window (reader);
-       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
+       uids = e_mail_reader_get_selected_uids (reader);
        g_return_if_fail (uids != NULL);
 
        if (em_utils_ask_open_many (window, uids->len)) {
@@ -3959,6 +3959,15 @@ mail_reader_folder_loaded (EMailReader *reader)
        e_mail_reader_update_actions (reader, state);
 }
 
+static void
+mail_reader_message_list_suggest_update_actions_cb (EMailReader *reader)
+{
+       guint32 state;
+
+       state = e_mail_reader_check_state (reader);
+       e_mail_reader_update_actions (reader, state);
+}
+
 static void
 set_mail_display_part_list (GObject *object,
                             GAsyncResult *result,
@@ -5240,6 +5249,10 @@ connect_signals:
                message_list, "message-selected",
                G_CALLBACK (mail_reader_message_selected_cb), reader);
 
+       g_signal_connect_swapped (
+               message_list, "update-actions",
+               G_CALLBACK (mail_reader_message_list_suggest_update_actions_cb), reader);
+
        /* re-schedule mark-as-seen,... */
        g_signal_connect_swapped (
                message_list, "cursor-change",
@@ -5555,6 +5568,19 @@ e_mail_reader_check_state (EMailReader *reader)
        if (has_color)
                state |= E_MAIL_READER_SELECTION_HAS_COLOR;
 
+       if (!(state & E_MAIL_READER_SELECTION_SINGLE)) {
+               GPtrArray *real_selected_uids;
+
+               real_selected_uids = e_mail_reader_get_selected_uids (reader);
+
+               if (real_selected_uids && real_selected_uids->len == 1) {
+                       state |= E_MAIL_READER_SELECTION_SINGLE;
+               }
+
+               if (real_selected_uids)
+                       g_ptr_array_unref (real_selected_uids);
+       }
+
        g_clear_object (&folder);
        g_ptr_array_unref (uids);
 
diff --git a/src/mail/message-list.c b/src/mail/message-list.c
index 98c07c6c85..bd74351317 100644
--- a/src/mail/message-list.c
+++ b/src/mail/message-list.c
@@ -132,6 +132,8 @@ struct _MessageListPrivate {
 
        GdkRGBA *new_mail_bg_color;
        gchar *new_mail_fg_color;
+
+       guint update_actions_idle_id;
 };
 
 /* XXX Plain GNode suffers from O(N) tail insertions, and that won't
@@ -300,6 +302,7 @@ static void clear_info                      (gchar *key,
 enum {
        MESSAGE_SELECTED,
        MESSAGE_LIST_BUILT,
+       UPDATE_ACTIONS,
        LAST_SIGNAL
 };
 
@@ -2850,12 +2853,48 @@ ml_tree_drag_motion (ETree *tree,
        return action != 0;
 }
 
+static gboolean
+message_list_update_actions_idle_cb (gpointer user_data)
+{
+       GWeakRef *weak_ref = user_data;
+       MessageList *message_list;
+
+       g_return_val_if_fail (weak_ref != NULL, FALSE);
+
+       message_list = g_weak_ref_get (weak_ref);
+       if (message_list) {
+               message_list->priv->update_actions_idle_id = 0;
+
+               if (!message_list->priv->destroyed)
+                       g_signal_emit (message_list, signals[UPDATE_ACTIONS], 0, NULL);
+
+               g_object_unref (message_list);
+       }
+
+       return FALSE;
+}
+
+static void
+message_list_schedule_update_actions (MessageList *message_list)
+{
+       g_return_if_fail (IS_MESSAGE_LIST (message_list));
+
+       if (!message_list->priv->update_actions_idle_id) {
+               message_list->priv->update_actions_idle_id =
+                       g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, message_list_update_actions_idle_cb,
+                               e_weak_ref_new (message_list), (GDestroyNotify) e_weak_ref_free);
+       }
+}
+
 static void
 on_model_row_changed (ETableModel *model,
                       gint row,
                       MessageList *message_list)
 {
        message_list->priv->any_row_changed = TRUE;
+
+       if (e_selection_model_is_row_selected (e_tree_get_selection_model (E_TREE (message_list)), row))
+               message_list_schedule_update_actions (message_list);
 }
 
 static gboolean
@@ -3204,6 +3243,11 @@ message_list_dispose (GObject *object)
                message_list->seen_id = 0;
        }
 
+       if (priv->update_actions_idle_id) {
+               g_source_remove (priv->update_actions_idle_id);
+               priv->update_actions_idle_id = 0;
+       }
+
        /* Chain up to parent's dispose() method. */
        G_OBJECT_CLASS (message_list_parent_class)->dispose (object);
 }
@@ -3884,6 +3928,16 @@ message_list_class_init (MessageListClass *class)
                NULL,
                g_cclosure_marshal_VOID__VOID,
                G_TYPE_NONE, 0);
+
+       signals[UPDATE_ACTIONS] = g_signal_new (
+               "update-actions",
+               MESSAGE_LIST_TYPE,
+               G_SIGNAL_RUN_LAST,
+               0, /* G_STRUCT_OFFSET (MessageListClass, update_actions), */
+               NULL,
+               NULL,
+               g_cclosure_marshal_VOID__VOID,
+               G_TYPE_NONE, 0);
 }
 
 static void


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