[evolution/gnome-3-34] I#603 - Cannot reply to the first message in a collapsed thread
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/gnome-3-34] I#603 - Cannot reply to the first message in a collapsed thread
- Date: Mon, 9 Sep 2019 10:03:53 +0000 (UTC)
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]