[evolution] Bug 262328 - Selecting collapsed threads only selects the first message
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Bug 262328 - Selecting collapsed threads only selects the first message
- Date: Thu, 30 Nov 2017 11:50:13 +0000 (UTC)
commit ad32bd159acf512e2ec989b63e6c1b6e62014275
Author: Milan Crha <mcrha redhat com>
Date: Thu Nov 30 12:49:58 2017 +0100
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 34c0ad4..7e2f4d7 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 8930024..bead182 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 6f3fb26..63c2f12 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 0a1e80e..1b107af 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 801e88d..255185a 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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]