[gthumb] added a tool to import the embedded metadata in the gThumb comment system



commit 8b615efa748b181cf3987d7f5a9cf656baf37e51
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Mar 22 09:59:05 2012 +0100

    added a tool to import the embedded metadata in the gThumb comment system
    
    [new feature]

 extensions/comments/Makefile.am                |    6 +
 extensions/comments/actions.c                  |   49 +++++
 extensions/comments/actions.h                  |   31 +++
 extensions/comments/callbacks.c                |   91 +++++++++
 extensions/comments/callbacks.h                |   29 +++
 extensions/comments/gth-comment.c              |  132 +++++++++++++
 extensions/comments/gth-comment.h              |    1 +
 extensions/comments/gth-import-metadata-task.c |  238 ++++++++++++++++++++++++
 extensions/comments/gth-import-metadata-task.h |   56 ++++++
 extensions/comments/main.c                     |  130 +-------------
 extensions/list_tools/callbacks.c              |    1 +
 po/POTFILES.in                                 |   18 ++
 12 files changed, 657 insertions(+), 125 deletions(-)
---
diff --git a/extensions/comments/Makefile.am b/extensions/comments/Makefile.am
index ddfb304..16f79ea 100644
--- a/extensions/comments/Makefile.am
+++ b/extensions/comments/Makefile.am
@@ -4,10 +4,16 @@ extensiondir = $(pkglibdir)/extensions
 extension_LTLIBRARIES = libcomments.la
 
 libcomments_la_SOURCES = 			\
+	actions.c				\
+	actions.h				\
+	callbacks.c				\
+	callbacks.h				\
 	dlg-comments-preferences.c		\
 	dlg-comments-preferences.h		\
 	gth-comment.c				\
 	gth-comment.h				\
+	gth-import-metadata-task.c		\
+	gth-import-metadata-task.h		\
 	gth-metadata-provider-comment.c		\
 	gth-metadata-provider-comment.h		\
 	main.c					\
