summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2023-05-10 11:14:54 +0200
committerMilan Crha <mcrha@redhat.com>2023-05-10 11:14:54 +0200
commit95d11dc046e1ec366911f19858f49bcfab9348c8 (patch)
tree4725c19d7754ec7cd8c183ee17a3d61e66591911
parentcd4e1f4feb0b165acfe8d9a321aa25307529e88c (diff)
downloadevolution-95d11dc046e1ec366911f19858f49bcfab9348c8.tar.gz
I#1039 - Mail: Cannot change the search domain with active search
Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1039
-rw-r--r--src/modules/mail/e-mail-shell-view-private.c9
-rw-r--r--src/modules/mail/e-mail-shell-view.c171
-rw-r--r--src/shell/e-shell-searchbar.c17
3 files changed, 80 insertions, 117 deletions
diff --git a/src/modules/mail/e-mail-shell-view-private.c b/src/modules/mail/e-mail-shell-view-private.c
index 40a37002a2..2e67db978d 100644
--- a/src/modules/mail/e-mail-shell-view-private.c
+++ b/src/modules/mail/e-mail-shell-view-private.c
@@ -573,7 +573,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
mail_shell_content = E_MAIL_SHELL_CONTENT (shell_content);
mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
searchbar = e_mail_shell_content_get_searchbar (mail_shell_content);
- combo_box = e_shell_searchbar_get_scope_combo_box (searchbar);
reader = E_MAIL_READER (shell_content);
display = e_mail_reader_get_mail_display (reader);
@@ -581,14 +580,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
em_folder_tree_set_selectable_widget (folder_tree, message_list);
- /* The folder tree and scope combo box are both insensitive
- * when searching beyond the currently selected folder. */
- e_binding_bind_property (
- folder_tree, "sensitive",
- combo_box, "sensitive",
- G_BINDING_BIDIRECTIONAL |
- G_BINDING_SYNC_CREATE);
-
combo_box = e_shell_searchbar_get_filter_combo_box (searchbar);
g_signal_connect_object (
combo_box, "changed",
diff --git a/src/modules/mail/e-mail-shell-view.c b/src/modules/mail/e-mail-shell-view.c
index 9084a6d459..bbc1c49d61 100644
--- a/src/modules/mail/e-mail-shell-view.c
+++ b/src/modules/mail/e-mail-shell-view.c
@@ -636,6 +636,53 @@ mail_shell_view_construct_filter_message_thread (EMailShellView *mail_shell_view
}
static void
+mail_shell_view_restore_selected_folder (EShellView *shell_view)
+{
+ EShellSidebar *shell_sidebar;
+ EMailReader *reader;
+ EMFolderTree *folder_tree;
+ CamelStore *selected_store = NULL;
+ gchar *selected_folder_name = NULL;
+
+ shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+ folder_tree = e_mail_shell_sidebar_get_folder_tree (E_MAIL_SHELL_SIDEBAR (shell_sidebar));
+
+ reader = E_MAIL_READER (e_mail_shell_content_get_mail_view (E_MAIL_SHELL_CONTENT (e_shell_view_get_shell_content (shell_view))));
+
+ /* Reset the message list to the current folder tree
+ * selection. This needs to happen synchronously to
+ * avoid search conflicts, so we can't just grab the
+ * folder URI and let the asynchronous callbacks run
+ * after we've already kicked off the search. */
+ em_folder_tree_get_selected (folder_tree, &selected_store, &selected_folder_name);
+ if (selected_store != NULL && selected_folder_name != NULL) {
+ CamelFolder *sel_folder;
+
+ sel_folder = camel_store_get_folder_sync (
+ selected_store, selected_folder_name,
+ 0, NULL, NULL);
+ e_mail_reader_set_folder (reader, sel_folder);
+ g_object_unref (sel_folder);
+ }
+
+ g_clear_object (&selected_store);
+ g_free (selected_folder_name);
+}
+
+static void
+mail_shell_view_stop_and_clear_search_vfolders (EMailShellView *mail_shell_view)
+{
+ if (mail_shell_view->priv->search_account_cancel) {
+ g_cancellable_cancel (mail_shell_view->priv->search_account_cancel);
+ g_clear_object (&mail_shell_view->priv->search_account_cancel);
+ }
+
+ g_clear_object (&mail_shell_view->priv->search_folder_and_subfolders);
+ g_clear_object (&mail_shell_view->priv->search_account_all);
+ g_clear_object (&mail_shell_view->priv->search_account_current);
+}
+
+static void
mail_shell_view_execute_search (EShellView *shell_view)
{
EMailShellViewPrivate *priv;
@@ -935,12 +982,16 @@ filter:
break;
}
+ gtk_widget_set_sensitive (GTK_WIDGET (folder_tree), TRUE);
+
/* Apply selected scope. */
combo_box = e_shell_searchbar_get_scope_combo_box (searchbar);
value = e_action_combo_box_get_current_value (combo_box);
switch (value) {
case MAIL_SCOPE_CURRENT_FOLDER:
+ mail_shell_view_stop_and_clear_search_vfolders (E_MAIL_SHELL_VIEW (shell_view));
+ mail_shell_view_restore_selected_folder (shell_view);
goto execute;
case MAIL_SCOPE_CURRENT_FOLDER_AND_SUBFOLDERS:
@@ -965,39 +1016,8 @@ filter:
* account-wide searches still in progress. */
text = e_shell_searchbar_get_search_text (searchbar);
if ((text == NULL || *text == '\0') && !e_shell_view_get_search_rule (shell_view)) {
- CamelStore *selected_store = NULL;
- gchar *selected_folder_name = NULL;
-
- g_clear_object (&priv->search_folder_and_subfolders);
-
- if (priv->search_account_cancel != NULL) {
- g_cancellable_cancel (priv->search_account_cancel);
- g_object_unref (priv->search_account_cancel);
- priv->search_account_cancel = NULL;
- }
-
- /* Reset the message list to the current folder tree
- * selection. This needs to happen synchronously to
- * avoid search conflicts, so we can't just grab the
- * folder URI and let the asynchronous callbacks run
- * after we've already kicked off the search. */
- em_folder_tree_get_selected (
- folder_tree, &selected_store, &selected_folder_name);
- if (selected_store != NULL && selected_folder_name != NULL) {
- CamelFolder *sel_folder;
-
- sel_folder = camel_store_get_folder_sync (
- selected_store, selected_folder_name,
- 0, NULL, NULL);
- e_mail_reader_set_folder (reader, sel_folder);
- g_object_unref (sel_folder);
- }
-
- g_clear_object (&selected_store);
- g_free (selected_folder_name);
-
- gtk_widget_set_sensitive (GTK_WIDGET (combo_box), TRUE);
-
+ mail_shell_view_stop_and_clear_search_vfolders (E_MAIL_SHELL_VIEW (shell_view));
+ mail_shell_view_restore_selected_folder (shell_view);
goto execute;
}
@@ -1012,9 +1032,6 @@ filter:
goto current_folder_and_subfolders_setup;
}
- /* Disable the scope combo while search is in progress. */
- gtk_widget_set_sensitive (GTK_WIDGET (combo_box), FALSE);
-
/* If we already have a search folder, reuse it. */
if (search_folder != NULL) {
if (priv->search_account_cancel != NULL) {
@@ -1046,6 +1063,8 @@ filter:
current_folder_and_subfolders_setup:
+ gtk_widget_set_sensitive (GTK_WIDGET (folder_tree), FALSE);
+
if (folder != NULL && folder != CAMEL_FOLDER (search_folder)) {
/* Just use the folder */
} else {
@@ -1084,39 +1103,8 @@ all_accounts:
* account-wide searches still in progress. */
text = e_shell_searchbar_get_search_text (searchbar);
if ((text == NULL || *text == '\0') && !e_shell_view_get_search_rule (shell_view)) {
- CamelStore *selected_store = NULL;
- gchar *selected_folder_name = NULL;
-
- g_clear_object (&priv->search_account_all);
-
- if (priv->search_account_cancel != NULL) {
- g_cancellable_cancel (priv->search_account_cancel);
- g_object_unref (priv->search_account_cancel);
- priv->search_account_cancel = NULL;
- }
-
- /* Reset the message list to the current folder tree
- * selection. This needs to happen synchronously to
- * avoid search conflicts, so we can't just grab the
- * folder URI and let the asynchronous callbacks run
- * after we've already kicked off the search. */
- em_folder_tree_get_selected (
- folder_tree, &selected_store, &selected_folder_name);
- if (selected_store != NULL && selected_folder_name != NULL) {
- CamelFolder *sel_folder;
-
- sel_folder = camel_store_get_folder_sync (
- selected_store, selected_folder_name,
- 0, NULL, NULL);
- e_mail_reader_set_folder (reader, sel_folder);
- g_object_unref (sel_folder);
- }
-
- g_clear_object (&selected_store);
- g_free (selected_folder_name);
-
- gtk_widget_set_sensitive (GTK_WIDGET (combo_box), TRUE);
-
+ mail_shell_view_stop_and_clear_search_vfolders (E_MAIL_SHELL_VIEW (shell_view));
+ mail_shell_view_restore_selected_folder (shell_view);
goto execute;
}
@@ -1131,9 +1119,6 @@ all_accounts:
goto all_accounts_setup;
}
- /* Disable the scope combo while search is in progress. */
- gtk_widget_set_sensitive (GTK_WIDGET (combo_box), FALSE);
-
/* If we already have a search folder, reuse it. */
if (search_folder != NULL) {
if (priv->search_account_cancel != NULL) {
@@ -1166,6 +1151,8 @@ all_accounts:
all_accounts_setup:
+ gtk_widget_set_sensitive (GTK_WIDGET (folder_tree), FALSE);
+
list = em_folder_tree_model_list_stores (EM_FOLDER_TREE_MODEL (
gtk_tree_view_get_model (GTK_TREE_VIEW (folder_tree))));
g_list_foreach (list, (GFunc) g_object_ref, NULL);
@@ -1192,39 +1179,8 @@ current_account:
* account-wide searches still in progress. */
text = e_shell_searchbar_get_search_text (searchbar);
if ((text == NULL || *text == '\0') && !e_shell_view_get_search_rule (shell_view)) {
- CamelStore *selected_store = NULL;
- gchar *selected_folder_name = NULL;
-
- g_clear_object (&priv->search_account_current);
-
- if (priv->search_account_cancel != NULL) {
- g_cancellable_cancel (priv->search_account_cancel);
- g_object_unref (priv->search_account_cancel);
- priv->search_account_cancel = NULL;
- }
-
- /* Reset the message list to the current folder tree
- * selection. This needs to happen synchronously to
- * avoid search conflicts, so we can't just grab the
- * folder URI and let the asynchronous callbacks run
- * after we've already kicked off the search. */
- em_folder_tree_get_selected (
- folder_tree, &selected_store, &selected_folder_name);
- if (selected_store != NULL && selected_folder_name != NULL) {
- CamelFolder *sel_folder;
-
- sel_folder = camel_store_get_folder_sync (
- selected_store, selected_folder_name,
- 0, NULL, NULL);
- e_mail_reader_set_folder (reader, sel_folder);
- g_object_unref (sel_folder);
- }
-
- g_clear_object (&selected_store);
- g_free (selected_folder_name);
-
- gtk_widget_set_sensitive (GTK_WIDGET (combo_box), TRUE);
-
+ mail_shell_view_stop_and_clear_search_vfolders (E_MAIL_SHELL_VIEW (shell_view));
+ mail_shell_view_restore_selected_folder (shell_view);
goto execute;
}
@@ -1239,9 +1195,6 @@ current_account:
goto current_accout_setup;
}
- /* Disable the scope combo while search is in progress. */
- gtk_widget_set_sensitive (GTK_WIDGET (combo_box), FALSE);
-
/* If we already have a search folder, reuse it. */
if (search_folder != NULL) {
if (priv->search_account_cancel != NULL) {
@@ -1274,6 +1227,8 @@ current_account:
current_accout_setup:
+ gtk_widget_set_sensitive (GTK_WIDGET (folder_tree), FALSE);
+
if (folder != NULL && folder != CAMEL_FOLDER (search_folder)) {
store = camel_folder_get_parent_store (folder);
if (store != NULL)
diff --git a/src/shell/e-shell-searchbar.c b/src/shell/e-shell-searchbar.c
index 9aea082037..d5c1821a77 100644
--- a/src/shell/e-shell-searchbar.c
+++ b/src/shell/e-shell-searchbar.c
@@ -380,6 +380,18 @@ shell_searchbar_entry_changed_cb (EShellSearchbar *searchbar)
}
static void
+e_shell_searchbar_scope_changed_cb (EShellSearchbar *searchbar)
+{
+ if (gtk_widget_is_visible (searchbar->priv->scope_combo_box)) {
+ EShellView *shell_view;
+
+ shell_view = e_shell_searchbar_get_shell_view (searchbar);
+
+ e_shell_view_execute_search (shell_view);
+ }
+}
+
+static void
shell_searchbar_entry_icon_press_cb (EShellSearchbar *searchbar,
GtkEntryIconPosition icon_pos,
GdkEvent *event)
@@ -1035,6 +1047,11 @@ e_shell_searchbar_init (EShellSearchbar *searchbar)
gtk_box_pack_start (box, widget, FALSE, FALSE, 0);
searchbar->priv->scope_combo_box = widget;
gtk_widget_show (widget);
+
+ g_signal_connect_object (
+ widget, "changed",
+ G_CALLBACK (e_shell_searchbar_scope_changed_cb),
+ searchbar, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
}
/**