gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values) { if (!fd->modified_xmp) { fd->modified_xmp = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)string_list_free); } g_hash_table_insert(fd->modified_xmp, g_strdup(key), string_list_copy((GList *)values)); if (fd->exif) { exif_update_metadata(fd->exif, key, values); } metadata_write_queue_add(fd); file_data_increment_version(fd); file_data_send_notification(fd, NOTIFY_METADATA); if (options->metadata.sync_grouped_files && metadata_check_key(group_keys, key)) { GList *work = fd->sidecar_files; while (work) { FileData *sfd = work->data; work = work->next; if (filter_file_class(sfd->extension, FORMAT_CLASS_META)) continue; metadata_write_list(sfd, key, values); } } return TRUE; }
gboolean metadata_write_queue_remove(FileData *fd) { g_hash_table_destroy(fd->modified_xmp); fd->modified_xmp = NULL; metadata_write_queue = g_list_remove(metadata_write_queue, fd); file_data_increment_version(fd); file_data_send_notification(fd, NOTIFY_REREAD); file_data_unref(fd); layout_util_status_update_write_all(); return TRUE; }
gboolean metadata_write_revert(FileData *fd, const gchar *key) { if (!fd->modified_xmp) return FALSE; g_hash_table_remove(fd->modified_xmp, key); if (g_hash_table_size(fd->modified_xmp) == 0) { metadata_write_queue_remove(fd); } else { /* reread the metadata to restore the original value */ file_data_increment_version(fd); file_data_send_notification(fd, NOTIFY_REREAD); } return TRUE; }