diff options
author | Milan Crha <mcrha@redhat.com> | 2023-05-10 11:14:54 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2023-05-10 11:14:54 +0200 |
commit | 95d11dc046e1ec366911f19858f49bcfab9348c8 (patch) | |
tree | 4725c19d7754ec7cd8c183ee17a3d61e66591911 | |
parent | cd4e1f4feb0b165acfe8d9a321aa25307529e88c (diff) | |
download | evolution-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.c | 9 | ||||
-rw-r--r-- | src/modules/mail/e-mail-shell-view.c | 171 | ||||
-rw-r--r-- | src/shell/e-shell-searchbar.c | 17 |
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); } /** |