[gthumb] added a tool to import the embedded metadata in the gThumb comment system
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] added a tool to import the embedded metadata in the gThumb comment system
- Date: Thu, 22 Mar 2012 18:29:52 +0000 (UTC)
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]