improved infrastructure for tracing changes, optimized vflist_populate_view
authorVladimir Nadvornik <nadvornik@suse.cz>
Wed, 28 May 2008 22:12:10 +0000 (22:12 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Wed, 28 May 2008 22:12:10 +0000 (22:12 +0000)
src/filedata.c
src/filedata.h
src/typedefs.h
src/view_file_icon.c
src/view_file_list.c

index d1bf4aa..fa4c5d1 100644 (file)
@@ -136,6 +136,13 @@ static void file_data_check_sidecars(FileData *fd);
 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 @@ static void file_data_check_changed_files(FileData *fd, struct stat *st)
                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 @@ static void file_data_apply_ci(FileData *fd)
                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)
index 75dfff4..5bf552e 100644 (file)
@@ -24,6 +24,8 @@ FileData *file_data_new_simple(const gchar *path_utf8);
 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);
 
index 346d851..3798248 100644 (file)
@@ -433,6 +433,7 @@ struct _FileData {
        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;
 };
index bb02b6e..3942e5e 100644 (file)
@@ -959,6 +959,7 @@ void vficon_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
                        case STM_MODE_TOGGLE: fd->marks[n] = !fd->marks[mark];
                                break;
                        }
+               file_data_increment_version(fd);
 
                work = work->next;
                }
index 2f430de..93b5d67 100644 (file)
@@ -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 @@ static void vflist_setup_iter(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *it
        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 @@ void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
                        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 @@ static void vflist_populate_view(ViewFile *vf)
                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 @@ static void vflist_populate_view(ViewFile *vf)
                                }
                        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 @@ static void vflist_listview_mark_toggled(GtkCellRendererToggle *cell, gchar *pat
        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 @@ ViewFile *vflist_new(ViewFile *vf, const gchar *path)
        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;