From ad32bd159acf512e2ec989b63e6c1b6e62014275 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 30 Nov 2017 12:49:58 +0100 Subject: [PATCH] Bug 262328 - Selecting collapsed threads only selects the first message --- src/mail/e-mail-reader-utils.c | 6 ++--- src/mail/e-mail-reader.c | 50 +++++++++++++++++++++++++++++++----------- src/mail/e-mail-reader.h | 7 ++++++ src/mail/message-list.c | 46 ++++++++++++++++++++++++++++++++++---- src/mail/message-list.h | 2 ++ 5 files changed, 91 insertions(+), 20 deletions(-) diff --git a/src/mail/e-mail-reader-utils.c b/src/mail/e-mail-reader-utils.c index 34c0ad4c29..7e2f4d73c3 100644 --- a/src/mail/e-mail-reader-utils.c +++ b/src/mail/e-mail-reader-utils.c @@ -1033,7 +1033,7 @@ e_mail_reader_mark_selected (EMailReader *reader, camel_folder_freeze (folder); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); for (ii = 0; ii < uids->len; ii++) camel_folder_set_message_flags ( @@ -1323,7 +1323,7 @@ e_mail_reader_mark_selected_ignore_thread (EMailReader *reader, GPtrArray *uids; guint ii; - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); if (uids && uids->len > 0) { MarkIgnoreThreadData *mit; EAlertSink *alert_sink; @@ -1881,7 +1881,7 @@ e_mail_reader_remove_duplicates (EMailReader *reader) g_return_if_fail (E_IS_MAIL_READER (reader)); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); g_return_if_fail (uids != NULL); /* Find duplicate messages asynchronously. */ diff --git a/src/mail/e-mail-reader.c b/src/mail/e-mail-reader.c index 8930024fd6..bead182323 100644 --- a/src/mail/e-mail-reader.c +++ b/src/mail/e-mail-reader.c @@ -309,7 +309,7 @@ action_mail_check_for_junk_cb (GtkAction *action, folder = e_mail_reader_ref_folder (reader); backend = e_mail_reader_get_backend (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); session = e_mail_backend_get_session (backend); @@ -341,7 +341,7 @@ mail_reader_copy_or_move_selected_messages (EMailReader *reader, folder = e_mail_reader_ref_folder (reader); window = e_mail_reader_get_window (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); model = em_folder_tree_model_get_default (); @@ -605,7 +605,7 @@ action_mail_filters_apply_cb (GtkAction *action, folder = e_mail_reader_ref_folder (reader); backend = e_mail_reader_get_backend (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); session = e_mail_backend_get_session (backend); @@ -649,7 +649,7 @@ action_mail_flag_clear_cb (GtkAction *action, folder = e_mail_reader_ref_folder (reader); display = e_mail_reader_get_mail_display (reader); - uids = e_mail_reader_get_selected_uids (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); @@ -671,7 +671,7 @@ action_mail_flag_completed_cb (GtkAction *action, folder = e_mail_reader_ref_folder (reader); display = e_mail_reader_get_mail_display (reader); - uids = e_mail_reader_get_selected_uids (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); @@ -690,7 +690,7 @@ action_mail_flag_for_followup_cb (GtkAction *action, GPtrArray *uids; folder = e_mail_reader_ref_folder (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); em_utils_flag_for_followup (reader, folder, uids); @@ -706,7 +706,7 @@ action_mail_forward_cb (GtkAction *action, GPtrArray *uids; window = e_mail_reader_get_window (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); g_return_if_fail (uids != NULL); if (em_utils_ask_open_many (window, uids->len)) { @@ -732,7 +732,7 @@ action_mail_forward_attached_cb (GtkAction *action, GPtrArray *uids; window = e_mail_reader_get_window (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); g_return_if_fail (uids != NULL); if (em_utils_ask_open_many (window, uids->len)) { @@ -758,7 +758,7 @@ action_mail_forward_inline_cb (GtkAction *action, GPtrArray *uids; window = e_mail_reader_get_window (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); g_return_if_fail (uids != NULL); if (em_utils_ask_open_many (window, uids->len)) { @@ -784,7 +784,7 @@ action_mail_forward_quoted_cb (GtkAction *action, GPtrArray *uids; window = e_mail_reader_get_window (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); g_return_if_fail (uids != NULL); if (em_utils_ask_open_many (window, uids->len)) { @@ -1070,7 +1070,7 @@ action_mail_archive_cb (GtkAction *action, backend = e_mail_reader_get_backend (reader); session = e_mail_backend_get_session (backend); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); g_return_if_fail (uids != NULL); folder = e_mail_reader_ref_folder (reader); @@ -1924,7 +1924,7 @@ action_mail_toggle_important_cb (GtkAction *action, guint ii; folder = e_mail_reader_ref_folder (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); camel_folder_freeze (folder); @@ -3439,6 +3439,16 @@ mail_reader_get_selected_uids (EMailReader *reader) return message_list_get_selected (MESSAGE_LIST (message_list)); } +static GPtrArray * +mail_reader_get_selected_uids_with_collapsed_threads (EMailReader *reader) +{ + GtkWidget *message_list; + + message_list = e_mail_reader_get_message_list (reader); + + return message_list_get_selected_with_collapsed_threads (MESSAGE_LIST (message_list)); +} + static CamelFolder * mail_reader_ref_folder (EMailReader *reader) { @@ -4146,6 +4156,7 @@ e_mail_reader_default_init (EMailReaderInterface *iface) iface->get_alert_sink = mail_reader_get_alert_sink; iface->get_selected_uids = mail_reader_get_selected_uids; + iface->get_selected_uids_with_collapsed_threads = mail_reader_get_selected_uids_with_collapsed_threads; iface->ref_folder = mail_reader_ref_folder; iface->set_folder = mail_reader_set_folder; iface->set_message = mail_reader_set_message; @@ -4615,7 +4626,7 @@ e_mail_reader_check_state (EMailReader *reader) E_MAIL_UI_SESSION (mail_session)); folder = e_mail_reader_ref_folder (reader); - uids = e_mail_reader_get_selected_uids (reader); + uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader); if (folder != NULL) { gchar *archive_folder; @@ -4964,6 +4975,19 @@ e_mail_reader_get_selected_uids (EMailReader *reader) return iface->get_selected_uids (reader); } +GPtrArray * +e_mail_reader_get_selected_uids_with_collapsed_threads (EMailReader *reader) +{ + EMailReaderInterface *iface; + + g_return_val_if_fail (E_IS_MAIL_READER (reader), NULL); + + iface = E_MAIL_READER_GET_INTERFACE (reader); + g_return_val_if_fail (iface->get_selected_uids_with_collapsed_threads != NULL, NULL); + + return iface->get_selected_uids_with_collapsed_threads (reader); +} + GtkWindow * e_mail_reader_get_window (EMailReader *reader) { diff --git a/src/mail/e-mail-reader.h b/src/mail/e-mail-reader.h index 6f3fb26f92..63c2f12e3a 100644 --- a/src/mail/e-mail-reader.h +++ b/src/mail/e-mail-reader.h @@ -108,6 +108,8 @@ struct _EMailReaderInterface { GtkMenu * (*get_popup_menu) (EMailReader *reader); EPreviewPane * (*get_preview_pane) (EMailReader *reader); GPtrArray * (*get_selected_uids) (EMailReader *reader); + GPtrArray * (*get_selected_uids_with_collapsed_threads) + (EMailReader *reader); GtkWindow * (*get_window) (EMailReader *reader); CamelFolder * (*ref_folder) (EMailReader *reader); @@ -131,6 +133,9 @@ struct _EMailReaderInterface { void (*show_search_bar) (EMailReader *reader); void (*update_actions) (EMailReader *reader, guint32 state); + + /* Padding for future expansion */ + gpointer reserved[4]; }; GType e_mail_reader_get_type (void); @@ -157,6 +162,8 @@ guint e_mail_reader_open_selected_mail GtkMenu * e_mail_reader_get_popup_menu (EMailReader *reader); EPreviewPane * e_mail_reader_get_preview_pane (EMailReader *reader); GPtrArray * e_mail_reader_get_selected_uids (EMailReader *reader); +GPtrArray * e_mail_reader_get_selected_uids_with_collapsed_threads + (EMailReader *reader); GtkWindow * e_mail_reader_get_window (EMailReader *reader); CamelFolder * e_mail_reader_ref_folder (EMailReader *reader); void e_mail_reader_set_folder (EMailReader *reader, diff --git a/src/mail/message-list.c b/src/mail/message-list.c index 0a1e80e839..1b107af84b 100644 --- a/src/mail/message-list.c +++ b/src/mail/message-list.c @@ -1474,7 +1474,7 @@ message_list_copy (MessageList *message_list, clear_selection (message_list, &priv->clipboard); - uids = message_list_get_selected (message_list); + uids = message_list_get_selected_with_collapsed_threads (message_list); if (uids->len > 0) { if (cut) { @@ -2506,7 +2506,7 @@ ml_tree_drag_data_get (ETree *tree, GPtrArray *uids; folder = message_list_ref_folder (message_list); - uids = message_list_get_selected (message_list); + uids = message_list_get_selected_with_collapsed_threads (message_list); if (uids->len > 0) { switch (info) { @@ -5386,9 +5386,27 @@ on_click (ETree *tree, struct _ml_selected_data { MessageList *message_list; + ETreeTableAdapter *adapter; + gboolean with_collapsed_threads; GPtrArray *uids; }; +static gboolean +ml_getselected_collapsed_cb (ETreeModel *tree_model, + ETreePath path, + gpointer user_data) +{ + struct _ml_selected_data *data = user_data; + const gchar *uid; + GNode *node = (GNode *) path; + + uid = get_message_uid (data->message_list, node); + g_return_val_if_fail (uid != NULL, FALSE); + g_ptr_array_add (data->uids, g_strdup (uid)); + + return FALSE; +} + static void ml_getselected_cb (GNode *node, gpointer user_data) @@ -5402,10 +5420,16 @@ ml_getselected_cb (GNode *node, uid = get_message_uid (data->message_list, node); g_return_if_fail (uid != NULL); g_ptr_array_add (data->uids, g_strdup (uid)); + + if (data->with_collapsed_threads && g_node_first_child (node) && + !e_tree_table_adapter_node_is_expanded (data->adapter, node)) { + e_tree_model_node_traverse (E_TREE_MODEL (data->message_list), node, ml_getselected_collapsed_cb, data); + } } -GPtrArray * -message_list_get_selected (MessageList *message_list) +static GPtrArray * +message_list_get_selected_full (MessageList *message_list, + gboolean with_collapsed_threads) { CamelFolder *folder; ESelectionModel *selection; @@ -5417,6 +5441,8 @@ message_list_get_selected (MessageList *message_list) g_return_val_if_fail (IS_MESSAGE_LIST (message_list), NULL); + data.adapter = e_tree_get_table_adapter (E_TREE (message_list)); + data.with_collapsed_threads = with_collapsed_threads; data.uids = g_ptr_array_new (); g_ptr_array_set_free_func (data.uids, (GDestroyNotify) g_free); @@ -5436,6 +5462,18 @@ message_list_get_selected (MessageList *message_list) return data.uids; } +GPtrArray * +message_list_get_selected (MessageList *message_list) +{ + return message_list_get_selected_full (message_list, FALSE); +} + +GPtrArray * +message_list_get_selected_with_collapsed_threads (MessageList *message_list) +{ + return message_list_get_selected_full (message_list, TRUE); +} + void message_list_set_selected (MessageList *message_list, GPtrArray *uids) diff --git a/src/mail/message-list.h b/src/mail/message-list.h index 801e88d6de..255185a603 100644 --- a/src/mail/message-list.h +++ b/src/mail/message-list.h @@ -191,6 +191,8 @@ void message_list_set_thread_subject (MessageList *message_list, void message_list_freeze (MessageList *message_list); void message_list_thaw (MessageList *message_list); GPtrArray * message_list_get_selected (MessageList *message_list); +GPtrArray * message_list_get_selected_with_collapsed_threads + (MessageList *message_list); void message_list_set_selected (MessageList *message_list, GPtrArray *uids); gboolean message_list_select (MessageList *message_list, -- 2.11.4.GIT