static void catalog_ready_cb (GObject *catalog, GError *error, gpointer user_data) { AddData *add_data = user_data; GList *scan; char *buffer; gsize length; GFile *gio_file; if (error != NULL) { _gtk_error_dialog_from_gerror_show (GTK_WINDOW (add_data->parent_window), _("Could not add the files to the catalog"), &error); return; } add_data->catalog = (GthCatalog *) catalog; for (scan = add_data->files; scan; scan = scan->next) gth_catalog_insert_file (add_data->catalog, (GFile *) scan->data, -1); buffer = gth_catalog_to_data (add_data->catalog, &length); gio_file = gth_catalog_file_to_gio_file (add_data->catalog_file); g_write_file_async (gio_file, buffer, length, TRUE, G_PRIORITY_DEFAULT, NULL, catalog_save_done_cb, add_data); g_object_unref (gio_file); }
static gboolean process_rename_data_list (gpointer user_data) { BrowserData *data = user_data; GList *scan; g_source_remove (data->update_renamed_files_id); data->update_renamed_files_id = 0; for (scan = data->rename_data_list; scan; scan = scan->next) { RenameData *rename_data = scan->data; GthCatalog *catalog; GList *scan_files; GList *scan_new_files; GFile *gio_file; char *catalog_data; gsize catalog_data_size; GError *error = NULL; catalog = gth_catalog_load_from_file (rename_data->location); for (scan_files = rename_data->files, scan_new_files = rename_data->new_files; scan_files && scan_new_files; scan_files = scan_files->next, scan_new_files = scan_new_files->next) { GFile *file = scan_files->data; GFile *new_file = scan_new_files->data; int pos; pos = gth_catalog_remove_file (catalog, file); gth_catalog_insert_file (catalog, new_file, pos); } gio_file = gth_catalog_file_to_gio_file (rename_data->location); catalog_data = gth_catalog_to_data (catalog, &catalog_data_size); if (! _g_file_write (gio_file, FALSE, G_FILE_CREATE_NONE, catalog_data, catalog_data_size, NULL, &error)) { g_warning ("%s", error->message); g_clear_error (&error); } g_free (catalog_data); g_object_unref (gio_file); g_object_unref (catalog); } rename_data_list_free (data); return FALSE; }
GFile * catalogs__command_line_files_cb (GList *files) { GFile *file; GthCatalog *catalog; GList *scan; if (g_list_length (files) <= 1) return NULL; file = _g_file_new_for_display_name ("catalog:///", _("Command Line"), ".catalog"); catalog = gth_catalog_new (); gth_catalog_set_file (catalog, file); gth_catalog_set_name (catalog, _("Command Line")); for (scan = files; scan; scan = scan->next) gth_catalog_insert_file (catalog, (GFile *) scan->data, -1); gth_catalog_save (catalog); g_object_unref (catalog); return file; }
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 done_func (GError *error, gpointer user_data) { GthOrganizeTask *self = user_data; char *status_text; if ((error != NULL) && ! g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { gth_task_completed (GTH_TASK (self), error); return; } if (! self->priv->create_singletons) { GtkTreeIter iter; int singletons = 0; if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (self->priv->results_liststore), &iter)) { do { char *key; int n; gtk_tree_model_get (GTK_TREE_MODEL (self->priv->results_liststore), &iter, KEY_COLUMN, &key, CARDINALITY_COLUMN, &n, -1); if (n == 1) { GthCatalog *catalog; GList *file_list; gtk_list_store_set (self->priv->results_liststore, &iter, CREATE_CATALOG_COLUMN, FALSE, -1); singletons++; catalog = g_hash_table_lookup (self->priv->catalogs, key); file_list = gth_catalog_get_file_list (catalog); gth_catalog_insert_file (self->priv->singletons_catalog, file_list->data, -1); if (singletons == 1) g_hash_table_insert (self->priv->catalogs, g_strdup (gth_catalog_get_name (self->priv->singletons_catalog)), g_object_ref (self->priv->singletons_catalog)); } g_free (key); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (self->priv->results_liststore), &iter)); } if ((self->priv->singletons_catalog != NULL) && (singletons > 0)) { gtk_list_store_append (self->priv->results_liststore, &iter); gtk_list_store_set (self->priv->results_liststore, &iter, KEY_COLUMN, gth_catalog_get_name (self->priv->singletons_catalog), NAME_COLUMN, gth_catalog_get_name (self->priv->singletons_catalog), CARDINALITY_COLUMN, singletons, CREATE_CATALOG_COLUMN, TRUE, ICON_COLUMN, self->priv->icon_pixbuf, -1); } } self->priv->organized = TRUE; status_text = g_strdup_printf (_("Operation completed. Catalogs: %d. Images: %d."), self->priv->n_catalogs, self->priv->n_files); gtk_label_set_text (GTK_LABEL (GET_WIDGET ("progress_label")), status_text); gtk_label_set_ellipsize (GTK_LABEL (GET_WIDGET ("progress_label")), PANGO_ELLIPSIZE_NONE); g_free (status_text); gtk_widget_hide (GET_WIDGET ("cancel_button")); gtk_widget_show (GET_WIDGET ("close_button")); gtk_widget_show (GET_WIDGET ("ok_button")); }