# HG changeset patch # User nadvornik # Date 1213463668 0 # Node ID 1d6fedb891dc5c2e0ee96cf345db7b15a49ba1bd # Parent a14d7da2736df8614c47189d4773157c1b16012b optimized vflist_setup_iter_recursive diff -r a14d7da2736d -r 1d6fedb891dc src/view_file_list.c --- a/src/view_file_list.c Sat Jun 14 12:43:39 2008 +0000 +++ b/src/view_file_list.c Sat Jun 14 17:14:28 2008 +0000 @@ -769,6 +769,8 @@ GList *work; GtkTreeIter iter; gint valid; + gint num_ordered = 0; + gint num_prepended = 0; valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(store), &iter, parent_iter); @@ -786,6 +788,7 @@ if (valid) { + num_ordered++; gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, FILE_COLUMN_VERSION, &old_version, @@ -821,7 +824,12 @@ } else { - gtk_tree_store_append(store, &new, parent_iter); + /* + here should be used gtk_tree_store_append, but this function seems to be O(n) + and it seems to be much faster to add new entries to the beginning and reorder later + */ + num_prepended++; + gtk_tree_store_prepend(store, &new, parent_iter); } vflist_setup_iter(vf, store, &new, file_data_ref(fd)); @@ -866,6 +874,25 @@ valid = gtk_tree_store_remove(store, &iter); } + + /* move the prepended entries to the correct position */ + if (num_prepended) + { + gint i; + gint num_total = num_prepended + num_ordered; + gint *new_order = g_malloc(num_total * sizeof(gint)); + + for (i = 0; i < num_total; i++) + { + if (i < num_ordered) + new_order[i] = num_prepended + i; + else + new_order[i] = num_total - 1 - i; + } + gtk_tree_store_reorder(store, parent_iter, new_order); + + g_free(new_order); + } } void vflist_sort_set(ViewFile *vf, SortType type, gint ascend)