diff --git a/extensions/comments/actions.c b/extensions/comments/actions.c
new file mode 100644
index 0000000..ccc7a8d
--- /dev/null
+++ b/extensions/comments/actions.c
@@ -0,0 +1,49 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2012 Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <config.h>
+#include <gthumb.h>
+#include "gth-import-metadata-task.h"
+
+
+void
+gth_browser_activate_action_tool_import_embedded_metadata (GtkAction  *action,
+							   GthBrowser *browser)
+{
+	GList   *items;
+	GList   *file_data_list;
+	GthTask *task;
+
+	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+	file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	/* use all the files if no file or only one file is selected */
+	if ((file_data_list == NULL) || (file_data_list->next == NULL)) {
+		_g_object_list_unref (file_data_list);
+		file_data_list = gth_file_store_get_visibles (gth_browser_get_file_store (browser));
+	}
+	task = gth_import_metadata_task_new (browser, file_data_list);
+	gth_browser_exec_task (browser, task, FALSE);
+
+	g_object_unref (task);
+	_g_object_list_unref (file_data_list);
+	_gtk_tree_path_list_free (items);
+}
diff --git a/extensions/comments/actions.h b/extensions/comments/actions.h
new file mode 100644
index 0000000..7451f35
--- /dev/null
+++ b/extensions/comments/actions.h
@@ -0,0 +1,31 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2012 Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ACTIONS_H
+#define ACTIONS_H
+
+#include <gtk/gtk.h>
+
+#define DEFINE_ACTION(x) void x (GtkAction *action, gpointer data);
+
+DEFINE_ACTION(gth_browser_activate_action_tool_import_embedded_metadata)
+
+#endif /* ACTIONS_H */
diff --git a/extensions/comments/callbacks.c b/extensions/comments/callbacks.c
new file mode 100644
index 0000000..3e20852
--- /dev/null
+++ b/extensions/comments/callbacks.c
@@ -0,0 +1,91 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2012 Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+#include <gdk/gdkkeysyms.h>
+#include <gthumb.h>
+#include "actions.h"
+
+
+#define BROWSER_DATA_KEY "comments-data"
+
+
+static const char *fixed_ui_file_tools_info =
+"<ui>"
+"  <popup name='ListToolsPopup'>"
+"    <placeholder name='Tools_2'>"
+"      <menuitem name='ImportEmbeddedMetadata' action='Tool_ImportEmbeddedMetadata'/>"
+"    </placeholder>"
+"  </popup>"
+"</ui>";
+
+
+static GthActionEntryExt comments_action_entries[] = {
+	{ "Tool_ImportEmbeddedMetadata", NULL,
+	  N_("Import Embedded Metadata"), NULL,
+	  N_("Import the metadata stored inside files into the gThumb comment system"),
+	  GTH_ACTION_FLAG_NONE,
+	  G_CALLBACK (gth_browser_activate_action_tool_import_embedded_metadata) }
+};
+
+
+typedef struct {
+	GthBrowser     *browser;
+	GtkActionGroup *actions;
+} BrowserData;
+
+
+static void
+browser_data_free (BrowserData *data)
+{
+	g_free (data);
+}
+
+
+void
+comments__gth_browser_construct_cb (GthBrowser *browser)
+{
+	BrowserData *data;
+	GError      *error = NULL;
+
+	g_return_if_fail (GTH_IS_BROWSER (browser));
+
+	data = g_new0 (BrowserData, 1);
+	data->browser = browser;
+
+	data->actions = gtk_action_group_new ("Comments Actions");
+	gtk_action_group_set_translation_domain (data->actions, NULL);
+	_gtk_action_group_add_actions_with_flags (data->actions,
+						  comments_action_entries,
+						  G_N_ELEMENTS (comments_action_entries),
+						  browser);
+	gtk_ui_manager_insert_action_group (gth_browser_get_ui_manager (browser), data->actions, 0);
+
+	if (gth_main_extension_is_active ("list_tools") && ! gtk_ui_manager_add_ui_from_string (gth_browser_get_ui_manager (browser), fixed_ui_file_tools_info, -1, &error)) {
+		g_message ("building menus failed: %s", error->message);
+		g_error_free (error);
+	}
+
+	g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free);
+}
diff --git a/extensions/comments/callbacks.h b/extensions/comments/callbacks.h
new file mode 100644
index 0000000..eb79370
--- /dev/null
+++ b/extensions/comments/callbacks.h
@@ -0,0 +1,29 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2012 Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CALLBACKS_H
+#define CALLBACKS_H
+
+#include <gthumb.h>
+
+void    comments__gth_browser_construct_cb   (GthBrowser  *browser);
+
+#endif /* CALLBACKS_H */
diff --git a/extensions/comments/gth-comment.c b/extensions/comments/gth-comment.c
index da0d8c9..504c156 100644
--- a/extensions/comments/gth-comment.c
+++ b/extensions/comments/gth-comment.c
@@ -599,3 +599,135 @@ gth_comment_update_general_attributes (GthFileData *file_data)
 						  "general::datetime",
 						  g_file_info_get_attribute_object (file_data->info, "comment::time"));
 }
