diff options
author | Benjamin Otte <otte@redhat.com> | 2018-09-13 02:33:32 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2018-09-16 18:50:17 +0200 |
commit | 64b7c123cce43008b6b79bc35708d77f4d041d46 (patch) | |
tree | a588b7e8118e7471071666430a1ff69b43553404 /tests | |
parent | fcb780ee134b4f014641d07f88833f0a3b086092 (diff) | |
download | gtk+-64b7c123cce43008b6b79bc35708d77f4d041d46.tar.gz |
testtreelistmodel: Add search
Add a simple search that does a case insensitive substring search of the
file paths.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/testtreelistmodel.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/tests/testtreelistmodel.c b/tests/testtreelistmodel.c index 42ec20a3b2..72404081ae 100644 --- a/tests/testtreelistmodel.c +++ b/tests/testtreelistmodel.c @@ -181,15 +181,35 @@ update_adjustment (GListModel *model, GtkAdjustment *adjustment) { gtk_adjustment_set_upper (adjustment, MAX (ROWS, g_list_model_get_n_items (model))); + g_print ("%u items\n", g_list_model_get_n_items (model)); +} + +static gboolean +match_file (gpointer item, gpointer data) +{ + GtkWidget *search_entry = data; + GFile *file = gtk_tree_list_row_get_item (item); + char *path; + gboolean result; + + path = g_file_get_path (file); + + result = strstr (path, gtk_entry_get_text (GTK_ENTRY (search_entry))) != NULL; + + g_object_unref (file); + g_free (path); + + return result; } int main (int argc, char *argv[]) { GtkAdjustment *adjustment; - GtkWidget *win, *box, *scrollbar, *listbox; + GtkWidget *win, *hbox, *vbox, *scrollbar, *listbox, *search_entry; GListModel *dirmodel; GtkTreeListModel *tree; + GtkFilterListModel *filter; GtkSliceListModel *slice; GFile *root; @@ -199,12 +219,19 @@ main (int argc, char *argv[]) gtk_window_set_default_size (GTK_WINDOW (win), 400, 600); g_signal_connect (win, "destroy", G_CALLBACK (gtk_main_quit), win); - box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - gtk_container_add (GTK_CONTAINER (win), box); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (win), vbox); + + search_entry = gtk_search_entry_new (); + gtk_container_add (GTK_CONTAINER (vbox), search_entry); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_search_entry_set_key_capture_widget (GTK_SEARCH_ENTRY (search_entry), hbox); + gtk_container_add (GTK_CONTAINER (vbox), hbox); listbox = gtk_list_box_new (); gtk_widget_set_hexpand (listbox, TRUE); - gtk_container_add (GTK_CONTAINER (box), listbox); + gtk_container_add (GTK_CONTAINER (hbox), listbox); if (argc > 1) root = g_file_new_for_commandline_arg (argv[1]); @@ -218,7 +245,12 @@ main (int argc, char *argv[]) NULL, NULL); g_object_unref (dirmodel); - slice = gtk_slice_list_model_new (G_LIST_MODEL (tree), 0, ROWS); + filter = gtk_filter_list_model_new (G_LIST_MODEL (tree), + match_file, + search_entry, + NULL); + g_signal_connect_swapped (search_entry, "search-changed", G_CALLBACK (gtk_filter_list_model_refilter), filter); + slice = gtk_slice_list_model_new (G_LIST_MODEL (filter), 0, ROWS); gtk_list_box_bind_model (GTK_LIST_BOX (listbox), G_LIST_MODEL (slice), @@ -230,12 +262,13 @@ main (int argc, char *argv[]) 1, ROWS - 1, ROWS); g_object_bind_property (adjustment, "value", slice, "offset", 0); - g_signal_connect (tree, "items-changed", G_CALLBACK (update_adjustment), adjustment); + g_signal_connect (filter, "items-changed", G_CALLBACK (update_adjustment), adjustment); scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment); - gtk_container_add (GTK_CONTAINER (box), scrollbar); + gtk_container_add (GTK_CONTAINER (hbox), scrollbar); g_object_unref (tree); + g_object_unref (filter); g_object_unref (slice); gtk_widget_show (win); |