diff src/view_file_list.c @ 167:05bf5d364dba

fixed filelist refresh
author nadvornik
date Sat, 22 Dec 2007 20:33:09 +0000
parents 08ab6367b4e6
children a55ada12322a
line wrap: on
line diff
--- a/src/view_file_list.c	Sat Dec 22 10:10:40 2007 +0000
+++ b/src/view_file_list.c	Sat Dec 22 20:33:09 2007 +0000
@@ -867,26 +867,16 @@
 }
 
 
-
-void vflist_setup_iter(ViewFileList *vfl, GtkTreeStore *store, GtkTreeIter *iter, FileData *fd, GtkTreeIter *before)
+void vflist_setup_iter(ViewFileList *vfl, GtkTreeStore *store, GtkTreeIter *iter, FileData *fd)
 {
+	int i;
 	gchar *size;
-	gchar *sidecars;
-	int i;
-	GList *work;
-    		
-	sidecars = sidecar_file_data_list_to_string(fd);
+	gchar *sidecars = NULL;
+
+	if (fd->sidecar_files)
+		sidecars = sidecar_file_data_list_to_string(fd);
 	size = text_from_size(fd->size);
 	
-	if (before)
-		{
-		gtk_tree_store_insert_before(store, iter, NULL, before);
-		}
-		else
-		{
-		gtk_tree_store_append(store, iter, NULL);
-		}
-	
 	gtk_tree_store_set(store, iter, FILE_COLUMN_POINTER, fd,
 					FILE_COLUMN_THUMB, (vfl->thumbs_enabled) ? fd->pixbuf : NULL,
 					FILE_COLUMN_NAME, fd->name,
@@ -898,28 +888,93 @@
 		gtk_tree_store_set(store, iter, FILE_COLUMN_MARKS + i, fd->marks[i], -1);
             
 	g_free(size);
-	g_free(sidecars);
+	if (sidecars)
+		g_free(sidecars);
+}
 
+void vflist_setup_iter_with_sidecars(ViewFileList *vfl, GtkTreeStore *store, GtkTreeIter *iter, FileData *fd)
+{
+	GList *work;
+	GtkTreeIter new;
+	GtkTreeIter s_iter;
+	gint valid;
+
+    	vflist_setup_iter(vfl, store, iter, fd);
+
+
+	/* this is almost the same code as in vflist_populate_view 
+	   maybe it should be made more generic and used in both places */
+	
+	
+	valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(store), &s_iter, iter);
 
 	work = fd->sidecar_files;
 	while (work)
 		{
-		GtkTreeIter s_iter;
-		
+		gint match;
 		FileData *sfd = work->data;
-		work = work->next;
+		gint done = FALSE;
+
+		while (!done)
+			{
+			FileData *old_sfd = NULL;
+            
+			if (valid)
+				{
+				gtk_tree_model_get(GTK_TREE_MODEL(store), &s_iter, FILE_COLUMN_POINTER, &old_sfd, -1);
+				
+				if (sfd == old_sfd)
+					{
+					match = 0;
+					}
+				else
+					{
+					match = filelist_sort_compare_filedata_full(sfd, old_sfd, SORT_NAME, TRUE);
+					}
+				}
+					
+			else
+				{
+				match = -1;
+				}
 
-		size = text_from_size(sfd->size);
-		gtk_tree_store_append(store, &s_iter, iter);
-		gtk_tree_store_set(store, &s_iter, 
-					FILE_COLUMN_POINTER, sfd,
-					FILE_COLUMN_NAME, sfd->name,
-					FILE_COLUMN_SIZE, size,
-					FILE_COLUMN_DATE, text_from_time(sfd->date),
-					-1);
-		g_free(size);
+			if (match < 0)
+				{
+				GtkTreeIter new;
+				
+				if (valid)
+					{
+					gtk_tree_store_insert_before(store, &new, iter, &s_iter);
+					}
+				else
+					{
+					gtk_tree_store_append(store, &new, iter);
+					}
+				
+				vflist_setup_iter(vfl, store, &new, sfd);
+
+				done = TRUE;
+				}
+			else if (match > 0)
+				{
+				valid = gtk_tree_store_remove(store, &s_iter);
+				}
+			else
+				{
+				vflist_setup_iter(vfl, store, &s_iter, sfd);
+
+				if (valid) valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &s_iter);
+
+				done = TRUE;
+				}
+			}
+		work = work->next;
 		}
-	
+
+	while (valid)
+		{
+		valid = gtk_tree_store_remove(store, &s_iter);
+		}
 }
 
 
@@ -1008,7 +1063,8 @@
 		{
 		FileData *fd = work->data;
 		
-		vflist_setup_iter(vfl, store, &iter, fd, NULL);
+		gtk_tree_store_append(store, &iter, NULL);
+		vflist_setup_iter_with_sidecars(vfl, store, &iter, fd);
 
 		if (select_list && select_list->data == fd)
 			{
@@ -1627,13 +1683,23 @@
 		while (!done)
 			{
 			FileData *old_fd = NULL;
-            int i;
             
 			if (valid)
 				{
 				gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1);
-				match = CASE_SORT(fd->name, old_fd->name);
+				
+				if (fd == old_fd)
+					{
+					match = 0;
+					}
+				else
+					{
+					match = filelist_sort_compare_filedata_full(fd, old_fd, vfl->sort_method, vfl->sort_ascend);
+					if (match == 0)
+						match = -1; /* probably should not happen*/
+					}
 				}
+					
 			else
 				{
 				match = -1;
@@ -1645,12 +1711,13 @@
 				
 				if (valid)
 					{
-					vflist_setup_iter(vfl, store, &new, fd, &iter); 
+					gtk_tree_store_insert_before(store, &new, NULL, &iter);
 					}
 				else
 					{
-					vflist_setup_iter(vfl, store, &new, fd, NULL);
+					gtk_tree_store_append(store, &new, NULL);
 					}
+				vflist_setup_iter_with_sidecars(vfl, store, &new, fd);
 
 				done = TRUE;
 				}
@@ -1660,28 +1727,7 @@
 				}
 			else
 				{
-				gtk_tree_store_set(store, &iter, FILE_COLUMN_POINTER, fd, -1);
-				if (fd->date != old_fd->date)
-					{
-					gchar *size;
-
-					/* update, file changed */
-					size = text_from_size(fd->size);
-					gtk_tree_store_set(store, &iter, FILE_COLUMN_SIZE, size,
-									 FILE_COLUMN_DATE, text_from_time(fd->date), -1);
-					g_free(size);
-					}
-				else if (fd != old_fd)
-					{
-					/* preserve thumbnail */
-					if (fd->pixbuf) g_object_unref(fd->pixbuf);
-					fd->pixbuf = old_fd->pixbuf;
-					if (fd->pixbuf) g_object_ref(fd->pixbuf);
-					}
-
-				gtk_tree_store_set(store, &iter, FILE_COLUMN_THUMB, (thumbs) ? fd->pixbuf : NULL, -1);
-
-				if (vfl->select_fd == old_fd) vfl->select_fd = fd;
+				vflist_setup_iter_with_sidecars(vfl, store, &iter, fd);
 
 				if (valid) valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);