static GthDateTime * gth_datetime_copy_for_boxed (GthDateTime *source) { GthDateTime *dest; dest = gth_datetime_new (); gth_datetime_copy (source, dest); return dest; }
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 *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")))); display_name = g_strconcat (clean_name, _g_uri_get_file_extension (uri), 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 (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 gboolean facebook_photo_deserialize_property (JsonSerializable *serializable, const gchar *property_name, GValue *value, GParamSpec *pspec, JsonNode *property_node) { FacebookPhoto *self = FACEBOOK_PHOTO (serializable); if (pspec->value_type == GTH_TYPE_DATETIME) { GTimeVal timeval; if (g_time_val_from_iso8601 (json_node_get_string (property_node), &timeval)) { GthDateTime *datetime; datetime = gth_datetime_new (); gth_datetime_from_timeval (datetime, &timeval); g_object_set (self, property_name, datetime, NULL); gth_datetime_free (datetime); return TRUE; } return FALSE; } if (pspec->value_type == FACEBOOK_TYPE_IMAGE_LIST) { GList *images = NULL; JsonArray *array; int i; array = json_node_get_array (property_node); for (i = 0; i < json_array_get_length (array); i++) { JsonObject *image_obj; image_obj = json_array_get_object_element (array, i); if (image_obj != NULL) { FacebookImage *image; image = facebook_image_new (); _g_strset (&image->source, json_object_get_string_member (image_obj, "source")); image->width = json_object_get_int_member (image_obj, "width"); image->height = json_object_get_int_member (image_obj, "height"); images = g_list_prepend (images, image); } } images = g_list_reverse (images); g_object_set (self, property_name, images, NULL); facebook_image_list_free (images); return TRUE; } return json_serializable_default_deserialize_property (serializable, property_name, value, pspec, property_node); }
static void for_each_file_func (GFile *file, GFileInfo *info, gpointer user_data) { GthOrganizeTask *self = user_data; GthFileData *file_data; char *key; GTimeVal timeval; GthCatalog *catalog; if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR) return; key = NULL; file_data = gth_file_data_new (file, info); switch (self->priv->group_policy) { case GTH_GROUP_POLICY_DIGITALIZED_DATE: { GObject *metadata; metadata = g_file_info_get_attribute_object (info, "Embedded::Photo::DateTimeOriginal"); if (metadata != NULL) { if (_g_time_val_from_exif_date (gth_metadata_get_raw (GTH_METADATA (metadata)), &timeval)) key = _g_time_val_strftime (&timeval, KEY_FORMAT); } } break; case GTH_GROUP_POLICY_MODIFIED_DATE: timeval = *gth_file_data_get_modification_time (file_data); key = _g_time_val_strftime (&timeval, KEY_FORMAT); break; } if (key == NULL) return; catalog = g_hash_table_lookup (self->priv->catalogs, key); if (catalog == NULL) { GthDateTime *date_time; GFile *catalog_file; char *name; GtkTreeIter iter; date_time = gth_datetime_new (); gth_datetime_from_timeval (date_time, &timeval); catalog_file = gth_catalog_get_file_for_date (date_time); catalog = gth_catalog_load_from_file (catalog_file); if (catalog == NULL) catalog = gth_catalog_new (); gth_catalog_set_for_date (catalog, date_time); g_hash_table_insert (self->priv->catalogs, g_strdup (key), catalog); name = gth_datetime_strftime (date_time, "%x"); gtk_list_store_append (self->priv->results_liststore, &iter); gtk_list_store_set (self->priv->results_liststore, &iter, KEY_COLUMN, key, NAME_COLUMN, name, CARDINALITY_COLUMN, 0, CREATE_CATALOG_COLUMN, TRUE, ICON_COLUMN, self->priv->icon_pixbuf, -1); self->priv->n_catalogs++; g_free (name); g_object_unref (catalog_file); gth_datetime_free (date_time); } if (catalog != NULL) { GtkTreeIter iter; int n = 0; if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (self->priv->results_liststore), &iter)) { do { char *k; gtk_tree_model_get (GTK_TREE_MODEL (self->priv->results_liststore), &iter, KEY_COLUMN, &k, CARDINALITY_COLUMN, &n, -1); if (g_strcmp0 (k, key) == 0) { gtk_list_store_set (self->priv->results_liststore, &iter, CARDINALITY_COLUMN, n + 1, -1); self->priv->n_files++; g_free (k); break; } g_free (k); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (self->priv->results_liststore), &iter)); } gth_catalog_insert_file (catalog, file_data->file, -1); } g_object_unref (file_data); g_free (key); }
static void ok_button_clicked (GtkWidget *button, DialogData *data) { GthChangeFields change_fields; GthChangeType change_type; GthDateTime *date_time; int time_adjustment; GthTask *task; date_time = NULL; change_fields = 0; if (IS_ACTIVE (GET_WIDGET ("change_last_modified_checkbutton"))) change_fields |= GTH_CHANGE_LAST_MODIFIED_DATE; if (IS_ACTIVE (GET_WIDGET ("change_comment_checkbutton"))) change_fields |= GTH_CHANGE_COMMENT_DATE; change_type = 0; time_adjustment = 0; if (IS_ACTIVE (GET_WIDGET ("to_following_date_radiobutton"))) { change_type = GTH_CHANGE_TO_FOLLOWING_DATE; date_time = gth_datetime_new (); gth_time_selector_get_value (GTH_TIME_SELECTOR (data->date_selector), date_time); } else if (IS_ACTIVE (GET_WIDGET ("to_last_modified_date_radiobutton"))) change_type = GTH_CHANGE_TO_FILE_MODIFIED_DATE; else if (IS_ACTIVE (GET_WIDGET ("to_creation_date_radiobutton"))) change_type = GTH_CHANGE_TO_FILE_CREATION_DATE; else if (IS_ACTIVE (GET_WIDGET ("to_photo_original_date_radiobutton"))) change_type = GTH_CHANGE_TO_PHOTO_ORIGINAL_DATE; else if (IS_ACTIVE (GET_WIDGET ("adjust_time_radiobutton"))) { change_type = GTH_CHANGE_ADJUST_TIME; time_adjustment = (HOURS_TO_SECONDS (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_h_spinbutton")))) + MINS_TO_SECONDS (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_m_spinbutton")))) + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_s_spinbutton")))); if (gtk_combo_box_get_active (GTK_COMBO_BOX (GET_WIDGET ("adjust_sign_combobox"))) == 1) time_adjustment = -time_adjustment; } /* save the preferences */ g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_SET_LAST_MODIFIED_DATE, (change_fields & GTH_CHANGE_LAST_MODIFIED_DATE) == GTH_CHANGE_LAST_MODIFIED_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_SET_COMMENT_DATE, (change_fields & GTH_CHANGE_COMMENT_DATE) == GTH_CHANGE_COMMENT_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FOLLOWING_DATE, change_type == GTH_CHANGE_TO_FOLLOWING_DATE); if (change_type == GTH_CHANGE_TO_FOLLOWING_DATE) { char *s; s = gth_datetime_to_exif_date (date_time); g_settings_set_string (data->settings, PREF_CHANGE_DATE_DATE, s); g_free (s); } g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_MODIFIED_DATE, change_type == GTH_CHANGE_TO_FILE_MODIFIED_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_CREATION_DATE, change_type == GTH_CHANGE_TO_FILE_CREATION_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_PHOTO_ORIGINAL_DATE, change_type == GTH_CHANGE_TO_PHOTO_ORIGINAL_DATE); g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_ADJUST_TIME, change_type == GTH_CHANGE_ADJUST_TIME); if (change_type == GTH_CHANGE_ADJUST_TIME) g_settings_set_int (data->settings, PREF_CHANGE_DATE_TIME_ADJUSTMENT, time_adjustment); /* exec the task */ task = gth_change_date_task_new (gth_browser_get_location (data->browser), data->file_list, change_fields, change_type, date_time, time_adjustment); gth_browser_exec_task (data->browser, task, FALSE); gtk_widget_destroy (data->dialog); g_object_unref (task); gth_datetime_free (date_time); }
void dlg_change_date (GthBrowser *browser, GList *file_list) { DialogData *data; GTimeVal timeval; GthDateTime *datetime; data = g_new0 (DialogData, 1); data->browser = browser; data->file_list = _g_object_list_ref (file_list); data->builder = _gtk_builder_new_from_file ("change-date.ui", "change_date"); data->settings = g_settings_new (GTHUMB_CHANGE_DATE_SCHEMA); /* Get the widgets. */ data->dialog = GET_WIDGET ("change_date_dialog"); data->date_selector = gth_time_selector_new (); gth_time_selector_show_time (GTH_TIME_SELECTOR (data->date_selector), TRUE, TRUE); gtk_widget_show (data->date_selector); gtk_box_pack_start (GTK_BOX (GET_WIDGET ("date_selector_box")), data->date_selector, TRUE, TRUE, 0); /* Set widgets data. */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("change_last_modified_checkbutton")), g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_SET_LAST_MODIFIED_DATE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("change_comment_checkbutton")), g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_SET_COMMENT_DATE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_following_date_radiobutton")), g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_TO_FOLLOWING_DATE)); datetime = gth_datetime_new (); g_get_current_time (&timeval); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_following_date_radiobutton")))) { char *s; s = g_settings_get_string (data->settings, PREF_CHANGE_DATE_DATE); if (strcmp (s, "") != 0) gth_datetime_from_exif_date (datetime, s); else gth_datetime_from_timeval (datetime, &timeval); g_free (s); } else gth_datetime_from_timeval (datetime, &timeval); gth_time_selector_set_value (GTH_TIME_SELECTOR (data->date_selector), datetime); gth_datetime_free (datetime); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_last_modified_date_radiobutton")), g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_MODIFIED_DATE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_creation_date_radiobutton")), g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_CREATION_DATE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_photo_original_date_radiobutton")), g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_TO_PHOTO_ORIGINAL_DATE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("adjust_time_radiobutton")), g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_ADJUST_TIME)); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("adjust_time_radiobutton")))) { int adjustement; int sign; int hours; int minutes; int seconds; adjustement = g_settings_get_int (data->settings, PREF_CHANGE_DATE_TIME_ADJUSTMENT); if (adjustement < 0) { sign = -1; adjustement = - adjustement; } else sign = 1; hours = adjustement / 3600; adjustement = adjustement % 3600; minutes = adjustement / 60; adjustement = adjustement % 60; seconds = adjustement; gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_h_spinbutton")), hours); gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_m_spinbutton")), minutes); gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_s_spinbutton")), seconds); gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("adjust_sign_combobox")), (sign >= 0) ? 0 : 1); } update_sensitivity (data); /* Set the signals handlers. */ g_signal_connect (G_OBJECT (data->dialog), "destroy", G_CALLBACK (dialog_destroy_cb), data); g_signal_connect_swapped (GET_WIDGET ("close_button"), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (data->dialog)); g_signal_connect (GET_WIDGET ("ok_button"), "clicked", G_CALLBACK (ok_button_clicked), data); g_signal_connect (GET_WIDGET ("change_last_modified_checkbutton"), "clicked", G_CALLBACK (radio_button_clicked), data); g_signal_connect (GET_WIDGET ("change_comment_checkbutton"), "clicked", G_CALLBACK (radio_button_clicked), data); g_signal_connect (GET_WIDGET ("to_following_date_radiobutton"), "clicked", G_CALLBACK (radio_button_clicked), data); g_signal_connect (GET_WIDGET ("to_last_modified_date_radiobutton"), "clicked", G_CALLBACK (radio_button_clicked), data); g_signal_connect (GET_WIDGET ("to_creation_date_radiobutton"), "clicked", G_CALLBACK (radio_button_clicked), data); g_signal_connect (GET_WIDGET ("to_photo_original_date_radiobutton"), "clicked", G_CALLBACK (radio_button_clicked), data); g_signal_connect (GET_WIDGET ("adjust_time_radiobutton"), "clicked", G_CALLBACK (radio_button_clicked), data); /* run dialog. */ gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (browser)); gtk_window_set_modal (GTK_WINDOW (data->dialog), FALSE); gtk_widget_show (data->dialog); }