# HG changeset patch # User nadvornik # Date 1212012730 0 # Node ID 81f9e8dbb4bf80bcb3b7b0a3860eeda1c223c9b8 # Parent e6927cef8541331161171645a17b87de32d5d7ca improved infrastructure for tracing changes, optimized vflist_populate_view diff -r e6927cef8541 -r 81f9e8dbb4bf src/filedata.c --- a/src/filedata.c Tue May 27 18:46:34 2008 +0000 +++ b/src/filedata.c Wed May 28 22:12:10 2008 +0000 @@ -136,6 +136,13 @@ FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd); +void file_data_increment_version(FileData *fd) +{ + fd->version++; + if (fd->parent) fd->parent->version++; +} + + static void file_data_set_path(FileData *fd, const gchar *path) { @@ -184,6 +191,7 @@ fd->date = st->st_mtime; if (fd->pixbuf) g_object_unref(fd->pixbuf); fd->pixbuf = NULL; + file_data_increment_version(fd); } work = fd->sidecar_files; @@ -1347,6 +1355,7 @@ fd->original_path = g_strdup(fd->change->dest); g_hash_table_insert(file_data_pool, fd->original_path, fd); } + file_data_increment_version(fd); } gint file_data_sc_apply_ci(FileData *fd) diff -r e6927cef8541 -r 81f9e8dbb4bf src/filedata.h --- a/src/filedata.h Tue May 27 18:46:34 2008 +0000 +++ b/src/filedata.h Wed May 28 22:12:10 2008 +0000 @@ -24,6 +24,8 @@ FileData *file_data_ref(FileData *fd); void file_data_unref(FileData *fd); +void file_data_increment_version(FileData *fd); + gboolean file_data_add_change_info(FileData *fd, FileDataChangeType type, const gchar *src, const gchar *dest); void file_data_change_info_free(FileDataChangeInfo *fdci, FileData *fd); diff -r e6927cef8541 -r 81f9e8dbb4bf src/typedefs.h --- a/src/typedefs.h Tue May 27 18:46:34 2008 +0000 +++ b/src/typedefs.h Wed May 28 22:12:10 2008 +0000 @@ -433,6 +433,7 @@ FileDataChangeInfo *change; /* for rename, move ... */ GdkPixbuf *pixbuf; gint ref; + gint version; /* increased when any field in this structure is changed */ gint user_orientation; gint exif_orientation; }; diff -r e6927cef8541 -r 81f9e8dbb4bf src/view_file_icon.c --- a/src/view_file_icon.c Tue May 27 18:46:34 2008 +0000 +++ b/src/view_file_icon.c Wed May 28 22:12:10 2008 +0000 @@ -959,6 +959,7 @@ case STM_MODE_TOGGLE: fd->marks[n] = !fd->marks[mark]; break; } + file_data_increment_version(fd); work = work->next; } diff -r e6927cef8541 -r 81f9e8dbb4bf src/view_file_list.c --- a/src/view_file_list.c Tue May 27 18:46:34 2008 +0000 +++ b/src/view_file_list.c Wed May 28 22:12:10 2008 +0000 @@ -34,6 +34,7 @@ enum { FILE_COLUMN_POINTER = 0, + FILE_COLUMN_VERSION, FILE_COLUMN_THUMB, FILE_COLUMN_NAME, FILE_COLUMN_SIDECARS, @@ -717,6 +718,7 @@ size = text_from_size(fd->size); gtk_tree_store_set(store, iter, FILE_COLUMN_POINTER, fd, + FILE_COLUMN_VERSION, fd->version, FILE_COLUMN_THUMB, (VFLIST_INFO(vf, thumbs_enabled)) ? fd->pixbuf : NULL, FILE_COLUMN_NAME, fd->name, FILE_COLUMN_SIDECARS, sidecars, @@ -1418,6 +1420,8 @@ case STM_MODE_TOGGLE: fd->marks[n] = !fd->marks[n]; break; } + + file_data_increment_version(fd); gtk_tree_store_set(GTK_TREE_STORE(store), &iter, FILE_COLUMN_MARKS + n, fd->marks[n], -1); @@ -1496,10 +1500,14 @@ while (!done) { FileData *old_fd = NULL; + gint old_version = 0; if (valid) { - gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1); + gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, + FILE_COLUMN_POINTER, &old_fd, + FILE_COLUMN_VERSION, &old_version, + -1); if (fd == old_fd) { @@ -1540,7 +1548,8 @@ } else { - vflist_setup_iter_with_sidecars(vf, store, &iter, fd); + if (old_version != fd->version) + vflist_setup_iter_with_sidecars(vf, store, &iter, fd); if (valid) valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter); @@ -1701,6 +1710,7 @@ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, col_idx, &mark, -1); mark = !mark; fd->marks[col_idx - FILE_COLUMN_MARKS] = mark; + file_data_increment_version(fd); gtk_tree_store_set(store, &iter, col_idx, mark, -1); gtk_tree_path_free(path); @@ -1783,6 +1793,7 @@ VFLIST_INFO(vf, select_idle_id) = -1; flist_types[FILE_COLUMN_POINTER] = G_TYPE_POINTER; + flist_types[FILE_COLUMN_VERSION] = G_TYPE_INT; flist_types[FILE_COLUMN_THUMB] = GDK_TYPE_PIXBUF; flist_types[FILE_COLUMN_NAME] = G_TYPE_STRING; flist_types[FILE_COLUMN_SIDECARS] = G_TYPE_STRING;