From 8cf82ab0767b47dd8de8be7928a29009d3ec1270 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 9 May 2007 23:50:44 +0100 Subject: Use a filter for the search model in OPERATION_MODE_SEARCH Add a GtkTreeModelFilter model and use it to filter the results of the search. Translate every iterator for the search model from the filter to the real model, in case we have a path or we are dealing with user selection. The visibility function of the filter model is empty. Signed-off-by: Emmanuele Bassi --- gtk/gtkfilechooserdefault.c | 83 ++++++++++++++++++++++++++++++++----------- gtk/gtkfilechooserprivate.h | 1 + 2 files changed, 63 insertions(+), 21 deletions(-) diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index f4ab89a..8d43008 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -2645,7 +2645,9 @@ add_bookmark_foreach_cb (GtkTreeModel *model, break; case OPERATION_MODE_SEARCH: - gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), iter, + gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, + &child_iter, iter); + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter, SEARCH_MODEL_COL_PATH, &file_path, -1); break; @@ -2779,7 +2781,8 @@ selection_check_foreach_cb (GtkTreeModel *model, break; case OPERATION_MODE_SEARCH: - gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), iter, + gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->search_model_filter, &child_iter, iter); + gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), &child_iter, SEARCH_MODEL_COL_IS_FOLDER, &is_folder, -1); break; @@ -2852,7 +2855,8 @@ get_selected_path_foreach_cb (GtkTreeModel *model, break; case OPERATION_MODE_SEARCH: - gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), iter, + gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->search_model_filter, &child_iter, iter); + gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), &child_iter, SEARCH_MODEL_COL_PATH, &closure->path, -1); break; @@ -2914,7 +2918,8 @@ update_tooltip (GtkTreeModel *model, break; case OPERATION_MODE_SEARCH: - gtk_tree_model_get (GTK_TREE_MODEL (udata->impl->search_model), iter, + gtk_tree_model_filter_convert_iter_to_child_iter (udata->impl->search_model_filter, &child_iter, iter); + gtk_tree_model_get (GTK_TREE_MODEL (udata->impl->search_model), &child_iter, SEARCH_MODEL_COL_DISPLAY_NAME, &display_name, -1); break; @@ -6677,8 +6682,10 @@ update_chooser_entry (GtkFileChooserDefault *impl) } else if (impl->operation_mode == OPERATION_MODE_SEARCH) { - gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), - &closure.first_selected_iter, + gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, + &child_iter, + &closure.first_selected_iter); + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter, SEARCH_MODEL_COL_DISPLAY_NAME, &file_part, -1); } @@ -8742,7 +8749,7 @@ search_engine_finished_cb (GtkSearchEngine *engine, * but it'll make the search look like blocked. */ gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), - GTK_TREE_MODEL (impl->search_model)); + GTK_TREE_MODEL (impl->search_model_filter)); #endif /* FMQ: if search was empty, say that we got no hits */ @@ -8819,6 +8826,9 @@ search_clear_model (GtkFileChooserDefault *impl, g_object_unref (impl->search_model); impl->search_model = NULL; + + g_object_unref (impl->search_model_filter); + impl->search_model_filter = NULL; if (remove_from_treeview) gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), NULL); @@ -8934,11 +8944,21 @@ search_column_mtime_sort_func (GtkTreeModel *model, return 0; } +/* Visibility function for the recent filter model */ +static gboolean +search_model_visible_func (GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) +{ + return TRUE; +} + /* Creates the search_model and puts it in the tree view */ static void search_setup_model (GtkFileChooserDefault *impl) { g_assert (impl->search_model == NULL); + g_assert (impl->search_model_filter == NULL); /* We store these columns in the search model: * @@ -8981,12 +9001,18 @@ search_setup_model (GtkFileChooserDefault *impl) SEARCH_MODEL_COL_STAT, GTK_SORT_DESCENDING); + impl->search_model_filter = + GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (impl->search_model), NULL)); + gtk_tree_model_filter_set_visible_func (impl->search_model_filter, + search_model_visible_func, + impl, NULL); + /* EB: setting the model here will make the hits list update feel * more "alive" than setting the model at the end of the search * run */ gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), - GTK_TREE_MODEL (impl->search_model)); + GTK_TREE_MODEL (impl->search_model_filter)); } /* Creates a new query with the specified text and launches it */ @@ -9151,6 +9177,7 @@ search_activate (GtkFileChooserDefault *impl) g_assert (impl->search_hbox == NULL); g_assert (impl->search_entry == NULL); g_assert (impl->search_model == NULL); + g_assert (impl->search_model_filter == NULL); search_setup_widgets (impl); file_list_set_sort_column_ids (impl); @@ -9755,12 +9782,13 @@ check_preview_change (GtkFileChooserDefault *impl) new_display_name = NULL; if (cursor_path) { + GtkTreeIter child_iter; + if (impl->operation_mode == OPERATION_MODE_BROWSE) { if (impl->sort_model) { GtkTreeIter iter; - GtkTreeIter child_iter; const GtkFileInfo *new_info; gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->sort_model), &iter, cursor_path); @@ -9778,10 +9806,13 @@ check_preview_change (GtkFileChooserDefault *impl) { GtkTreeIter iter; - gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model), &iter, cursor_path); + gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_filter), + &iter, cursor_path); gtk_tree_path_free (cursor_path); - gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &iter, + gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, + &child_iter, &iter); + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter, SEARCH_MODEL_COL_PATH, &new_path, SEARCH_MODEL_COL_DISPLAY_NAME, &new_display_name, -1); @@ -9789,7 +9820,6 @@ check_preview_change (GtkFileChooserDefault *impl) else if (impl->operation_mode == OPERATION_MODE_RECENT) { GtkTreeIter iter; - GtkTreeIter child_iter; gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model_filter), &iter, cursor_path); @@ -10162,6 +10192,7 @@ list_row_activated (GtkTreeView *tree_view, GtkFileChooserDefault *impl) { GtkTreeIter iter; + GtkTreeIter child_iter; switch (impl->operation_mode) { @@ -10170,10 +10201,12 @@ list_row_activated (GtkTreeView *tree_view, GtkFilePath *file_path; gboolean is_folder; - if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model), &iter, path)) + if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_filter), &iter, path)) return; - gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &iter, + gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, + &child_iter, &iter); + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter, SEARCH_MODEL_COL_PATH, &file_path, SEARCH_MODEL_COL_IS_FOLDER, &is_folder, -1); @@ -10190,7 +10223,6 @@ list_row_activated (GtkTreeView *tree_view, case OPERATION_MODE_RECENT: { - GtkTreeIter child_iter; GtkFilePath *file_path; gboolean is_folder; @@ -10217,7 +10249,6 @@ list_row_activated (GtkTreeView *tree_view, case OPERATION_MODE_BROWSE: { - GtkTreeIter child_iter; const GtkFileInfo *info; if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->sort_model), &iter, path)) @@ -10296,10 +10327,16 @@ list_icon_data_func (GtkTreeViewColumn *tree_column, switch (impl->operation_mode) { case OPERATION_MODE_SEARCH: - gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), iter, - SEARCH_MODEL_COL_PIXBUF, &pixbuf, + { + GtkTreeIter child_iter; + + gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, + &child_iter, iter); + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter, + SEARCH_MODEL_COL_PIXBUF, &pixbuf, -1); - sensitive = TRUE; + sensitive = TRUE; + } break; case OPERATION_MODE_RECENT: @@ -10379,11 +10416,13 @@ list_name_data_func (GtkTreeViewColumn *tree_column, if (impl->operation_mode == OPERATION_MODE_SEARCH) { + GtkTreeIter child_iter; GtkFilePath *file_path; gchar *display_name, *tmp; gchar *text; - gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), iter, + gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, &child_iter, iter); + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter, SEARCH_MODEL_COL_PATH, &file_path, SEARCH_MODEL_COL_DISPLAY_NAME, &display_name, -1); @@ -10527,9 +10566,11 @@ list_mtime_data_func (GtkTreeViewColumn *tree_column, if (impl->operation_mode == OPERATION_MODE_SEARCH) { + GtkTreeIter child_iter; struct stat *statbuf; - gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), iter, + gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, &child_iter, iter); + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter, SEARCH_MODEL_COL_STAT, &statbuf, -1); time_mtime = statbuf->st_mtime; diff --git a/gtk/gtkfilechooserprivate.h b/gtk/gtkfilechooserprivate.h index f7820aa..d5e87d8 100644 --- a/gtk/gtkfilechooserprivate.h +++ b/gtk/gtkfilechooserprivate.h @@ -196,6 +196,7 @@ struct _GtkFileChooserDefault GtkSearchEngine *search_engine; GtkQuery *search_query; GtkListStore *search_model; + GtkTreeModelFilter *search_model_filter; /* OPERATION_MODE_RECENT */ GtkRecentManager *recent_manager; -- 1.4.4.2