/* -*- 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 "gth-edit-comment-dialog.h" #include "gth-edit-metadata-dialog.h" struct _GthEditCommentDialogPrivate { GtkWidget *notebook; GtkWidget *save_changed_checkbutton; }; static void gth_edit_comment_dialog_gth_edit_metadata_dialog_interface_init (GthEditMetadataDialogInterface *iface); G_DEFINE_TYPE_WITH_CODE (GthEditCommentDialog, gth_edit_comment_dialog, GTK_TYPE_DIALOG, G_ADD_PRIVATE (GthEditCommentDialog) G_IMPLEMENT_INTERFACE (GTH_TYPE_EDIT_METADATA_DIALOG, gth_edit_comment_dialog_gth_edit_metadata_dialog_interface_init)) static void gth_edit_comment_dialog_set_file_list (GthEditMetadataDialog *base, GList *file_list) { GthEditCommentDialog *self = GTH_EDIT_COMMENT_DIALOG (base); int n_files; GList *pages; GList *scan; /* update the widgets */ n_files = g_list_length (file_list); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->priv->save_changed_checkbutton), n_files > 1); gtk_widget_set_sensitive (self->priv->save_changed_checkbutton, n_files > 1); pages = gtk_container_get_children (GTK_CONTAINER (self->priv->notebook)); for (scan = pages; scan; scan = scan->next) gth_edit_comment_page_set_file_list (GTH_EDIT_COMMENT_PAGE (scan->data), file_list); gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_APPLY, n_files > 0); gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_OK, n_files > 0); g_list_free (pages); } static void gth_edit_comment_dialog_update_info (GthEditMetadataDialog *base, GList *file_list /* GthFileData list */) { GthEditCommentDialog *self = GTH_EDIT_COMMENT_DIALOG (base); gboolean only_modified_fields; GList *pages; GList *scan; only_modified_fields = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->priv->save_changed_checkbutton)); pages = gtk_container_get_children (GTK_CONTAINER (self->priv->notebook)); for (scan = pages; scan; scan = scan->next) { GList *scan_file; for (scan_file = file_list; scan_file; scan_file = scan_file->next) { GthFileData *file_data = scan_file->data; gth_edit_comment_page_update_info (GTH_EDIT_COMMENT_PAGE (scan->data), file_data->info, only_modified_fields); } } g_list_free (pages); } static void gth_edit_comment_dialog_gth_edit_metadata_dialog_interface_init (GthEditMetadataDialogInterface *iface) { iface->set_file_list = gth_edit_comment_dialog_set_file_list; iface->update_info = gth_edit_comment_dialog_update_info; } static void gth_edit_comment_dialog_class_init (GthEditCommentDialogClass *klass) { /* void */ } static void gth_edit_comment_dialog_init (GthEditCommentDialog *self) { GtkWidget *vbox; GArray *pages; int i; self->priv = gth_edit_comment_dialog_get_instance_private (self); gtk_window_set_title (GTK_WINDOW (self), _("Comment")); gtk_window_set_resizable (GTK_WINDOW (self), TRUE); gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), 5); gtk_container_set_border_width (GTK_CONTAINER (self), 5); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); gtk_widget_show (vbox); gtk_box_pack_end (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), vbox, TRUE, TRUE, 0); self->priv->notebook = gtk_notebook_new (); gtk_widget_show (self->priv->notebook); gtk_box_pack_start (GTK_BOX (vbox), self->priv->notebook, TRUE, TRUE, 0); self->priv->save_changed_checkbutton = gtk_check_button_new_with_mnemonic (_("Save only cha_nged fields")); gtk_widget_show (self->priv->save_changed_checkbutton); gtk_box_pack_start (GTK_BOX (vbox), self->priv->save_changed_checkbutton, FALSE, FALSE, 0); pages = gth_main_get_type_set ("edit-comment-dialog-page"); if (pages == NULL) return; for (i = 0; i < pages->len; i++) { GType page_type; GtkWidget *page; page_type = g_array_index (pages, GType, i); page = g_object_new (page_type, NULL); if (! GTH_IS_EDIT_COMMENT_PAGE (page)) { g_object_unref (page); continue; } gtk_widget_show (page); gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), page, gtk_label_new (gth_edit_comment_page_get_name (GTH_EDIT_COMMENT_PAGE (page)))); } } /* -- gth_edit_comment_dialog_page -- */ G_DEFINE_INTERFACE (GthEditCommentPage, gth_edit_comment_page, 0) static void gth_edit_comment_page_default_init (GthEditCommentPageInterface *iface) { /* void */ } void gth_edit_comment_page_set_file_list (GthEditCommentPage *self, GList *file_list) { GTH_EDIT_COMMENT_PAGE_GET_INTERFACE (self)->set_file_list (self, file_list); } void gth_edit_comment_page_update_info (GthEditCommentPage *self, GFileInfo *info, gboolean only_modified_fields) { GTH_EDIT_COMMENT_PAGE_GET_INTERFACE (self)->update_info (self, info, only_modified_fields); } const char * gth_edit_comment_page_get_name (GthEditCommentPage *self) { return GTH_EDIT_COMMENT_PAGE_GET_INTERFACE (self)->get_name (self); }