+
+
+void
+gth_comment_synchronize_metadata (GList *file_list)
+{
+	GList *scan;
+
+	for (scan = file_list; scan; scan = scan->next) {
+		GthFileData   *file_data = scan->data;
+		gboolean       write_comment;
+		GthMetadata   *metadata;
+		GthStringList *comment_categories;
+		GList         *scan;
+		const char    *text;
+		GthComment    *comment;
+		GthStringList *categories;
+
+		write_comment = FALSE;
+
+		comment = gth_comment_new ();
+		gth_comment_set_note (comment, g_file_info_get_attribute_string (file_data->info, "comment::note"));
+		gth_comment_set_caption (comment, g_file_info_get_attribute_string (file_data->info, "comment::caption"));
+		gth_comment_set_place (comment, g_file_info_get_attribute_string (file_data->info, "comment::place"));
+
+		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "comment::time");
+		if (metadata != NULL)
+			gth_comment_set_time_from_exif_format (comment, gth_metadata_get_raw (metadata));
+
+		comment_categories = (GthStringList *) g_file_info_get_attribute_object (file_data->info, "comment::categories");
+		if (comment_categories != NULL)
+			for (scan = gth_string_list_get_list (comment_categories); scan; scan = scan->next)
+				gth_comment_add_category (comment, (char *) scan->data);
+
+		gth_comment_set_rating (comment, g_file_info_get_attribute_int32 (file_data->info, "comment::rating"));
+
+		/* sync embedded data and .comment data if required */
+
+		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::description");
+		if (metadata != NULL) {
+			text = g_file_info_get_attribute_string (file_data->info, "comment::note");
+			if (! dom_str_equal (gth_metadata_get_formatted (metadata), text)) {
+				gth_comment_set_note (comment, gth_metadata_get_formatted (metadata));
+				write_comment = TRUE;
+			}
+		}
+
+		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::title");
+		if (metadata != NULL) {
+			text = g_file_info_get_attribute_string (file_data->info, "comment::caption");
+			if (! dom_str_equal (gth_metadata_get_formatted (metadata), text)) {
+				gth_comment_set_caption (comment, gth_metadata_get_formatted (metadata));
+				write_comment = TRUE;
+			}
+		}
+
+		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::location");
+		if (metadata != NULL) {
+			text = g_file_info_get_attribute_string (file_data->info, "comment::place");
+			if (! dom_str_equal (gth_metadata_get_formatted (metadata), text)) {
+				gth_comment_set_place (comment, gth_metadata_get_formatted (metadata));
+				write_comment = TRUE;
+			}
+		}
+
+		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::datetime");
+		if (metadata != NULL) {
+			text = gth_metadata_get_raw (metadata);
+			metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "comment::time");
+			if (metadata != NULL) {
+				if (! dom_str_equal (gth_metadata_get_raw (metadata), text)) {
+					gth_comment_set_time_from_exif_format (comment, gth_metadata_get_raw (metadata));
+					write_comment = TRUE;
+				}
+			}
+		}
+
+		categories = (GthStringList *) g_file_info_get_attribute_object (file_data->info, "general::tags");
+		if (categories != NULL) {
+			comment_categories = (GthStringList *) g_file_info_get_attribute_object (file_data->info, "comment::categories");
+			if (! gth_string_list_equal (categories, comment_categories)) {
+				GList *scan;
+
+				gth_comment_clear_categories (comment);
+				for (scan = gth_string_list_get_list (categories); scan; scan = scan->next)
+					gth_comment_add_category (comment, scan->data);
+				write_comment = TRUE;
+			}
+		}
+
+		if (write_comment) {
+			GFile *comment_file;
+			GFile *comment_directory;
+			char  *buffer;
+			gsize  size;
+
+			comment_file = gth_comment_get_comment_file (file_data->file);
+			comment_directory = g_file_get_parent (comment_file);
+			if (! g_file_query_exists (comment_directory, NULL))
+				g_file_make_directory (comment_directory, NULL, NULL);
+
+			buffer = gth_comment_to_data (comment, &size);
+			g_write_file (comment_file,
+				      FALSE,
+				      G_FILE_CREATE_NONE,
+				      buffer,
+				      size,
+				      NULL,
+				      NULL);
+
+			{
+				GFile *parent;
+				GList *list;
+
+				parent = g_file_get_parent (file_data->file);
+				list = g_list_prepend (NULL, file_data->file);
+				gth_monitor_folder_changed (gth_main_get_default_monitor (),
+							    parent,
+							    list,
+							    GTH_MONITOR_EVENT_CHANGED);
+
+				g_list_free (list);
+				g_object_unref (parent);
+			}
+
+			g_free (buffer);
+			g_object_unref (comment_directory);
+			g_object_unref (comment_file);
+		}
+
+		g_object_unref (comment);
+	}
+}
diff --git a/extensions/comments/gth-comment.h b/extensions/comments/gth-comment.h
index 0995626..1e0d13f 100644
--- a/extensions/comments/gth-comment.h
+++ b/extensions/comments/gth-comment.h
@@ -82,5 +82,6 @@ GDate *           gth_comment_get_date                   (GthComment    *comment
 GthTime *         gth_comment_get_time_of_day            (GthComment    *comment);
 char *            gth_comment_get_time_as_exif_format    (GthComment    *comment);
 void              gth_comment_update_general_attributes  (GthFileData   *file_data);
+void              gth_comment_synchronize_metadata       (GList         *file_list /* GthFileData list */);
 
 #endif /* GTH_COMMENT_H */
diff --git a/extensions/comments/gth-import-metadata-task.c b/extensions/comments/gth-import-metadata-task.c
new file mode 100644
index 0000000..49044a7
--- /dev/null
+++ b/extensions/comments/gth-import-metadata-task.c
@@ -0,0 +1,238 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2012 Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include "gth-comment.h"
+#include "gth-import-metadata-task.h"
+#include "preferences.h"
+
+
+struct _GthImportMetadataTaskPrivate {
+	GthBrowser    *browser;
+	GList         *file_list;
+	GList         *current;
+	GthFileData   *file_data;
+};
+
+
+G_DEFINE_TYPE (GthImportMetadataTask, gth_import_metadata_task, GTH_TYPE_TASK)
+
+
+static void
+gth_import_metadata_task_finalize (GObject *object)
+{
+	GthImportMetadataTask *self;
+
+	self = GTH_IMPORT_METADATA_TASK (object);
+
+	_g_object_unref (self->priv->file_data);
+	_g_object_list_unref (self->priv->file_list);
+
+	G_OBJECT_CLASS (gth_import_metadata_task_parent_class)->finalize (object);
+}
+
+
+static void import_current_file (GthImportMetadataTask *self);
+
+
+static void
+transform_next_file (GthImportMetadataTask *self)
+{
+	self->priv->current = self->priv->current->next;
+	import_current_file (self);
+}
+
+
+static void
+write_file_ready_cb (void     **buffer,
+		     gsize      count,
+		     GError    *error,
+		     gpointer   user_data)
+{
+	GthImportMetadataTask *self = user_data;
+
+	if (error != NULL) {
+		gth_task_completed (GTH_TASK (self), error);
+		return;
+	}
+
+	{
+		GFile *file;
+		GFile *parent;
+		GList *list;
+
+		file = self->priv->current->data;
+		parent = g_file_get_parent (file);
+		list = g_list_prepend (NULL, file);
+		gth_monitor_folder_changed (gth_main_get_default_monitor (),
+					    parent,
+					    list,
+					    GTH_MONITOR_EVENT_CHANGED);
+
+		g_list_free (list);
+		g_object_unref (parent);
+	}
+
+	transform_next_file (self);
+}
+
+
+static void
+load_file_ready_cb (void     **buffer,
+		    gsize      count,
+		    GError    *error,
+		    gpointer   user_data)
+{
+	GthImportMetadataTask *self = user_data;
+	GFile                 *file;
+	void                  *tmp_buffer;
+
+	if (error != NULL) {
+		gth_task_completed (GTH_TASK (self), error);
+		return;
+	}
+
+	file = self->priv->current->data;
+
+	tmp_buffer = *buffer;
+	*buffer = NULL;
+
+	gth_hook_invoke ("delete-metadata", file, &tmp_buffer, &count);
+
+	g_write_file_async (file,
+			    tmp_buffer,
+	    		    count,
+	    		    TRUE,
+	    		    G_PRIORITY_DEFAULT,
+	    		    gth_task_get_cancellable (GTH_TASK (self)),
+			    write_file_ready_cb,
+			    self);
+}
+
+
+static void
+import_current_file (GthImportMetadataTask *self)
+{
+	GFile *file;
+
+	if (self->priv->current == NULL) {
+		gth_task_completed (GTH_TASK (self), NULL);
+		return;
+	}
+
+	file = self->priv->current->data;
+	g_load_file_async (file,
+			   G_PRIORITY_DEFAULT,
+			   gth_task_get_cancellable (GTH_TASK (self)),
+			   load_file_ready_cb,
+			   self);
+}
+
+
+static void
+metadata_ready_cb (GObject      *source_object,
+		   GAsyncResult *res,
+		   gpointer      user_data)
+{
+	GthImportMetadataTask *self = user_data;
+	GList                 *file_data_list;
+	GError                *error = NULL;
+	GSettings             *settings;
+	gboolean               store_metadata_in_files;
+	gboolean               synchronize;
+
+	file_data_list = _g_query_metadata_finish (res, &error);
+	if (error != NULL) {
+		gth_task_completed (GTH_TASK (self), error);
+		return;
+	}
+
+	settings = g_settings_new (GTHUMB_GENERAL_SCHEMA);
+	store_metadata_in_files = g_settings_get_boolean (settings, PREF_GENERAL_STORE_METADATA_IN_FILES);
+	g_object_unref (settings);
+
+	settings = g_settings_new (GTHUMB_COMMENTS_SCHEMA);
+	synchronize = g_settings_get_boolean (settings, PREF_COMMENTS_SYNCHRONIZE);
+	g_object_unref (settings);
+
+	/* Synchronization is done in _g_query_metadata_async if both
+	 * PREF_GENERAL_STORE_METADATA_IN_FILES and PREF_COMMENTS_SYNCHRONIZE
+	 * are true. */
+	if (! store_metadata_in_files || ! synchronize)
+		gth_comment_synchronize_metadata (file_data_list);
+
+	gth_task_completed (GTH_TASK (self), NULL);
+}
+
+
+static void
+gth_import_metadata_task_exec (GthTask *task)
+{
+	GthImportMetadataTask *self;
+
+	g_return_if_fail (GTH_IS_IMPORT_METADATA_TASK (task));
+
+	self = GTH_IMPORT_METADATA_TASK (task);
+
+	_g_query_metadata_async (self->priv->file_list,
+				 "*",
+				 gth_task_get_cancellable (task),
+				 metadata_ready_cb,
+				 self);
+}
+
+
+static void
+gth_import_metadata_task_class_init (GthImportMetadataTaskClass *klass)
+{
+	GObjectClass *object_class;
+	GthTaskClass *task_class;
+
+	g_type_class_add_private (klass, sizeof (GthImportMetadataTaskPrivate));
+
+	object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = gth_import_metadata_task_finalize;
+
+	task_class = GTH_TASK_CLASS (klass);
+	task_class->exec = gth_import_metadata_task_exec;
+}
+
+
+static void
+gth_import_metadata_task_init (GthImportMetadataTask *self)
+{
+	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_IMPORT_METADATA_TASK, GthImportMetadataTaskPrivate);
+	self->priv->file_data = NULL;
+}
+
+
+GthTask *
+gth_import_metadata_task_new (GthBrowser *browser,
+			      GList      *file_list)
+{
+	GthImportMetadataTask *self;
+
+	self = GTH_IMPORT_METADATA_TASK (g_object_new (GTH_TYPE_IMPORT_METADATA_TASK, NULL));
+	self->priv->browser = browser;
+	self->priv->file_list = _g_object_list_ref (file_list);
+
+	return (GthTask *) self;
+}
diff --git a/extensions/comments/gth-import-metadata-task.h b/extensions/comments/gth-import-metadata-task.h
new file mode 100644
index 0000000..0eeec94
--- /dev/null
+++ b/extensions/comments/gth-import-metadata-task.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2012 The Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GTH_IMPORT_METADATA_TASK_H
+#define GTH_IMPORT_METADATA_TASK_H
+
+#include <glib.h>
+#include <gthumb.h>
+
+G_BEGIN_DECLS
+
+#define GTH_TYPE_IMPORT_METADATA_TASK            (gth_import_metadata_task_get_type ())
+#define GTH_IMPORT_METADATA_TASK(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTH_TYPE_IMPORT_METADATA_TASK, GthImportMetadataTask))
+#define GTH_IMPORT_METADATA_TASK_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GTH_TYPE_IMPORT_METADATA_TASK, GthImportMetadataTaskClass))
+#define GTH_IS_IMPORT_METADATA_TASK(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTH_TYPE_IMPORT_METADATA_TASK))
+#define GTH_IS_IMPORT_METADATA_TASK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTH_TYPE_IMPORT_METADATA_TASK))
+#define GTH_IMPORT_METADATA_TASK_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), GTH_TYPE_IMPORT_METADATA_TASK, GthImportMetadataTaskClass))
+
+typedef struct _GthImportMetadataTask        GthImportMetadataTask;
+typedef struct _GthImportMetadataTaskClass   GthImportMetadataTaskClass;
+typedef struct _GthImportMetadataTaskPrivate GthImportMetadataTaskPrivate;
+
+struct _GthImportMetadataTask {
+	GthTask __parent;
+	GthImportMetadataTaskPrivate *priv;
+};
+
+struct _GthImportMetadataTaskClass {
+	GthTaskClass __parent;
+};
+
+GType         gth_import_metadata_task_get_type  (void);
+GthTask *     gth_import_metadata_task_new       (GthBrowser   *browser,
+						  GList        *file_list /* GFile list */);
+
+G_END_DECLS
+
+#endif /* GTH_IMPORT_METADATA_TASK_H */
diff --git a/extensions/comments/main.c b/extensions/comments/main.c
index 55daf98..3ef633b 100644
--- a/extensions/comments/main.c
+++ b/extensions/comments/main.c
@@ -23,6 +23,7 @@
 #include <config.h>
 #include <gtk/gtk.h>
 #include <gthumb.h>
