changeset 833:1d6fedb891dc

optimized vflist_setup_iter_recursive
author nadvornik
date Sat, 14 Jun 2008 17:14:28 +0000
parents a14d7da2736d
children e5cb9f4389f4
files src/view_file_list.c
diffstat 1 files changed, 28 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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)