static void dialog_data_unref (DialogData *data) { if (! g_atomic_int_dec_and_test (&data->ref)) return; if (data->file_selection_changed_event != 0) { g_signal_handler_disconnect (gth_browser_get_file_list_view (data->browser), data->file_selection_changed_event); data->file_selection_changed_event = 0; } if (data->update_selectection_event != 0) { g_source_remove (data->update_selectection_event); data->update_selectection_event = 0; } cancel_file_list_loading (data); gth_browser_set_dialog (data->browser, data->dialog_name, NULL); gtk_widget_destroy (data->dialog); g_free (data->dialog_name); _g_object_list_unref (data->file_list); _g_object_list_unref (data->parents); g_free (data); }
static void rename_data_free (RenameData *rename_data) { _g_object_list_unref (rename_data->files); _g_object_list_unref (rename_data->new_files); g_object_unref (rename_data->location); g_free (rename_data); }
static void import_dialog_destroy_cb (GtkWidget *widget, DialogData *data) { gth_task_completed (GTH_TASK (data->service), NULL); _g_object_unref (data->cancellable); _g_object_unref (data->service); _g_object_list_unref (data->albums); _g_object_unref (data->album); _g_object_list_unref (data->photos); _g_object_unref (data->builder); gtk_widget_destroy (data->progress_dialog); g_free (data); }
static void loader_completed_cb (GthTask *task, GError *error, gpointer user_data) { LoaderData *loader_data = user_data; DialogData *data = loader_data->data; if (error != NULL) { if (! g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) _gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Cannot read file information"), error); loader_data_free (loader_data); if (data->never_shown) close_dialog (data); return; } _g_object_list_unref (data->file_list); data->file_list = _g_object_list_ref (gth_load_file_data_task_get_result (GTH_LOAD_FILE_DATA_TASK (task))); gth_edit_metadata_dialog_set_file_list (GTH_EDIT_METADATA_DIALOG (data->dialog), data->file_list); gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (data->browser)); gtk_window_set_modal (GTK_WINDOW (data->dialog), FALSE); gtk_window_present (GTK_WINDOW (data->dialog)); data->never_shown = FALSE; loader_data_free (loader_data); }
static void loader_data_free (LoaderData *loader_data) { dialog_data_unref (loader_data->data); _g_object_list_unref (loader_data->files); g_free (loader_data); }
static void saver_completed_cb (GthTask *task, GError *error, gpointer user_data) { DialogData *data = user_data; GthMonitor *monitor; GList *scan; monitor = gth_main_get_default_monitor (); for (scan = data->parents; scan; scan = scan->next) gth_monitor_resume (monitor, (GFile *) scan->data); if (error != NULL) { if (! g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) _gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->dialog), _("Could not save the file metadata"), error); } else { for (scan = data->file_list; scan; scan = scan->next) { GthFileData *file_data = scan->data; GList *files; files = g_list_prepend (NULL, g_object_ref (file_data->file)); gth_monitor_metadata_changed (monitor, file_data); _g_object_list_unref (files); } } if (data->close_dialog) close_dialog (data); dialog_data_unref (data); }
static void update_selection_status (DialogData *data) { GList *file_list; int n_selected; goffset size_selected; GList *scan; char *size_selected_formatted; char *text_selected; file_list = get_files_to_download (data); n_selected = 0; size_selected = 0; for (scan = file_list; scan; scan = scan->next) { GthFileData *file_data = scan->data; n_selected++; size_selected += g_file_info_get_size (file_data->info); } size_selected_formatted = g_format_size (size_selected); text_selected = g_strdup_printf (g_dngettext (NULL, "%d file (%s)", "%d files (%s)", n_selected), n_selected, size_selected_formatted); gtk_label_set_text (GTK_LABEL (GET_WIDGET ("images_info_label")), text_selected); g_free (text_selected); g_free (size_selected_formatted); _g_object_list_unref (file_list); }
static void list_source_files (gpointer user_data) { DialogData *data = user_data; GList *list; _g_clear_object (&data->last_source); _g_object_list_unref (data->files); data->files = NULL; if (data->source == NULL) { gth_file_list_clear (GTH_FILE_LIST (data->file_list), _("(Empty)")); update_sensitivity (data); return; } gth_file_list_clear (GTH_FILE_LIST (data->file_list), _("Getting the folder content…")); data->loading_list = TRUE; list = g_list_prepend (NULL, data->source); _g_query_all_metadata_async (list, GTH_LIST_RECURSIVE | GTH_LIST_NO_HIDDEN_FILES | GTH_LIST_NO_BACKUP_FILES, DEFINE_STANDARD_ATTRIBUTES (",preview::icon,standard::fast-content-type,gth::file::display-size"), data->cancellable, list_ready_cb, data); g_list_free (list); }
static void ok_clicked_cb (GtkWidget *widget, DialogData *data) { GList *file_list; GFile *destination; GError *error = NULL; gboolean import; file_list = get_selected_file_list (data); destination = gth_import_preferences_get_destination (); if (! gth_import_task_check_free_space (destination, file_list, &error)) { _gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->dialog), _("Could not import the files"), error); g_clear_error (&error); import = FALSE; } else import = TRUE; _g_object_unref (destination); _g_object_list_unref (file_list); if (! import) return; data->import = TRUE; close_dialog (NULL, data); }
static gboolean update_file_list (gpointer user_data) { DialogData *data = user_data; LoaderData *loader_data; GList *items; GList *file_data_list; if (data->update_selectection_event != 0) { g_source_remove (data->update_selectection_event); data->update_selectection_event = 0; } cancel_file_list_loading (data); loader_data = g_new0 (LoaderData, 1); loader_data->data = dialog_data_ref (data); items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (data->browser))); file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (data->browser)), items); loader_data->files = gth_file_data_list_to_file_list (file_data_list); data->loader = gth_load_file_data_task_new (loader_data->files, "*"); g_signal_connect (data->loader, "completed", G_CALLBACK (loader_completed_cb), loader_data); gth_browser_exec_task (data->browser, data->loader, FALSE); _g_object_list_unref (file_data_list); _gtk_tree_path_list_free (items); return FALSE; }
static void update_scripts_menu (BrowserData *data) { GthMenuManager *menu_manager; GList *script_list; GList *scan; menu_manager = gth_browser_get_menu_manager (data->browser, GTH_BROWSER_MENU_MANAGER_TOOLS3); if (data->menu_merge_id != 0) gth_menu_manager_remove_entries (menu_manager, data->menu_merge_id); data->menu_merge_id = gth_menu_manager_new_merge_id (menu_manager); script_list = gth_script_file_get_scripts (gth_script_file_get ()); for (scan = script_list; scan; scan = scan->next) { GthScript *script = scan->data; char *detailed_action; if (! gth_script_is_visible (script)) continue; detailed_action = g_strdup_printf ("win.exec-script('%s')", gth_script_get_id (script)); gth_menu_manager_append_entry (menu_manager, data->menu_merge_id, gth_script_get_display_name (script), detailed_action, NULL, NULL); g_free (detailed_action); } list_tools__gth_browser_update_sensitivity_cb (data->browser); _g_object_list_unref (script_list); }
static void edit_metadata_dialog__response_cb (GtkDialog *dialog, int response, gpointer user_data) { DialogData *data = user_data; GthMonitor *monitor; GHashTable *parents; GList *scan; GthTask *task; if ((response != GTK_RESPONSE_OK) && (response != GTK_RESPONSE_APPLY)) { cancel_file_list_loading (data); close_dialog (data); return; } if (data->file_list == NULL) return; data->close_dialog = (response == GTK_RESPONSE_OK); /* get the parents list */ parents = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, NULL); for (scan = data->file_list; scan; scan = scan->next) { GthFileData *file_data = scan->data; GFile *parent; parent = g_file_get_parent (file_data->file); if (G_LIKELY (parent != NULL)) { if (g_hash_table_lookup (parents, parent) == NULL) g_hash_table_insert (parents, g_object_ref (parent), GINT_TO_POINTER (1)); g_object_unref (parent); } } _g_object_list_unref (data->parents); data->parents = g_hash_table_get_keys (parents); g_list_foreach (data->parents, (GFunc) g_object_ref, NULL); g_hash_table_unref (parents); /* ignore changes to all the parents */ monitor = gth_main_get_default_monitor (); for (scan = data->parents; scan; scan = scan->next) gth_monitor_pause (monitor, (GFile *) scan->data); gth_edit_metadata_dialog_update_info (GTH_EDIT_METADATA_DIALOG (data->dialog), data->file_list); dialog_data_ref (data); task = gth_save_file_data_task_new (data->file_list, "*"); g_signal_connect (task, "completed", G_CALLBACK (saver_completed_cb), data); gth_browser_exec_task (data->browser, task, FALSE); g_object_unref (task); }
static void browser_data_free (BrowserData *data) { _g_object_list_unref (data->pixbuf_saver); g_object_unref (data->builder); g_free (data); }
static void list_albums_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { DialogData *data = user_data; PicasaWebService *picasaweb = PICASA_WEB_SERVICE (source_object); GError *error = NULL; _g_object_list_unref (data->albums); data->albums = picasa_web_service_list_albums_finish (picasaweb, result, &error); if (error != NULL) { gth_task_dialog (GTH_TASK (data->service), TRUE, NULL); _gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Could not get the album list"), error); g_clear_error (&error); gtk_dialog_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_DELETE_EVENT); return; } update_album_list (data); gth_task_dialog (GTH_TASK (data->service), TRUE, NULL); gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (data->browser)); gtk_window_set_modal (GTK_WINDOW (data->dialog), FALSE); gtk_window_present (GTK_WINDOW (data->dialog)); }
static void remove_catalog (GtkWindow *window, GthFileData *file_data) { GFile *gio_file; GError *error = NULL; gio_file = gth_main_get_gio_file (file_data->file); if (g_file_delete (gio_file, NULL, &error)) { GFile *parent; GList *files; parent = g_file_get_parent (file_data->file); files = g_list_prepend (NULL, g_object_ref (file_data->file)); gth_monitor_folder_changed (gth_main_get_default_monitor (), parent, files, GTH_MONITOR_EVENT_DELETED); _g_object_list_unref (files); _g_object_unref (parent); } else { _gtk_error_dialog_from_gerror_show (window, _("Could not remove the catalog"), error); g_clear_error (&error); } g_object_unref (gio_file); }
void gth_browser_activate_go_to_container_from_catalog (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); GList *items; GList *file_list = NULL; items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser))); file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items); if (file_list != NULL) { GthFileData *first_file = file_list->data; GFile *parent; parent = g_file_get_parent (first_file->file); gth_browser_go_to (browser, parent, first_file->file); g_object_unref (parent); } _g_object_list_unref (file_list); _gtk_tree_path_list_free (items); }
static void process_current_file (GthPixbufListTask *self) { GthFileData *file_data; GList *singleton; if (self->priv->current == NULL) { gth_task_completed (GTH_TASK (self), NULL); return; } _g_object_unref (self->priv->original_pixbuf); self->priv->original_pixbuf = NULL; _g_object_unref (self->priv->new_pixbuf); self->priv->new_pixbuf = NULL; gth_task_progress (GTH_TASK (self), NULL, NULL, FALSE, ((double) self->priv->n_current + 1) / (self->priv->n_files + 1)); file_data = self->priv->current->data; singleton = g_list_append (NULL, g_object_ref (file_data->file)); _g_query_all_metadata_async (singleton, FALSE, TRUE, "*", gth_task_get_cancellable (GTH_TASK (self)), file_info_ready_cb, self); _g_object_list_unref (singleton); }
static void _gth_browser_update_entry_point_list (GthBrowser *browser) { BrowserData *data; GList *entry_points; GList *scan; data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY); g_return_if_fail (data != NULL); g_menu_remove_all (data->entry_points_menu); entry_points = gth_main_get_all_entry_points (); for (scan = entry_points; scan; scan = scan->next) { GthFileData *file_data = scan->data; GMenuItem *item; char *uri; item = _g_menu_item_new_for_file (file_data->file, NULL); uri = g_file_get_uri (file_data->file); g_menu_item_set_action_and_target (item, "win.go-to-location", "s", uri); g_menu_append_item (data->entry_points_menu, item); g_free (uri); g_object_unref (item); } _g_object_list_unref (entry_points); }
GObject * gth_search_real_duplicate (GthDuplicable *duplicable) { GthSearch *search = GTH_SEARCH (duplicable); GthSearch *new_search; GList *file_list; GList *new_file_list = NULL; GList *scan; new_search = gth_search_new (); gth_search_set_folder (new_search, gth_search_get_folder (search)); gth_search_set_recursive (new_search, gth_search_is_recursive (search)); if (search->priv->test != NULL) new_search->priv->test = (GthTestChain*) gth_duplicable_duplicate (GTH_DUPLICABLE (search->priv->test)); file_list = gth_catalog_get_file_list (GTH_CATALOG (search)); for (scan = file_list; scan; scan = scan->next) { GFile *file = scan->data; new_file_list = g_list_prepend (new_file_list, g_file_dup (file)); } gth_catalog_set_file_list (GTH_CATALOG (new_search), new_file_list); _g_object_list_unref (new_file_list); return (GObject *) new_search; }
static void add_data_free (AddData *add_data) { _g_object_unref (add_data->catalog); _g_object_list_unref (add_data->files); _g_object_unref (add_data->catalog_file); g_free (add_data); }
void gth_browser_activate_action_edit_add_to_catalog (GtkAction *action, GthBrowser *browser) { GList *items; GList *file_list = NULL; GList *files; items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser))); file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items); files = gth_file_data_list_to_file_list (file_list); dlg_add_to_catalog (browser, files); _g_object_list_unref (files); _g_object_list_unref (file_list); _gtk_tree_path_list_free (items); }
void rs__gth_browser_file_list_rename_cb (GthBrowser *browser) { GList *items; GList *file_data_list; GList *file_list; items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser))); file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items); file_list = gth_file_data_list_to_file_list (file_data_list); if (file_list != NULL) dlg_rename_series (browser, file_list); _g_object_list_unref (file_list); _g_object_list_unref (file_data_list); _gtk_tree_path_list_free (items); }
static void destroy_dialog (DialogData *data) { if (data->dialog != NULL) gtk_widget_destroy (data->dialog); gth_task_completed (GTH_TASK (data->service), NULL); _g_object_unref (data->cancellable); _g_object_unref (data->album); _g_object_unref (data->service); _g_object_list_unref (data->albums); gtk_widget_destroy (data->progress_dialog); _g_object_unref (data->builder); _g_object_list_unref (data->file_list); _g_object_unref (data->location); g_object_unref (data->settings); g_free (data); }
static void paste_data_free (PasteData *paste_data) { _g_object_list_unref (paste_data->files); _g_object_unref (paste_data->file_source); g_object_unref (paste_data->destination); g_object_unref (paste_data->browser); g_free (paste_data); }
void gth_browser_add_to_catalog (GthBrowser *browser, GFile *catalog) { GList *items; GList *file_list; GList *files; items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser))); file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items); files = gth_file_data_list_to_file_list (file_list); if (files != NULL) add_to_catalog (browser, catalog, files); _g_object_list_unref (files); _g_object_list_unref (file_list); _gtk_tree_path_list_free (items); }
static void copy_selected_files_to_folder (GthBrowser *browser, gboolean move) { GList *items; GList *file_list; GList *files; items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser))); file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items); files = gth_file_data_list_to_file_list (file_list); copy_to_folder_dialog (browser, files, move); _g_object_list_unref (files); _g_object_list_unref (file_list); _gtk_tree_path_list_free (items); }
static void dialog_destroy_cb (GtkWidget *widget, DialogData *data) { _g_object_list_unref (data->file_list); g_object_unref (data->settings); g_object_unref (data->builder); g_free (data); }
static void list_photos_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { DialogData *data = user_data; GError *error = NULL; GList *list; GList *scan; gth_task_dialog (GTH_TASK (data->service), TRUE, NULL); _g_object_list_unref (data->photos); data->photos = flickr_service_list_photos_finish (data->service, result, &error); if (error != NULL) { if (data->service != NULL) gth_task_dialog (GTH_TASK (data->service), TRUE, NULL); _gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Could not get the photo list"), error); g_clear_error (&error); gtk_widget_destroy (data->dialog); return; } list = NULL; for (scan = data->photos; scan; scan = scan->next) { FlickrPhoto *photo = scan->data; GthFileData *file_data; if (photo->url[FLICKR_URL_O] == NULL) continue; file_data = gth_file_data_new_for_uri (photo->url[FLICKR_URL_O], (photo->mime_type != NULL) ? photo->mime_type : "image/jpeg"); g_file_info_set_file_type (file_data->info, G_FILE_TYPE_REGULAR); g_file_info_set_size (file_data->info, FAKE_SIZE); /* set a fake size to make the progress dialog work correctly */ g_file_info_set_attribute_object (file_data->info, "flickr::object", G_OBJECT (photo)); list = g_list_prepend (list, file_data); } gth_file_list_set_files (GTH_FILE_LIST (data->file_list), list); update_selection_status (data); gtk_widget_set_sensitive (GET_WIDGET ("download_button"), list != NULL); _g_object_list_unref (list); }
static void post_photos_data_free (PostPhotosData *post_photos) { if (post_photos == NULL) return; _g_object_unref (post_photos->cancellable); _g_object_list_unref (post_photos->file_list); g_object_unref (post_photos->album); g_free (post_photos); }
static void destroy_cb (GtkWidget *widget, DialogData *data) { gth_browser_set_dialog (data->browser, "image_wall", NULL); _g_object_list_unref (data->file_list); g_object_unref (data->settings); g_object_unref (data->builder); g_free (data); }