[evolution] I#981 - Mail: Misleading message when searching in multiple folders



commit 396d361905fbfbc82eba1945bef8083c32fcd936
Author: Milan Crha <mcrha redhat com>
Date:   Mon Aug 31 14:13:05 2020 +0200

    I#981 - Mail: Misleading message when searching in multiple folders
    
    Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/981

 src/mail/message-list.c              | 99 ++++++++++++++++++++++++++----------
 src/mail/message-list.h              |  6 +++
 src/modules/mail/e-mail-shell-view.c | 21 +++++++-
 3 files changed, 97 insertions(+), 29 deletions(-)
---
diff --git a/src/mail/message-list.c b/src/mail/message-list.c
index 2c5741a139..8bf52208fe 100644
--- a/src/mail/message-list.c
+++ b/src/mail/message-list.c
@@ -134,6 +134,8 @@ struct _MessageListPrivate {
        gchar *new_mail_fg_color;
 
        guint update_actions_idle_id;
+
+       volatile gint setting_up_search_folder;
 };
 
 /* XXX Plain GNode suffers from O(N) tail insertions, and that won't
@@ -6422,6 +6424,50 @@ message_list_correct_row_for_remove_in_selection (MessageList *message_list,
        return best_row;
 }
 
+static void
+message_list_update_tree_text (MessageList *message_list)
+{
+       ETreeTableAdapter *adapter;
+       ETree *tree;
+       const gchar *info_message;
+       gboolean have_search_expr;
+       gint row_count;
+
+       g_return_if_fail (IS_MESSAGE_LIST (message_list));
+       g_return_if_fail (e_util_is_main_thread (g_thread_self ()));
+
+       if (!gtk_widget_get_visible (GTK_WIDGET (message_list)))
+               return;
+
+       tree = E_TREE (message_list);
+       adapter = e_tree_get_table_adapter (tree);
+       row_count = e_table_model_row_count (E_TABLE_MODEL (adapter));
+
+       /* space is used to indicate no search too */
+       have_search_expr =
+               (message_list->search != NULL) &&
+               (*message_list->search != '\0') &&
+               (strcmp (message_list->search, " ") != 0);
+
+       if (row_count > 0) {
+               info_message = NULL;
+       } else if (message_list_is_setting_up_search_folder (message_list)) {
+               info_message = _("Generating message list…");
+       } else if (have_search_expr) {
+               info_message =
+                       _("No message satisfies your search criteria. "
+                       "Change search criteria by selecting a new "
+                       "Show message filter from the drop down list "
+                       "above or by running a new search either by "
+                       "clearing it with Search→Clear menu item or "
+                       "by changing the query above.");
+       } else {
+               info_message = _("There are no messages in this folder.");
+       }
+
+       e_tree_set_info_message (tree, info_message);
+}
+
 static void
 message_list_regen_done_cb (GObject *source_object,
                             GAsyncResult *result,
@@ -6774,33 +6820,7 @@ message_list_regen_done_cb (GObject *source_object,
        if (last_row_uid)
                camel_pstring_free (last_row_uid);
 
-       if (gtk_widget_get_visible (GTK_WIDGET (message_list))) {
-               const gchar *info_message;
-               gboolean have_search_expr;
-
-               /* space is used to indicate no search too */
-               have_search_expr =
-                       (message_list->search != NULL) &&
-                       (*message_list->search != '\0') &&
-                       (strcmp (message_list->search, " ") != 0);
-
-               if (row_count > 0) {
-                       info_message = NULL;
-               } else if (have_search_expr) {
-                       info_message =
-                               _("No message satisfies your search criteria. "
-                               "Change search criteria by selecting a new "
-                               "Show message filter from the drop down list "
-                               "above or by running a new search either by "
-                               "clearing it with Search→Clear menu item or "
-                               "by changing the query above.");
-               } else {
-                       info_message =
-                               _("There are no messages in this folder.");
-               }
-
-               e_tree_set_info_message (tree, info_message);
-       }
+       message_list_update_tree_text (message_list);
 
        g_signal_handlers_unblock_by_func (
                adapter, ml_tree_sorting_changed, message_list);
@@ -7086,3 +7106,28 @@ message_list_contains_uid (MessageList *message_list,
 
        return g_hash_table_lookup (message_list->uid_nodemap, uid) != NULL;
 }
+
+void
+message_list_inc_setting_up_search_folder (MessageList *message_list)
+{
+       g_return_if_fail (IS_MESSAGE_LIST (message_list));
+
+       g_atomic_int_add (&message_list->priv->setting_up_search_folder, 1);
+}
+
+void
+message_list_dec_setting_up_search_folder (MessageList *message_list)
+{
+       g_return_if_fail (IS_MESSAGE_LIST (message_list));
+
+       if (g_atomic_int_dec_and_test (&message_list->priv->setting_up_search_folder))
+               message_list_update_tree_text (message_list);
+}
+
+gboolean
+message_list_is_setting_up_search_folder (MessageList *message_list)
+{
+       g_return_val_if_fail (IS_MESSAGE_LIST (message_list), FALSE);
+
+       return g_atomic_int_get (&message_list->priv->setting_up_search_folder) > 0;
+}
diff --git a/src/mail/message-list.h b/src/mail/message-list.h
index 3888e2803f..bbb7100fad 100644
--- a/src/mail/message-list.h
+++ b/src/mail/message-list.h
@@ -235,6 +235,12 @@ void               message_list_sort_uids          (MessageList *message_list,
                                                 GPtrArray *uids);
 gboolean       message_list_contains_uid       (MessageList *message_list,
                                                 const gchar *uid);
+void           message_list_inc_setting_up_search_folder
+                                               (MessageList *message_list);
+void           message_list_dec_setting_up_search_folder
+                                               (MessageList *message_list);
+gboolean       message_list_is_setting_up_search_folder
+                                               (MessageList *message_list);
 
 G_END_DECLS
 
diff --git a/src/modules/mail/e-mail-shell-view.c b/src/modules/mail/e-mail-shell-view.c
index 94bebd4848..263969240a 100644
--- a/src/modules/mail/e-mail-shell-view.c
+++ b/src/modules/mail/e-mail-shell-view.c
@@ -107,6 +107,7 @@ add_folders_from_store (GList **folders,
 typedef struct {
        MailMsg base;
 
+       MessageList *message_list;
        CamelFolder *folder;
        GCancellable *cancellable;
        GList *stores_list;
@@ -148,11 +149,13 @@ search_results_exec (SearchResultsMsg *msg,
 static void
 search_results_done (SearchResultsMsg *msg)
 {
+       message_list_dec_setting_up_search_folder (msg->message_list);
 }
 
 static void
 search_results_free (SearchResultsMsg *msg)
 {
+       g_object_unref (msg->message_list);
        g_object_unref (msg->folder);
        g_list_free_full (msg->stores_list, g_object_unref);
 }
@@ -166,7 +169,8 @@ static MailMsgInfo search_results_setup_info = {
 };
 
 static gint
-mail_shell_view_setup_search_results_folder (CamelFolder *folder,
+mail_shell_view_setup_search_results_folder (MessageList *message_list,
+                                            CamelFolder *folder,
                                              GList *stores,
                                              GCancellable *cancellable)
 {
@@ -176,10 +180,13 @@ mail_shell_view_setup_search_results_folder (CamelFolder *folder,
        g_object_ref (folder);
 
        msg = mail_msg_new (&search_results_setup_info);
+       msg->message_list = g_object_ref (message_list);
        msg->folder = folder;
        msg->cancellable = cancellable;
        msg->stores_list = stores;
 
+       message_list_inc_setting_up_search_folder (message_list);
+
        id = msg->base.seq;
        mail_msg_slow_ordered_push (msg);
 
@@ -189,6 +196,7 @@ mail_shell_view_setup_search_results_folder (CamelFolder *folder,
 typedef struct {
        MailMsg base;
 
+       MessageList *message_list;
        CamelFolder *vfolder;
        GCancellable *cancellable;
        CamelFolder *root_folder;
@@ -261,11 +269,13 @@ search_results_with_subfolders_exec (SearchResultsWithSubfoldersMsg *msg,
 static void
 search_results_with_subfolders_done (SearchResultsWithSubfoldersMsg *msg)
 {
+       message_list_dec_setting_up_search_folder (msg->message_list);
 }
 
 static void
 search_results_with_subfolders_free (SearchResultsWithSubfoldersMsg *msg)
 {
+       g_object_unref (msg->message_list);
        g_object_unref (msg->vfolder);
        g_object_unref (msg->root_folder);
 }
@@ -279,7 +289,8 @@ static MailMsgInfo search_results_with_subfolders_setup_info = {
 };
 
 static gint
-mail_shell_view_setup_search_results_folder_and_subfolders (CamelFolder *vfolder,
+mail_shell_view_setup_search_results_folder_and_subfolders (MessageList *message_list,
+                                                           CamelFolder *vfolder,
                                                            CamelFolder *root_folder,
                                                            GCancellable *cancellable)
 {
@@ -290,10 +301,13 @@ mail_shell_view_setup_search_results_folder_and_subfolders (CamelFolder *vfolder
                return 0;
 
        msg = mail_msg_new (&search_results_with_subfolders_setup_info);
+       msg->message_list = g_object_ref (message_list);
        msg->vfolder = g_object_ref (vfolder);
        msg->cancellable = cancellable;
        msg->root_folder = g_object_ref (root_folder);
 
+       message_list_inc_setting_up_search_folder (message_list);
+
        id = msg->base.seq;
        mail_msg_slow_ordered_push (msg);
 
@@ -1055,6 +1069,7 @@ filter:
        priv->search_account_cancel = camel_operation_new ();
 
        mail_shell_view_setup_search_results_folder_and_subfolders (
+               MESSAGE_LIST (message_list),
                CAMEL_FOLDER (search_folder), folder,
                priv->search_account_cancel);
 
@@ -1165,6 +1180,7 @@ all_accounts_setup:
 
        /* This takes ownership of the stores list. */
        mail_shell_view_setup_search_results_folder (
+               MESSAGE_LIST (message_list),
                CAMEL_FOLDER (search_folder), list,
                priv->search_account_cancel);
 
@@ -1285,6 +1301,7 @@ current_accout_setup:
 
        /* This takes ownership of the stores list. */
        mail_shell_view_setup_search_results_folder (
+               MESSAGE_LIST (message_list),
                CAMEL_FOLDER (search_folder), list,
                priv->search_account_cancel);
 


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