+#include "callbacks.h"
 #include "dlg-comments-preferences.h"
 #include "gth-comment.h"
 #include "gth-metadata-provider-comment.h"
@@ -82,7 +83,6 @@ comments__read_metadata_ready_cb (GList      *file_list,
 {
 	GSettings *settings;
 	gboolean   store_metadata_in_files;
-	GList     *scan;
 	gboolean   synchronize;
 
 	settings = g_settings_new (GTHUMB_GENERAL_SCHEMA);
@@ -90,6 +90,8 @@ comments__read_metadata_ready_cb (GList      *file_list,
 	g_object_unref (settings);
 
 	if (! store_metadata_in_files) {
+		GList *scan;
+
 		/* if PREF_GENERAL_STORE_METADATA_IN_FILES is false, avoid to
 		 * synchronize the .comment metadata because the embedded
 		 * metadata is likely to be out-of-date.
@@ -109,130 +111,7 @@ comments__read_metadata_ready_cb (GList      *file_list,
 	if (! synchronize)
 		return;
 
-	for (scan = file_list; scan; scan = scan->next) {
-		GthFileData   *file_data = scan->data;
-		gboolean       write_comment;
-		GthMetadata   *metadata;
-		GthStringList *comment_categories;
-		GList         *scan;
-		const char    *text;
-		GthComment    *comment;
-		GthStringList *categories;
-
-		write_comment = FALSE;
-
-		comment = gth_comment_new ();
-		gth_comment_set_note (comment, g_file_info_get_attribute_string (file_data->info, "comment::note"));
-		gth_comment_set_caption (comment, g_file_info_get_attribute_string (file_data->info, "comment::caption"));
-		gth_comment_set_place (comment, g_file_info_get_attribute_string (file_data->info, "comment::place"));
-
-		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "comment::time");
-		if (metadata != NULL)
-			gth_comment_set_time_from_exif_format (comment, gth_metadata_get_raw (metadata));
-
-		comment_categories = (GthStringList *) g_file_info_get_attribute_object (file_data->info, "comment::categories");
-		if (comment_categories != NULL)
-			for (scan = gth_string_list_get_list (comment_categories); scan; scan = scan->next)
-				gth_comment_add_category (comment, (char *) scan->data);
-
-		gth_comment_set_rating (comment, g_file_info_get_attribute_int32 (file_data->info, "comment::rating"));
-
-		/* sync embedded data and .comment data if required */
-
-		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::description");
-		if (metadata != NULL) {
-			text = g_file_info_get_attribute_string (file_data->info, "comment::note");
-			if (! dom_str_equal (gth_metadata_get_formatted (metadata), text)) {
-				gth_comment_set_note (comment, gth_metadata_get_formatted (metadata));
-				write_comment = TRUE;
-			}
-		}
-
-		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::title");
-		if (metadata != NULL) {
-			text = g_file_info_get_attribute_string (file_data->info, "comment::caption");
-			if (! dom_str_equal (gth_metadata_get_formatted (metadata), text)) {
-				gth_comment_set_caption (comment, gth_metadata_get_formatted (metadata));
-				write_comment = TRUE;
-			}
-		}
-
-		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::location");
-		if (metadata != NULL) {
-			text = g_file_info_get_attribute_string (file_data->info, "comment::place");
-			if (! dom_str_equal (gth_metadata_get_formatted (metadata), text)) {
-				gth_comment_set_place (comment, gth_metadata_get_formatted (metadata));
-				write_comment = TRUE;
-			}
-		}
-
-		metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "general::datetime");
-		if (metadata != NULL) {
-			text = gth_metadata_get_raw (metadata);
-			metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "comment::time");
-			if (metadata != NULL) {
-				if (! dom_str_equal (gth_metadata_get_raw (metadata), text)) {
-					gth_comment_set_time_from_exif_format (comment, gth_metadata_get_raw (metadata));
-					write_comment = TRUE;
-				}
-			}
-		}
-
-		categories = (GthStringList *) g_file_info_get_attribute_object (file_data->info, "general::tags");
-		if (categories != NULL) {
-			comment_categories = (GthStringList *) g_file_info_get_attribute_object (file_data->info, "comment::categories");
-			if (! gth_string_list_equal (categories, comment_categories)) {
-				GList *scan;
-
-				gth_comment_clear_categories (comment);
-				for (scan = gth_string_list_get_list (categories); scan; scan = scan->next)
-					gth_comment_add_category (comment, scan->data);
-				write_comment = TRUE;
-			}
-		}
-
-		if (write_comment) {
-			GFile *comment_file;
-			GFile *comment_directory;
-			char  *buffer;
-			gsize  size;
-
-			comment_file = gth_comment_get_comment_file (file_data->file);
-			comment_directory = g_file_get_parent (comment_file);
-			if (! g_file_query_exists (comment_directory, NULL))
-				g_file_make_directory (comment_directory, NULL, NULL);
-
-			buffer = gth_comment_to_data (comment, &size);
-			g_write_file (comment_file,
-				      FALSE,
-				      G_FILE_CREATE_NONE,
-				      buffer,
-				      size,
-				      NULL,
-				      NULL);
-
-			{
-				GFile *parent;
-				GList *list;
-
-				parent = g_file_get_parent (file_data->file);
-				list = g_list_prepend (NULL, file_data->file);
-				gth_monitor_folder_changed (gth_main_get_default_monitor (),
-							    parent,
-							    list,
-							    GTH_MONITOR_EVENT_CHANGED);
-
-				g_list_free (list);
-				g_object_unref (parent);
-			}
-
-			g_free (buffer);
-			g_object_unref (comment_directory);
-			g_object_unref (comment_file);
-		}
-
-		g_object_unref (comment);
-	}
+	gth_comment_synchronize_metadata (file_list);
 }
 
 
