/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2009 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 . */ #include #include #include "dlg-catalog-properties.h" #include "gth-catalog.h" #define GET_WIDGET(name) _gtk_builder_get_widget (data->builder, (name)) typedef struct { GthBrowser *browser; GtkBuilder *builder; GtkWidget *dialog; GtkWidget *time_selector; GthCatalog *catalog; GthFileData *file_data; GFile *original_file; } DialogData; static void destroy_cb (GtkWidget *widget, DialogData *data) { g_object_ref (data->file_data); _g_object_unref (data->catalog); g_object_unref (data->builder); g_free (data); } static void catalog_saved_cb (void **buffer, gsize count, GError *error, gpointer user_data) { DialogData *data = user_data; if (error == NULL) { if (! g_file_equal (data->original_file, data->file_data->file)) { GFile *gio_file; gio_file = gth_catalog_file_to_gio_file (data->original_file); g_file_delete (gio_file, NULL, NULL); g_object_unref (gio_file); gth_monitor_file_renamed (gth_main_get_default_monitor (), data->original_file, data->file_data->file); } gth_catalog_update_metadata (data->catalog, data->file_data); gth_monitor_metadata_changed (gth_main_get_default_monitor (), data->file_data); gth_hook_invoke ("dlg-catalog-properties-saved", data->browser, data->file_data, data->catalog); } else _gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Could not save the catalog"), error); gtk_widget_destroy (data->dialog); } static void save_button_clicked_cb (GtkButton *button, DialogData *data) { GthDateTime *date_time; GFile *gio_file; char *buffer; gsize size; if (strcmp (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry"))), "") != 0) { GFile *parent; char *uri; char *clean_name; char *ext; char *display_name; GFile *new_file; parent = g_file_get_parent (data->original_file); uri = g_file_get_uri (data->original_file); clean_name = _g_filename_clear_for_file (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry")))); ext = _g_uri_get_extension (uri); display_name = g_strconcat (clean_name, ext, NULL); new_file = g_file_get_child_for_display_name (parent, display_name, NULL); if ((new_file != NULL) && ! g_file_equal (new_file, data->original_file)) gth_file_data_set_file (data->file_data, new_file); _g_object_unref (new_file); g_free (display_name); g_free (ext); g_free (clean_name); g_free (uri); g_object_unref (parent); } gth_catalog_set_name (data->catalog, gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry")))); date_time = gth_datetime_new (); gth_time_selector_get_value (GTH_TIME_SELECTOR (data->time_selector), date_time); gth_catalog_set_date (data->catalog, date_time); gth_datetime_free (date_time); /* invoke the hook to save derived catalogs such as searches */ gth_hook_invoke ("dlg-catalog-properties-save", data->builder, data->file_data, data->catalog); gio_file = gth_catalog_file_to_gio_file (data->file_data->file); buffer = gth_catalog_to_data (data->catalog, &size); _g_file_write_async (gio_file, buffer, size, TRUE, G_PRIORITY_DEFAULT, NULL, catalog_saved_cb, data); g_object_unref (gio_file); } static void catalog_ready_cb (GObject *object, GError *error, gpointer user_data) { DialogData *data = user_data; if (error != NULL) { _gtk_error_dialog_from_gerror_show (GTK_WINDOW(data->browser), _("Could not load the catalog"), error); gtk_widget_destroy (data->dialog); return; } g_assert (object != NULL); data->catalog = GTH_CATALOG (g_object_ref (object)); if (gth_catalog_get_name (data->catalog) != NULL) { gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), gth_catalog_get_name (data->catalog)); } else if (! gth_datetime_valid_date (gth_catalog_get_date (data->catalog))) { char *basename; char *name; char *utf8_name; basename = g_file_get_basename (data->file_data->file); name = _g_path_remove_extension (basename); utf8_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL); gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), utf8_name); g_free (utf8_name); g_free (name); g_free (basename); } gth_time_selector_set_value (GTH_TIME_SELECTOR (data->time_selector), gth_catalog_get_date (data->catalog)); gth_hook_invoke ("dlg-catalog-properties", data->builder, data->file_data, data->catalog); gtk_widget_show (data->dialog); g_object_unref (object); } void dlg_catalog_properties (GthBrowser *browser, GthFileData *file_data) { DialogData *data; g_return_if_fail (file_data != NULL); data = g_new0 (DialogData, 1); data->browser = browser; data->file_data = gth_file_data_dup (file_data); data->original_file = g_file_dup (data->file_data->file); data->builder = _gtk_builder_new_from_file ("catalog-properties.ui", "catalogs"); /* Set widgets data. */ data->dialog = g_object_new (GTK_TYPE_DIALOG, "title", _("Properties"), "transient-for", GTK_WINDOW (browser), "modal", FALSE, "destroy-with-parent", FALSE, "use-header-bar", _gtk_settings_get_dialogs_use_header (), NULL); gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))), _gtk_builder_get_widget (data->builder, "dialog_content")); gtk_dialog_add_buttons (GTK_DIALOG (data->dialog), _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL, _GTK_LABEL_SAVE, GTK_RESPONSE_OK, NULL); _gtk_dialog_add_class_to_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK, GTK_STYLE_CLASS_SUGGESTED_ACTION); data->time_selector = gth_time_selector_new (); gth_time_selector_show_time (GTH_TIME_SELECTOR (data->time_selector), FALSE, FALSE); gtk_widget_show (data->time_selector); gtk_box_pack_start (GTK_BOX (GET_WIDGET ("date_container_box")), data->time_selector, TRUE, TRUE, 0); /* Set the signals handlers. */ g_signal_connect (G_OBJECT (data->dialog), "destroy", G_CALLBACK (destroy_cb), data); g_signal_connect (gtk_dialog_get_widget_for_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK), "clicked", G_CALLBACK (save_button_clicked_cb), data); g_signal_connect_swapped (gtk_dialog_get_widget_for_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_CANCEL), "clicked", G_CALLBACK (gtk_widget_destroy), data->dialog); /* run dialog. */ gtk_widget_grab_focus (GET_WIDGET ("name_entry")); gth_catalog_load_from_file_async (file_data->file, NULL, catalog_ready_cb, data); }