[evolution] I#981 - Mail: Misleading message when searching in multiple folders
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] I#981 - Mail: Misleading message when searching in multiple folders
- Date: Mon, 31 Aug 2020 12:14:34 +0000 (UTC)
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]