[gthumb/ext] make the type list in the "save image" dialog dynamic



commit ad4ebcea06d56a8440d45f56f4fae5c8ee8bdaf6
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun Oct 11 22:57:51 2009 +0200

    make the type list in the "save image" dialog dynamic

 extensions/image_viewer/gth-image-viewer-page.c |   80 ++++++++++++++--------
 extensions/pixbuf_savers/gth-jpeg-saver.c       |    2 +
 extensions/pixbuf_savers/gth-png-saver.c        |    2 +
 extensions/pixbuf_savers/gth-tga-saver.c        |    8 +-
 extensions/pixbuf_savers/gth-tiff-saver.c       |    2 +
 gthumb/gth-pixbuf-saver.c                       |   14 ++++
 gthumb/gth-pixbuf-saver.h                       |    4 +
 7 files changed, 79 insertions(+), 33 deletions(-)
---
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 06f5f98..d94f4e3 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -792,17 +792,14 @@ typedef struct {
 } SaveAsData;
 
 
-static struct {
+typedef struct {
 	const char *type;
 	const char *extensions;
 	const char *default_ext;
-}
-supported_formats[] = {
-	{ "image/jpeg", "jpeg jpg jpe", "jpeg" },
-	{ "image/png", "png", "png" },
-	{ "image/tiff", "tiff tif", "tiff" },
-	{ NULL, NULL }
-};
+} Format;
+
+
+static GList *supported_formats = NULL;
 
 
 static void
@@ -819,9 +816,10 @@ save_as_response_cb (GtkDialog  *file_sel,
 		     int         response,
 		     SaveAsData *data)
 {
-	char  *filename;
-	int    format;
-	GFile *file;
+	char   *filename;
+	int     n_format;
+	Format *format;
+	GFile  *file;
 
 	if (response != GTK_RESPONSE_ACCEPT) {
 		if (data->func != NULL) {
@@ -835,17 +833,18 @@ save_as_response_cb (GtkDialog  *file_sel,
 	}
 
 	filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_sel));
-	format = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (data->format_chooser), filename);
+	n_format = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (data->format_chooser), filename);
 	g_free (filename);
 
-	if ((format < 1) || (format > G_N_ELEMENTS (supported_formats)))
+	if ((n_format < 1) || (n_format > g_list_length (supported_formats)))
 		return;
 
+	format = g_list_nth_data (supported_formats, n_format - 1);
 	file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (file_sel));
 	gth_file_data_set_file (data->file_data, file);
 	_gth_image_viewer_page_real_save ((GthViewerPage *) data->self,
 					  file,
-					  supported_formats[format - 1].type,
+					  format->type,
 					  data->func,
 					  data->user_data);
 	gtk_widget_destroy (GTK_WIDGET (data->file_sel));
@@ -858,23 +857,25 @@ static void
 format_chooser_selection_changed_cb (EggFileFormatChooser *self,
 				     SaveAsData           *data)
 {
-	char *filename;
-	int   format;
-	char *basename;
-	char *basename_noext;
-	char *new_basename;
+	char   *filename;
+	int     n_format;
+	Format *format;
+	char   *basename;
+	char   *basename_noext;
+	char   *new_basename;
 
 	filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (data->file_sel));
-	format = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (data->format_chooser), filename);
+	n_format = egg_file_format_chooser_get_format (EGG_FILE_FORMAT_CHOOSER (data->format_chooser), filename);
 
-	if ((format < 1) || (format > G_N_ELEMENTS (supported_formats))) {
+	if ((n_format < 1) || (n_format > g_list_length (supported_formats))) {
 		g_free (filename);
 		return;
 	}
 
+	format = g_list_nth_data (supported_formats, n_format - 1);
 	basename = g_path_get_basename (filename);
 	basename_noext = _g_uri_remove_extension (basename);
-	new_basename = g_strconcat (basename_noext, ".", supported_formats[format - 1].default_ext, NULL);
+	new_basename = g_strconcat (basename_noext, ".", format->default_ext, NULL);
 	gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (data->file_sel), new_basename);
 
 	g_free (new_basename);
@@ -917,7 +918,7 @@ gth_image_viewer_page_real_save_as (GthViewerPage *base,
 	char                 *uri;
 	EggFileFormatChooser *format_chooser;
 	SaveAsData           *data;
-	int                   i;
+	GList                *scan;
 
 	self = GTH_IMAGE_VIEWER_PAGE (base);
 	file_sel = gtk_file_chooser_dialog_new (_("Save Image"),
@@ -934,16 +935,37 @@ gth_image_viewer_page_real_save_as (GthViewerPage *base,
 
 	/**/
 
+	if (supported_formats == NULL) {
+		GArray *savers;
+		int     i;
+
+		savers = gth_main_get_type_set ("pixbuf-saver");
+		for (i = 0; (savers != NULL) && (i < savers->len); i++) {
+			GthPixbufSaver *pixbuf_saver;
+			Format         *format;
+
+			pixbuf_saver = g_object_new (g_array_index (savers, GType, i), NULL);
+			format = g_new (Format, 1);
+			format->type = g_strdup (gth_pixbuf_saver_get_mime_type (pixbuf_saver));
+			format->extensions = g_strdup (gth_pixbuf_saver_get_default_ext (pixbuf_saver));
+			format->default_ext = g_strdup (gth_pixbuf_saver_get_default_ext (pixbuf_saver));
+			supported_formats = g_list_prepend (supported_formats, format);
+
+			g_object_unref (pixbuf_saver);
+		}
+	}
+
 	format_chooser = (EggFileFormatChooser *) egg_file_format_chooser_new ();
-	for (i = 0; supported_formats[i].type != NULL; i++) {
-		char  *icon_name;
-		char **extensions;
+	for (scan = supported_formats; scan != NULL; scan = scan->next) {
+		Format  *format = scan->data;
+		char    *icon_name;
+		char   **extensions;
 
-		icon_name = get_icon_name_for_type (supported_formats[i].type);
-		extensions = g_strsplit (supported_formats[i].extensions, " ", -1);
+		icon_name = get_icon_name_for_type (format->type);
+		extensions = g_strsplit (format->extensions, " ", -1);
 		egg_file_format_chooser_add_format (format_chooser,
 						    0,
-						    g_content_type_get_description (supported_formats[i].type),
+						    g_content_type_get_description (format->type),
 						    icon_name,
 						    extensions[0],
 						    extensions[1],
diff --git a/extensions/pixbuf_savers/gth-jpeg-saver.c b/extensions/pixbuf_savers/gth-jpeg-saver.c
index 3ccef70..3f48358 100644
--- a/extensions/pixbuf_savers/gth-jpeg-saver.c
+++ b/extensions/pixbuf_savers/gth-jpeg-saver.c
@@ -477,6 +477,8 @@ gth_jpeg_saver_class_init (GthJpegSaverClass *klass)
 	pixbuf_saver_class = GTH_PIXBUF_SAVER_CLASS (klass);
 	pixbuf_saver_class->id = "jpeg";
 	pixbuf_saver_class->display_name = _("JPEG");
+	pixbuf_saver_class->mime_type = "image/jpeg";
+	pixbuf_saver_class->default_ext = "jpeg";
 	pixbuf_saver_class->get_control = gth_jpeg_saver_get_control;
 	pixbuf_saver_class->save_options = gth_jpeg_saver_save_options;
 	pixbuf_saver_class->can_save = gth_jpeg_saver_can_save;
diff --git a/extensions/pixbuf_savers/gth-png-saver.c b/extensions/pixbuf_savers/gth-png-saver.c
index ce6996c..13094f4 100644
--- a/extensions/pixbuf_savers/gth-png-saver.c
+++ b/extensions/pixbuf_savers/gth-png-saver.c
@@ -144,6 +144,8 @@ gth_png_saver_class_init (GthPngSaverClass *klass)
 	pixbuf_saver_class = GTH_PIXBUF_SAVER_CLASS (klass);
 	pixbuf_saver_class->id = "png";
 	pixbuf_saver_class->display_name = _("PNG");
+	pixbuf_saver_class->mime_type = "image/png";
+	pixbuf_saver_class->default_ext = "png";
 	pixbuf_saver_class->get_control = gth_png_saver_get_control;
 	pixbuf_saver_class->save_options = gth_png_saver_save_options;
 	pixbuf_saver_class->can_save = gth_png_saver_can_save;
diff --git a/extensions/pixbuf_savers/gth-tga-saver.c b/extensions/pixbuf_savers/gth-tga-saver.c
index 7fdc941..7d6d6e7 100644
--- a/extensions/pixbuf_savers/gth-tga-saver.c
+++ b/extensions/pixbuf_savers/gth-tga-saver.c
@@ -332,7 +332,6 @@ gth_tga_saver_save_pixbuf (GthPixbufSaver  *self,
 	char     **option_keys;
 	char     **option_values;
 	int        i = -1;
-	int        i_value;
 	gboolean   result;
 
 	pixbuf_type = get_pixbuf_type_from_mime_type (mime_type);
@@ -341,9 +340,8 @@ gth_tga_saver_save_pixbuf (GthPixbufSaver  *self,
 	option_values = g_malloc (sizeof (char *) * 2);
 
 	i++;
-	i_value = eel_gconf_get_integer (PREF_PNG_COMPRESSION_LEVEL, 6);
-	option_keys[i] = g_strdup ("compression");;
-	option_values[i] = g_strdup_printf ("%d", i_value);
+	option_keys[i] = g_strdup ("compression");
+	option_values[i] = g_strdup (eel_gconf_get_boolean (PREF_TGA_RLE_COMPRESSION, TRUE) ? "rle" : "none");
 
 	i++;
 	option_keys[i] = NULL;
@@ -379,6 +377,8 @@ gth_tga_saver_class_init (GthTgaSaverClass *klass)
 	pixbuf_saver_class = GTH_PIXBUF_SAVER_CLASS (klass);
 	pixbuf_saver_class->id = "tga";
 	pixbuf_saver_class->display_name = _("TGA");
+	pixbuf_saver_class->mime_type = "image/x-tga";
+	pixbuf_saver_class->default_ext = "tga";
 	pixbuf_saver_class->get_control = gth_tga_saver_get_control;
 	pixbuf_saver_class->save_options = gth_tga_saver_save_options;
 	pixbuf_saver_class->can_save = gth_tga_saver_can_save;
diff --git a/extensions/pixbuf_savers/gth-tiff-saver.c b/extensions/pixbuf_savers/gth-tiff-saver.c
index 933c96c..f6266fd 100644
--- a/extensions/pixbuf_savers/gth-tiff-saver.c
+++ b/extensions/pixbuf_savers/gth-tiff-saver.c
@@ -520,6 +520,8 @@ gth_tiff_saver_class_init (GthTiffSaverClass *klass)
 	pixbuf_saver_class = GTH_PIXBUF_SAVER_CLASS (klass);
 	pixbuf_saver_class->id = "tiff";
 	pixbuf_saver_class->display_name = _("TIFF");
+	pixbuf_saver_class->mime_type = "image/tiff";
+	pixbuf_saver_class->default_ext = "tiff";
 	pixbuf_saver_class->get_control = gth_tiff_saver_get_control;
 	pixbuf_saver_class->save_options = gth_tiff_saver_save_options;
 	pixbuf_saver_class->can_save = gth_tiff_saver_can_save;
diff --git a/gthumb/gth-pixbuf-saver.c b/gthumb/gth-pixbuf-saver.c
index deac3ab..b2ac165 100644
--- a/gthumb/gth-pixbuf-saver.c
+++ b/gthumb/gth-pixbuf-saver.c
@@ -119,6 +119,20 @@ gth_pixbuf_saver_get_display_name (GthPixbufSaver *self)
 }
 
 
+const char *
+gth_pixbuf_saver_get_mime_type (GthPixbufSaver *self)
+{
+	return GTH_PIXBUF_SAVER_GET_CLASS (self)->mime_type;
+}
+
+
+const char *
+gth_pixbuf_saver_get_default_ext (GthPixbufSaver *self)
+{
+	return GTH_PIXBUF_SAVER_GET_CLASS (self)->default_ext;
+}
+
+
 GtkWidget *
 gth_pixbuf_saver_get_control (GthPixbufSaver *self)
 {
diff --git a/gthumb/gth-pixbuf-saver.h b/gthumb/gth-pixbuf-saver.h
index d64c569..23d32b1 100644
--- a/gthumb/gth-pixbuf-saver.h
+++ b/gthumb/gth-pixbuf-saver.h
@@ -52,6 +52,8 @@ struct _GthPixbufSaverClass
 
 	const char *id;
 	const char *display_name;
+	const char *mime_type;
+	const char *default_ext;
 
 	/*< virtual functions >*/
 
@@ -70,6 +72,8 @@ struct _GthPixbufSaverClass
 GType         gth_pixbuf_saver_get_type          (void);
 const char *  gth_pixbuf_saver_get_id            (GthPixbufSaver  *self);
 const char *  gth_pixbuf_saver_get_display_name  (GthPixbufSaver  *self);
+const char *  gth_pixbuf_saver_get_mime_type     (GthPixbufSaver  *self);
+const char *  gth_pixbuf_saver_get_default_ext   (GthPixbufSaver  *self);
 GtkWidget *   gth_pixbuf_saver_get_control       (GthPixbufSaver  *self);
 void          gth_pixbuf_saver_save_options      (GthPixbufSaver  *self);
 gboolean      gth_pixbuf_saver_can_save          (GthPixbufSaver  *self,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]