/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2009 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 . */ #include #include #include #ifdef HAVE_EXIV2 #include #endif #include "callbacks.h" #include "dlg-comments-preferences.h" #include "gth-comment.h" #include "gth-metadata-provider-comment.h" #include "preferences.h" GthMetadataCategory comments_metadata_category[] = { { "comment", N_("Comment"), 20 }, { NULL, NULL, 0 } }; GthMetadataInfo comments_metadata_info[] = { { "comment::caption", N_("Title"), "comment", 1, NULL, GTH_METADATA_ALLOW_IN_FILE_LIST }, { "comment::note", N_("Description"), "comment", 2, NULL, GTH_METADATA_ALLOW_IN_FILE_LIST }, { "comment::place", N_("Place"), "comment", 3, NULL, GTH_METADATA_ALLOW_IN_FILE_LIST }, { "comment::time", N_("Comment Date & Time"), "comment", 4, NULL, GTH_METADATA_ALLOW_IN_FILE_LIST }, { "comment::categories", N_("Tags"), "comment", 5, NULL, GTH_METADATA_ALLOW_IN_FILE_LIST }, { "comment::rating", N_("Rating"), "comment", 6, NULL, GTH_METADATA_ALLOW_IN_FILE_LIST }, { NULL, NULL, NULL, 0, 0 } }; static int get_comment_for_test (GthTest *test, GthFileData *file, gconstpointer *data, GDestroyNotify *data_destroy_func) { *data = g_file_info_get_attribute_string (file->info, "comment::note"); return 0; } static int get_place_for_test (GthTest *test, GthFileData *file, gconstpointer *data, GDestroyNotify *data_destroy_func) { *data = g_file_info_get_attribute_string (file->info, "comment::place"); return 0; } static void comments__add_sidecars_cb (GFile *file, GList **sidecars) { *sidecars = g_list_prepend (*sidecars, gth_comment_get_comment_file (file)); } static void comments__read_metadata_ready_cb (GList *file_list, const char *attributes) { GSettings *settings; gboolean store_metadata_in_files; GList *scan; gboolean synchronize; settings = g_settings_new (PIX_GENERAL_SCHEMA); store_metadata_in_files = g_settings_get_boolean (settings, PREF_GENERAL_STORE_METADATA_IN_FILES); g_object_unref (settings); if (! store_metadata_in_files) { /* 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. * Give priority to the .comment metadata which, if present, * is the most up-to-date. */ #ifdef HAVE_EXIV2 gboolean can_read_embedded_attributes = gth_main_extension_is_active ("exiv2_tools"); #endif for (scan = file_list; scan; scan = scan->next) { GthFileData *file_data = scan->data; /* If PREF_GENERAL_STORE_METADATA_IN_FILES is false and * there is no comment file then we are reading * the image metadata for the first time, in this * case update the .comment metadata with the * embedded metadata. */ if (g_file_info_get_attribute_boolean (file_data->info, "comment::no-comment-file")) { #ifdef HAVE_EXIV2 if (can_read_embedded_attributes) { exiv2_update_general_attributes (file_data->info); gth_comment_update_from_general_attributes (file_data); } #endif } else gth_comment_update_general_attributes ((GthFileData *) scan->data); } } else { /* if PREF_GENERAL_STORE_METADATA_IN_FILES is true, update the .comment * metadata with the embedded metadata. */ settings = g_settings_new (PIX_COMMENTS_SCHEMA); synchronize = g_settings_get_boolean (settings, PREF_COMMENTS_SYNCHRONIZE); g_object_unref (settings); if (! synchronize) return; for (scan = file_list; scan; scan = scan->next) gth_comment_update_from_general_attributes ((GthFileData *) scan->data); } } static void comments__delete_metadata_cb (GFile *file, void **buffer, gsize *size) { GFile *comment_file; comment_file = gth_comment_get_comment_file (file); if (comment_file != NULL) { g_file_delete (comment_file, NULL, NULL); g_object_unref (comment_file); } } G_MODULE_EXPORT void pix_extension_activate (void) { gth_main_register_metadata_category (comments_metadata_category); gth_main_register_metadata_info_v (comments_metadata_info); gth_main_register_metadata_provider (GTH_TYPE_METADATA_PROVIDER_COMMENT); gth_main_register_object (GTH_TYPE_TEST, "comment::note", GTH_TYPE_TEST_SIMPLE, "attributes", "comment::note", "display-name", _("Description"), "data-type", GTH_TEST_DATA_TYPE_STRING, "get-data-func", get_comment_for_test, NULL); gth_main_register_object (GTH_TYPE_TEST, "comment::place", GTH_TYPE_TEST_SIMPLE, "attributes", "comment::place", "display-name", _("Place"), "data-type", GTH_TEST_DATA_TYPE_STRING, "get-data-func", get_place_for_test, NULL); gth_main_register_object (GTH_TYPE_TEST, "comment::category", GTH_TYPE_TEST_CATEGORY, "attributes", "comment::categories", "display-name", _("Tag"), NULL); gth_hook_add_callback ("add-sidecars", 10, G_CALLBACK (comments__add_sidecars_cb), NULL); 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); } G_MODULE_EXPORT void pix_extension_deactivate (void) { } G_MODULE_EXPORT gboolean pix_extension_is_configurable (void) { return TRUE; } G_MODULE_EXPORT void pix_extension_configure (GtkWindow *parent) { dlg_comments_preferences (parent); }