static gboolean gimp_thumb_box_auto_thumbnail (GimpThumbBox *box) { Gimp *gimp = box->context->gimp; GimpThumbnail *thumb = gimp_imagefile_get_thumbnail (box->imagefile); const gchar *uri = gimp_object_get_name (box->imagefile); box->idle_id = 0; if (thumb->image_state == GIMP_THUMB_STATE_NOT_FOUND) return FALSE; switch (thumb->thumb_state) { case GIMP_THUMB_STATE_NOT_FOUND: case GIMP_THUMB_STATE_OLD: if (thumb->image_filesize < gimp->config->thumbnail_filesize_limit && ! gimp_thumbnail_has_failed (thumb) && file_procedure_find_by_extension (gimp->plug_in_manager->load_procs, uri)) { if (thumb->image_filesize > 0) { gchar *size; gchar *text; size = g_format_size (thumb->image_filesize); text = g_strdup_printf ("%s\n%s", size, _("Creating preview...")); gtk_label_set_text (GTK_LABEL (box->info), text); g_free (text); g_free (size); } else { gtk_label_set_text (GTK_LABEL (box->info), _("Creating preview...")); } gimp_imagefile_create_thumbnail_weak (box->imagefile, box->context, GIMP_PROGRESS (box), gimp->config->thumbnail_size, TRUE); } break; default: break; } return FALSE; }
static GdkPixbuf * gimp_view_renderer_imagefile_get_icon (GimpImagefile *imagefile, GtkWidget *widget, gint size) { GdkScreen *screen = gtk_widget_get_screen (widget); GtkIconTheme *icon_theme = gtk_icon_theme_get_for_screen (screen); GimpThumbnail *thumbnail = gimp_imagefile_get_thumbnail (imagefile); GdkPixbuf *pixbuf = NULL; if (! gimp_object_get_name (imagefile)) return NULL; if (! pixbuf) { GIcon *icon = gimp_imagefile_get_gicon (imagefile); if (icon) { GtkIconInfo *info; info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon, size, 0); if (info) { pixbuf = gtk_icon_info_load_icon (info, NULL); gtk_icon_info_free (info); } } } if (! pixbuf && thumbnail->image_mimetype) { pixbuf = get_icon_for_mime_type (thumbnail->image_mimetype, size); } if (! pixbuf) { const gchar *icon_name = "text-x-generic"; if (thumbnail->image_state == GIMP_THUMB_STATE_FOLDER) icon_name = "folder"; pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name, size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); } return pixbuf; }
static void documents_remove_dangling_foreach (GimpImagefile *imagefile, GimpContainer *container) { GimpThumbnail *thumbnail = gimp_imagefile_get_thumbnail (imagefile); if (gimp_thumbnail_peek_image (thumbnail) == GIMP_THUMB_STATE_NOT_FOUND) { const gchar *uri = gimp_object_get_name (imagefile); gtk_recent_manager_remove_item (gtk_recent_manager_get_default (), uri, NULL); gimp_container_remove (container, GIMP_OBJECT (imagefile)); } }
static void gimp_thumb_box_create_thumbnail (GimpThumbBox *box, const gchar *uri, GimpThumbnailSize size, gboolean force, GimpProgress *progress) { gchar *filename = file_utils_filename_from_uri (uri); GimpThumbnail *thumb; gchar *basename; if (filename) { gboolean regular = g_file_test (filename, G_FILE_TEST_IS_REGULAR); g_free (filename); if (! regular) return; } thumb = gimp_imagefile_get_thumbnail (box->imagefile); basename = file_utils_uri_display_basename (uri); gtk_label_set_text (GTK_LABEL (box->filename), basename); g_free (basename); gimp_object_set_name (GIMP_OBJECT (box->imagefile), uri); if (force || (gimp_thumbnail_peek_thumb (thumb, size) < GIMP_THUMB_STATE_FAILED && ! gimp_thumbnail_has_failed (thumb))) { GError *error = NULL; if (! gimp_imagefile_create_thumbnail (box->imagefile, box->context, progress, size, ! force, &error)) { gimp_message_literal (box->context->gimp, G_OBJECT (progress), GIMP_MESSAGE_ERROR, error->message); g_clear_error (&error); } } }
static GdkPixbuf * gimp_view_renderer_imagefile_get_icon (GimpImagefile *imagefile, GtkWidget *widget, gint size) { GdkScreen *screen = gtk_widget_get_screen (widget); GtkIconTheme *icon_theme = gtk_icon_theme_get_for_screen (screen); GimpThumbnail *thumbnail = gimp_imagefile_get_thumbnail (imagefile); GdkPixbuf *pixbuf = NULL; if (! gimp_object_get_name (imagefile)) return NULL; if (! pixbuf) { GFile *file; GFileInfo *file_info; file = g_file_new_for_uri (gimp_object_get_name (imagefile)); file_info = g_file_query_info (file, "standard::icon", 0, NULL, NULL); if (file_info) { GIcon *icon = g_file_info_get_icon (file_info); if (icon) { GtkIconInfo *info; info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon, size, 0); if (info) pixbuf = gtk_icon_info_load_icon (info, NULL); } else { #ifdef GIMP_UNSTABLE g_printerr ("no icon for: %s\n", gimp_object_get_name (imagefile)); #endif } g_object_unref (file_info); } g_object_unref (file); } if (! pixbuf && thumbnail->image_mimetype) { pixbuf = get_icon_for_mime_type (thumbnail->image_mimetype, size); } if (! pixbuf) { const gchar *icon_name = GTK_STOCK_FILE; if (thumbnail->image_state == GIMP_THUMB_STATE_FOLDER) icon_name = GTK_STOCK_DIRECTORY; pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name, size, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); } return pixbuf; }
GtkWidget * gimp_thumb_box_new (GimpContext *context) { GimpThumbBox *box; GtkWidget *vbox; GtkWidget *vbox2; GtkWidget *ebox; GtkWidget *hbox; GtkWidget *button; GtkWidget *label; gchar *str; gint h, v; GtkRequisition info_requisition; GtkRequisition progress_requisition; g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL); box = g_object_new (GIMP_TYPE_THUMB_BOX, NULL); box->context = context; ebox = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (box), ebox); gtk_widget_show (ebox); g_signal_connect (ebox, "button-press-event", G_CALLBACK (gimp_thumb_box_ebox_button_press), box); str = g_strdup_printf (_("Click to update preview\n" "%s-Click to force update even " "if preview is up-to-date"), gimp_get_mod_string (gimp_get_toggle_behavior_mask ())); gimp_help_set_help_data (ebox, str, NULL); g_free (str); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (ebox), vbox); gtk_widget_show (vbox); button = gtk_button_new (); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_widget_show (button); label = gtk_label_new_with_mnemonic (_("Pr_eview")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_container_add (GTK_CONTAINER (button), label); gtk_widget_show (label); g_signal_connect (button, "button-press-event", G_CALLBACK (gtk_true), NULL); g_signal_connect (button, "button-release-event", G_CALLBACK (gtk_true), NULL); g_signal_connect (button, "enter-notify-event", G_CALLBACK (gtk_true), NULL); g_signal_connect (button, "leave-notify-event", G_CALLBACK (gtk_true), NULL); vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_container_set_border_width (GTK_CONTAINER (vbox2), 2); gtk_box_pack_start (GTK_BOX (vbox), vbox2, TRUE, TRUE, 0); gtk_widget_show (vbox2); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); box->imagefile = gimp_imagefile_new (context->gimp, NULL); g_signal_connect (box->imagefile, "info-changed", G_CALLBACK (gimp_thumb_box_imagefile_info_changed), box); g_signal_connect (gimp_imagefile_get_thumbnail (box->imagefile), "notify::thumb-state", G_CALLBACK (gimp_thumb_box_thumb_state_notify), box); gimp_view_renderer_get_frame_size (&h, &v); box->preview = gimp_view_new (context, GIMP_VIEWABLE (box->imagefile), /* add padding for the shadow frame */ context->gimp->config->thumbnail_size + MAX (h, v), 0, FALSE); gtk_box_pack_start (GTK_BOX (hbox), box->preview, TRUE, FALSE, 2); gtk_widget_show (box->preview); gtk_label_set_mnemonic_widget (GTK_LABEL (label), box->preview); g_signal_connect (box->preview, "clicked", G_CALLBACK (gimp_thumb_box_thumbnail_clicked), box); box->filename = gtk_label_new (_("No selection")); gtk_label_set_ellipsize (GTK_LABEL (box->filename), PANGO_ELLIPSIZE_MIDDLE); gtk_label_set_justify (GTK_LABEL (box->filename), GTK_JUSTIFY_CENTER); gimp_label_set_attributes (GTK_LABEL (box->filename), PANGO_ATTR_STYLE, PANGO_STYLE_OBLIQUE, -1); gtk_box_pack_start (GTK_BOX (vbox2), box->filename, FALSE, FALSE, 0); gtk_widget_show (box->filename); box->info = gtk_label_new (" \n \n \n "); gtk_misc_set_alignment (GTK_MISC (box->info), 0.5, 0.0); gtk_label_set_justify (GTK_LABEL (box->info), GTK_JUSTIFY_CENTER); gtk_label_set_line_wrap (GTK_LABEL (box->info), TRUE); gimp_label_set_attributes (GTK_LABEL (box->info), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1); gtk_box_pack_start (GTK_BOX (vbox2), box->info, FALSE, FALSE, 0); gtk_widget_show (box->info); box->progress = gtk_progress_bar_new (); gtk_progress_bar_set_text (GTK_PROGRESS_BAR (box->progress), "Fog"); gtk_box_pack_end (GTK_BOX (vbox2), box->progress, FALSE, FALSE, 0); gtk_widget_set_no_show_all (box->progress, TRUE); /* don't gtk_widget_show (box->progress); */ /* eek */ gtk_widget_size_request (box->info, &info_requisition); gtk_widget_size_request (box->progress, &progress_requisition); gtk_widget_set_size_request (box->info, -1, info_requisition.height); gtk_widget_set_size_request (box->filename, progress_requisition.width, -1); gtk_widget_set_size_request (box->progress, -1, progress_requisition.height); gtk_progress_bar_set_text (GTK_PROGRESS_BAR (box->progress), ""); return GTK_WIDGET (box); }