[gthumb] read all the metadata before rotating the images



commit 1a3c0f685275449cd728fa63aa10a815018ec093
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sat Feb 20 12:29:22 2010 +0100

    read all the metadata before rotating the images

 extensions/image_rotation/actions.c            |   10 ++++-
 extensions/image_rotation/gth-transform-task.c |   53 ++++++++++++++++++------
 extensions/image_rotation/gth-transform-task.h |    2 +-
 3 files changed, 49 insertions(+), 16 deletions(-)
---
diff --git a/extensions/image_rotation/actions.c b/extensions/image_rotation/actions.c
index 9eb9f5f..0cc2625 100644
--- a/extensions/image_rotation/actions.c
+++ b/extensions/image_rotation/actions.c
@@ -32,16 +32,19 @@ gth_browser_activate_action_tool_rotate_right (GtkAction  *action,
 					       GthBrowser *browser)
 {
 	GList   *items;
+	GList   *file_data_list;
 	GList   *file_list;
 	GthTask *task;
 
 	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
-	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	file_list = gth_file_data_list_to_file_list (file_data_list);
 	task = gth_transform_task_new (browser, file_list, GTH_TRANSFORM_ROTATE_90);
 	gth_browser_exec_task (browser, task, FALSE);
 
 	g_object_unref (task);
 	_g_object_list_unref (file_list);
+	_g_object_list_unref (file_data_list);
 	_gtk_tree_path_list_free (items);
 }
 
@@ -51,15 +54,18 @@ gth_browser_activate_action_tool_rotate_left (GtkAction  *action,
 					      GthBrowser *browser)
 {
 	GList   *items;
+	GList   *file_data_list;
 	GList   *file_list;
 	GthTask *task;
 
 	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
-	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	file_list = gth_file_data_list_to_file_list (file_data_list);
 	task = gth_transform_task_new (browser, file_list, GTH_TRANSFORM_ROTATE_270);
 	gth_browser_exec_task (browser, task, FALSE);
 
 	g_object_unref (task);
 	_g_object_list_unref (file_list);
+	_g_object_list_unref (file_data_list);
 	_gtk_tree_path_list_free (items);
 }
diff --git a/extensions/image_rotation/gth-transform-task.c b/extensions/image_rotation/gth-transform-task.c
index f56dcaa..ab0ffa5 100644
--- a/extensions/image_rotation/gth-transform-task.c
+++ b/extensions/image_rotation/gth-transform-task.c
@@ -29,6 +29,7 @@ struct _GthTransformTaskPrivate {
 	GthBrowser    *browser;
 	GList         *file_list;
 	GList         *current;
+	GthFileData   *file_data;
 	GthTransform   transform;
 	JpegMcuAction  default_action;
 };
@@ -44,6 +45,7 @@ gth_transform_task_finalize (GObject *object)
 
 	self = GTH_TRANSFORM_TASK (object);
 
+	_g_object_unref (self->priv->file_data);
 	_g_object_list_unref (self->priv->file_list);
 
 	G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -84,7 +86,6 @@ transform_file_ready_cb (GError   *error,
 			 gpointer  user_data)
 {
 	GthTransformTask *self = user_data;
-	GthFileData      *file_data;
 	GFile            *parent;
 	GList            *file_list;
 
@@ -93,10 +94,8 @@ transform_file_ready_cb (GError   *error,
 			g_clear_error (&error);
 
 			gth_task_dialog (GTH_TASK (self), TRUE);
-
-			file_data = self->priv->current->data;
 			ask_whether_to_trim (GTK_WINDOW (self->priv->browser),
-					     file_data,
+					     self->priv->file_data,
 					     trim_response_cb,
 					     self);
 
@@ -107,9 +106,8 @@ transform_file_ready_cb (GError   *error,
 		return;
 	}
 
-	file_data = self->priv->current->data;
-	parent = g_file_get_parent (file_data->file);
-	file_list = g_list_append (NULL, file_data->file);
+	parent = g_file_get_parent (self->priv->file_data->file);
+	file_list = g_list_append (NULL, self->priv->file_data->file);
 	gth_monitor_folder_changed (gth_main_get_default_monitor (),
 				    parent,
 				    file_list,
@@ -123,17 +121,20 @@ transform_file_ready_cb (GError   *error,
 
 
 static void
-transform_current_file (GthTransformTask *self)
+file_info_ready_cb (GList    *files,
+		    GError   *error,
+		    gpointer  user_data)
 {
-	GthFileData *file_data;
+	GthTransformTask *self = user_data;
 
-	if (self->priv->current == NULL) {
-		gth_task_completed (GTH_TASK (self), NULL);
+	if (error != NULL) {
+		gth_task_completed (GTH_TASK (self), error);
 		return;
 	}
 
-	file_data = self->priv->current->data;
-	apply_transformation_async (file_data,
+	_g_object_unref (self->priv->file_data);
+	self->priv->file_data = g_object_ref ((GthFileData *) files->data);
+	apply_transformation_async (self->priv->file_data,
 				    self->priv->transform,
 				    self->priv->default_action,
 				    gth_task_get_cancellable (GTH_TASK (self)),
@@ -143,6 +144,31 @@ transform_current_file (GthTransformTask *self)
 
 
 static void
+transform_current_file (GthTransformTask *self)
+{
+	GFile *file;
+	GList *singleton;
+
+	if (self->priv->current == NULL) {
+		gth_task_completed (GTH_TASK (self), NULL);
+		return;
+	}
+
+	file = self->priv->current->data;
+	singleton = g_list_append (NULL, g_object_ref (file));
+	_g_query_all_metadata_async (singleton,
+				     FALSE,
+				     TRUE,
+				     "*",
+				     gth_task_get_cancellable (GTH_TASK (self)),
+				     file_info_ready_cb,
+				     self);
+
+	_g_object_list_unref (singleton);
+}
+
+
+static void
 gth_transform_task_exec (GthTask *task)
 {
 	GthTransformTask *self;
@@ -178,6 +204,7 @@ gth_transform_task_init (GthTransformTask *self)
 {
 	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_TRANSFORM_TASK, GthTransformTaskPrivate);
 	self->priv->default_action = JPEG_MCU_ACTION_ABORT; /* FIXME: save a gconf value for this */
+	self->priv->file_data = NULL;
 }
 
 
diff --git a/extensions/image_rotation/gth-transform-task.h b/extensions/image_rotation/gth-transform-task.h
index 8454052..d61591f 100644
--- a/extensions/image_rotation/gth-transform-task.h
+++ b/extensions/image_rotation/gth-transform-task.h
@@ -50,7 +50,7 @@ struct _GthTransformTaskClass {
 
 GType         gth_transform_task_get_type     (void);
 GthTask *     gth_transform_task_new          (GthBrowser   *browser,
-					       GList        *file_list,
+					       GList        *file_list, /* GFile list */
 					       GthTransform  transform);
 
 G_END_DECLS



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]