Read metadata in the idle loop
[geeqie.git] / src / view_file / view_file.c
index fb80dac..0bac1ff 100644 (file)
@@ -404,6 +404,11 @@ static void vf_pop_menu_sort_cb(GtkWidget *widget, gpointer data)
 
        type = (SortType)GPOINTER_TO_INT(data);
 
+       if (type == SORT_EXIFTIME || type == SORT_EXIFTIMEDIGITIZED || type == SORT_RATING)
+               {
+               vf_read_metadata_in_idle(vf);
+               }
+
        if (vf->layout)
                {
                layout_sort_set(vf->layout, type, vf->sort_ascend);
@@ -697,6 +702,10 @@ static void vf_destroy_cb(GtkWidget *widget, gpointer data)
                gtk_widget_destroy(vf->popup);
                }
 
+       if (vf->read_metadata_in_idle_id)
+               {
+               g_idle_remove_by_data(vf);
+               }
        file_data_unref(vf->dir_fd);
        g_free(vf->info);
        g_free(vf);
@@ -848,6 +857,7 @@ ViewFile *vf_new(FileViewType type, FileData *dir_fd)
        vf->type = type;
        vf->sort_method = SORT_NAME;
        vf->sort_ascend = TRUE;
+       vf->read_metadata_in_idle_id = 0;
 
        vf->scrolled = gtk_scrolled_window_new(NULL, NULL);
        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vf->scrolled), GTK_SHADOW_IN);
@@ -926,6 +936,20 @@ static gdouble vf_thumb_progress(ViewFile *vf)
        return (gdouble)done / count;
 }
 
+static gdouble vf_read_metadata_in_idle_progress(ViewFile *vf)
+{
+       gint count = 0;
+       gint done = 0;
+
+       switch (vf->type)
+               {
+               case FILEVIEW_LIST: vflist_read_metadata_progress_count(vf->list, &count, &done); break;
+               case FILEVIEW_ICON: vficon_read_metadata_progress_count(vf->list, &count, &done); break;
+               }
+
+       return (gdouble)done / count;
+}
+
 static void vf_set_thumb_fd(ViewFile *vf, FileData *fd)
 {
        switch (vf->type)
@@ -1197,4 +1221,74 @@ void vf_notify_cb(FileData *fd, NotifyType type, gpointer data)
                }
 }
 
+static gboolean vf_read_metadata_in_idle_cb(gpointer data)
+{
+       FileData *fd;
+       ViewFile *vf = data;
+       GList *list_entry;
+       GList *work;
+
+       vf_thumb_status(vf, vf_read_metadata_in_idle_progress(vf), _("Loading meta..."));
+
+       work = vf->list;
+
+       while (work)
+               {
+               fd = work->data;
+
+               if (fd && !fd->metadata_in_idle_loaded)
+                       {
+                       if (!fd->exifdate)
+                               {
+                               read_exif_time_data(fd);
+                               }
+                       if (!fd->exifdate_digitized)
+                               {
+                               read_exif_time_digitized_data(fd);
+                               }
+                       if (fd->rating == STAR_RATING_NOT_READ)
+                               {
+                               read_rating_data(fd);
+                               }
+                       fd->metadata_in_idle_loaded = TRUE;
+                       return TRUE;
+                       }
+               work = work->next;
+               }
+
+       vf_thumb_status(vf, 0.0, NULL);
+       vf->read_metadata_in_idle_id = 0;
+       vf_refresh(vf);
+       return FALSE;
+}
+
+static void vf_read_metadata_in_idle_finished_cb(gpointer data)
+{
+       ViewFile *vf = data;
+
+       vf_thumb_status(vf, 0.0, "Loading meta...");
+       vf->read_metadata_in_idle_id = 0;
+}
+
+void vf_read_metadata_in_idle(ViewFile *vf)
+{
+       GList *work;
+       FileData *fd;
+
+       if (!vf) return;
+
+       if (vf->read_metadata_in_idle_id)
+               {
+               g_idle_remove_by_data(vf);
+               }
+       vf->read_metadata_in_idle_id = 0;
+
+       if (vf->list)
+               {
+               vf->read_metadata_in_idle_id = g_idle_add_full(G_PRIORITY_LOW, vf_read_metadata_in_idle_cb, vf, vf_read_metadata_in_idle_finished_cb);
+               }
+
+       return;
+}
+
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */