diff options
author | Benjamin Otte <otte@redhat.com> | 2018-09-14 04:54:36 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2018-09-16 18:50:17 +0200 |
commit | afd69db678777bbdc7d40f93dd96d090aea2608b (patch) | |
tree | ad532c3112de6cf57df9e1b4665b449df045bbbe /tests | |
parent | f3834138f7e8e8a3ef9945832876b4e5b4d1b719 (diff) | |
download | gtk+-afd69db678777bbdc7d40f93dd96d090aea2608b.tar.gz |
testtreelistmodel: Sort files by name
Diffstat (limited to 'tests')
-rw-r--r-- | tests/testtreelistmodel.c | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/tests/testtreelistmodel.c b/tests/testtreelistmodel.c index 72404081ae..c78db1d4c0 100644 --- a/tests/testtreelistmodel.c +++ b/tests/testtreelistmodel.c @@ -103,10 +103,42 @@ got_files (GObject *enumerate, store); } +static int +compare_files (gconstpointer first, + gconstpointer second, + gpointer unused) +{ + char *first_path, *second_path; + int result; +#if 0 + GFileType first_type, second_type; + + /* This is a bit slow, because each g_file_query_file_type() does a stat() */ + first_type = g_file_query_file_type (G_FILE (first), G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL); + second_type = g_file_query_file_type (G_FILE (second), G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL); + + if (first_type == G_FILE_TYPE_DIRECTORY && second_type != G_FILE_TYPE_DIRECTORY) + return -1; + if (first_type != G_FILE_TYPE_DIRECTORY && second_type == G_FILE_TYPE_DIRECTORY) + return 1; +#endif + + first_path = g_file_get_path (G_FILE (first)); + second_path = g_file_get_path (G_FILE (second)); + + result = strcasecmp (first_path, second_path); + + g_free (first_path); + g_free (second_path); + + return result; +} + static GListModel * create_list_model_for_directory (gpointer file, gpointer unused) { + GtkSortListModel *sort; GListStore *store; if (g_file_query_file_type (file, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL) != G_FILE_TYPE_DIRECTORY) @@ -115,10 +147,14 @@ create_list_model_for_directory (gpointer file, store = g_list_store_new (G_TYPE_FILE); g_object_set_data_full (G_OBJECT (store), "file", g_object_ref (file), g_object_unref); - if (start_enumerate (store)) - return G_LIST_MODEL (store); - else + if (!start_enumerate (store)) return NULL; + + sort = gtk_sort_list_model_new (G_LIST_MODEL (store), + compare_files, + NULL, NULL); + g_object_unref (store); + return G_LIST_MODEL (sort); } static GtkWidget * @@ -181,7 +217,21 @@ 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 void +update_statusbar (GListModel *model, + guint position, + guint removed, + guint added, + GtkStatusbar *statusbar) +{ + char *s; + gtk_statusbar_remove_all (statusbar, 0); + + s = g_strdup_printf ("%u items", g_list_model_get_n_items (model)); + gtk_statusbar_push (statusbar, 0, s); + g_free (s); } static gboolean @@ -206,7 +256,7 @@ int main (int argc, char *argv[]) { GtkAdjustment *adjustment; - GtkWidget *win, *hbox, *vbox, *scrollbar, *listbox, *search_entry; + GtkWidget *win, *hbox, *vbox, *scrollbar, *listbox, *search_entry, *statusbar; GListModel *dirmodel; GtkTreeListModel *tree; GtkFilterListModel *filter; @@ -267,6 +317,11 @@ main (int argc, char *argv[]) scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment); gtk_container_add (GTK_CONTAINER (hbox), scrollbar); + statusbar = gtk_statusbar_new (); + g_signal_connect (filter, "items-changed", G_CALLBACK (update_statusbar), statusbar); + update_statusbar (G_LIST_MODEL (filter), 0, 0, 0, GTK_STATUSBAR (statusbar)); + gtk_container_add (GTK_CONTAINER (vbox), statusbar); + g_object_unref (tree); g_object_unref (filter); g_object_unref (slice); |