@@ -284,6 +163,7 @@ gthumb_extension_activate (void)
 	gth_hook_add_callback ("read-metadata-ready", 10, G_CALLBACK (comments__read_metadata_ready_cb), NULL);
 	if (gth_main_extension_is_active ("edit_metadata"))
 		gth_hook_add_callback ("delete-metadata", 10, G_CALLBACK (comments__delete_metadata_cb), NULL);
+	gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (comments__gth_browser_construct_cb), NULL);
 }
 
 
diff --git a/extensions/list_tools/callbacks.c b/extensions/list_tools/callbacks.c
index ff2a5b1..0cfec21 100644
--- a/extensions/list_tools/callbacks.c
+++ b/extensions/list_tools/callbacks.c
@@ -59,6 +59,7 @@ static const char *fixed_ui_info =
 */
 "  <popup name='ListToolsPopup'>"
 "    <placeholder name='Tools'/>"
+"    <separator/>"
 "    <placeholder name='Tools_2'/>"
 "    <separator name='ToolsSeparator'/>"
 "    <placeholder name='Scripts'/>"
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 15661ef..aabd40d 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -70,6 +70,8 @@ extensions/cairo_io/cairo-io-jpeg.c
 extensions/cairo_io/cairo-io-jpeg.h
 extensions/cairo_io/cairo-io-png.c
 extensions/cairo_io/cairo-io-png.h
+extensions/cairo_io/cairo-io-svg.c
+extensions/cairo_io/cairo-io-svg.h
 extensions/cairo_io/main.c
 extensions/catalogs/actions.c
 extensions/catalogs/actions.h
@@ -105,12 +107,18 @@ extensions/change_date/gth-change-date-task.c
 extensions/change_date/gth-change-date-task.h
 extensions/change_date/main.c
 extensions/change_date/preferences.h
+extensions/comments/actions.c
+extensions/comments/actions.h
+extensions/comments/callbacks.c
+extensions/comments/callbacks.h
 [type: gettext/ini]extensions/comments/comments.extension.in.in
 [type: gettext/glade]extensions/comments/data/ui/comments-preferences.ui
 extensions/comments/dlg-comments-preferences.c
 extensions/comments/dlg-comments-preferences.h
 extensions/comments/gth-comment.c
 extensions/comments/gth-comment.h
+extensions/comments/gth-import-metadata-task.c
+extensions/comments/gth-import-metadata-task.h
 extensions/comments/gth-metadata-provider-comment.c
 extensions/comments/gth-metadata-provider-comment.h
 extensions/comments/main.c
@@ -173,6 +181,8 @@ extensions/edit_metadata/gth-edit-tags-dialog.h
 extensions/edit_metadata/gth-tag-task.c
 extensions/edit_metadata/gth-tag-task.h
 extensions/edit_metadata/main.c
+extensions/edit_metadata/utils.c
+extensions/edit_metadata/utils.h
 [type: gettext/ini]extensions/example/src/example.extension.in.in
 extensions/example/src/main.c
 [type: gettext/glade]extensions/exiv2_tools/data/ui/edit-exiv2-page.ui
@@ -608,8 +618,16 @@ extensions/search/gth-search-task.c
 extensions/search/gth-search-task.h
 extensions/search/main.c
 [type: gettext/ini]extensions/search/search.extension.in.in
+extensions/selections/actions.c
+extensions/selections/actions.h
 extensions/selections/callbacks.c
+extensions/selections/callbacks.h
+extensions/selections/gth-file-source-selections.c
+extensions/selections/gth-file-source-selections.h
 extensions/selections/gth-selections-manager.c
+extensions/selections/gth-selections-manager.h
+extensions/selections/main.c
+[type: gettext/ini]extensions/selections/selections.extension.in.in
 extensions/slideshow/actions.c
 extensions/slideshow/actions.h
 extensions/slideshow/callbacks.c



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