]> git.sur5r.net Git - glabels/blobdiff - glabels2/src/object-editor-image-page.c
2005-04-03 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / object-editor-image-page.c
index 550f6f0caef92b9b701c70d22a14c5ec762d11af..e9704839364f22b54473654296b8cad2267487e4 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <gnome.h>
 #include <math.h>
+#include <gtk/gtkimage.h>
 
 #include "object-editor.h"
 #include "prefs.h"
 
 static void img_radio_toggled_cb                (glObjectEditor        *editor);
 
+static void update_preview_cb                   (GtkFileChooser *file_chooser,
+                                                gpointer        data);
+static void add_image_filters_to_chooser        (GtkFileChooser *file_chooser);
+
 
 \f
 /*--------------------------------------------------------------------------*/
@@ -57,8 +62,10 @@ static void img_radio_toggled_cb                (glObjectEditor        *editor);
 void
 gl_object_editor_prepare_image_page (glObjectEditor *editor)
 {
-       GdkColor     *gdk_color;
-       GtkSizeGroup *label_size_group;
+       GdkColor      *gdk_color;
+       GtkFileFilter *filter;
+       GtkWidget     *preview;
+
 
        gl_debug (DEBUG_EDITOR, "START");
 
@@ -69,24 +76,27 @@ gl_object_editor_prepare_image_page (glObjectEditor *editor)
                                                               "img_file_radio");
        editor->priv->img_key_radio    = glade_xml_get_widget (editor->priv->gui,
                                                               "img_key_radio");
-       editor->priv->img_pixmap_entry = glade_xml_get_widget (editor->priv->gui,
-                                                             "img_pixmap_entry");
+       editor->priv->img_file_button  = glade_xml_get_widget (editor->priv->gui,
+                                                              "img_file_button");
        editor->priv->img_key_combo    = glade_xml_get_widget (editor->priv->gui,
                                                               "img_key_combo");
        editor->priv->img_key_entry    = glade_xml_get_widget (editor->priv->gui,
                                                               "img_key_entry");
 
-       /* Align label widths */
-       label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-       gtk_size_group_add_widget (label_size_group, editor->priv->img_file_radio);
-       gtk_size_group_add_widget (label_size_group, editor->priv->img_key_radio);
+       /* Modify file button properties. */
+       add_image_filters_to_chooser (GTK_FILE_CHOOSER (editor->priv->img_file_button));
+       preview = gtk_image_new ();
+       gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (editor->priv->img_file_button), preview);
+       g_signal_connect (G_OBJECT (editor->priv->img_file_button),
+                         "update-preview",
+                         G_CALLBACK (update_preview_cb), preview);
 
        /* Un-hide */
        gtk_widget_show_all (editor->priv->img_page_vbox);
 
        /* Connect signals */
-       g_signal_connect_swapped (G_OBJECT (editor->priv->img_pixmap_entry),
-                                 "activate",
+       g_signal_connect_swapped (G_OBJECT (editor->priv->img_file_button),
+                                 "selection-changed",
                                  G_CALLBACK (gl_object_editor_changed_cb),
                                  G_OBJECT (editor));
        g_signal_connect_swapped (G_OBJECT (editor->priv->img_key_entry),
@@ -114,10 +124,10 @@ img_radio_toggled_cb (glObjectEditor *editor)
         gl_debug (DEBUG_WDGT, "START");
  
        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->img_file_radio))) {
-                gtk_widget_set_sensitive (editor->priv->img_pixmap_entry, TRUE);
+                gtk_widget_set_sensitive (editor->priv->img_file_button, TRUE);
                 gtk_widget_set_sensitive (editor->priv->img_key_combo, FALSE);
         } else {
-                gtk_widget_set_sensitive (editor->priv->img_pixmap_entry, FALSE);
+                gtk_widget_set_sensitive (editor->priv->img_file_button, FALSE);
                 gtk_widget_set_sensitive (editor->priv->img_key_combo, TRUE);
         }
  
@@ -139,7 +149,7 @@ gl_object_editor_set_image (glObjectEditor      *editor,
  
         gl_debug (DEBUG_EDITOR, "START");
  
-       g_signal_handlers_block_by_func (G_OBJECT (editor->priv->img_pixmap_entry),
+       g_signal_handlers_block_by_func (G_OBJECT (editor->priv->img_file_button),
                                         G_CALLBACK (gl_object_editor_changed_cb),
                                         editor);
        g_signal_handlers_block_by_func (G_OBJECT (editor->priv->img_key_entry),
@@ -152,22 +162,21 @@ gl_object_editor_set_image (glObjectEditor      *editor,
  
                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
                                               (editor->priv->img_file_radio), TRUE); 
-                gtk_widget_set_sensitive (editor->priv->img_pixmap_entry, TRUE);
+                gtk_widget_set_sensitive (editor->priv->img_file_button, TRUE);
                 gtk_widget_set_sensitive (editor->priv->img_key_combo, FALSE);
  
                 if (text_node->data != NULL ) {
-                        gnome_file_entry_set_filename (GNOME_FILE_ENTRY(editor->priv->img_pixmap_entry),
+                       gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(editor->priv->img_file_button),
                                                        text_node->data);
                 } else {
-                        gnome_file_entry_set_filename (GNOME_FILE_ENTRY(editor->priv->img_pixmap_entry),
-                                                       "");
+                       gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER(editor->priv->img_file_button));
                 }
         } else {
                                                                                 
                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
                                               (editor->priv->img_key_radio), TRUE);
                                                                                 
-                gtk_widget_set_sensitive (editor->priv->img_pixmap_entry, FALSE);
+                gtk_widget_set_sensitive (editor->priv->img_file_button, FALSE);
                 gtk_widget_set_sensitive (editor->priv->img_key_combo, TRUE);
                                                                                 
                 gtk_editable_delete_text (GTK_EDITABLE (editor->priv->img_key_entry), 0, -1);
@@ -178,7 +187,7 @@ gl_object_editor_set_image (glObjectEditor      *editor,
                                           &pos);
         }
                                                                                 
-       g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->img_pixmap_entry),
+       g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->img_file_button),
                                           G_CALLBACK (gl_object_editor_changed_cb),
                                           editor);
        g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->img_key_entry),
@@ -203,7 +212,7 @@ gl_object_editor_get_image (glObjectEditor      *editor)
         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->img_file_radio))) {
                 text_node->field_flag = FALSE;
                 text_node->data =
-                        gnome_pixmap_entry_get_filename (GNOME_PIXMAP_ENTRY(editor->priv->img_pixmap_entry));
+                       gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(editor->priv->img_file_button));
         } else {
                 text_node->field_flag = TRUE;
                 text_node->data =
@@ -219,3 +228,105 @@ gl_object_editor_get_image (glObjectEditor      *editor)
         return text_node;
 }
 
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Update preview image.                                          */
+/*--------------------------------------------------------------------------*/
+static void
+update_preview_cb (GtkFileChooser *file_chooser, gpointer data)
+{
+  GtkWidget *preview;
+  char *filename;
+  GdkPixbuf *pixbuf;
+  gboolean have_preview;
+
+  preview = GTK_WIDGET (data);
+  filename = gtk_file_chooser_get_preview_filename (file_chooser);
+
+  if (filename) {
+         pixbuf = gdk_pixbuf_new_from_file_at_size (filename, 128, 128, NULL);
+         have_preview = (pixbuf != NULL);
+         g_free (filename);
+
+         gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf);
+         if (pixbuf)
+                 gdk_pixbuf_unref (pixbuf);
+
+         gtk_file_chooser_set_preview_widget_active (file_chooser,
+                                                     have_preview);
+  } else {
+         gtk_file_chooser_set_preview_widget_active (file_chooser, FALSE);
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Add filters to file chooser.                                   */
+/*           Based on eog's eog_file_selection_add_filter().                */
+/*--------------------------------------------------------------------------*/
+static void
+add_image_filters_to_chooser (GtkFileChooser *chooser)
+{
+       GtkFileFilter *all_file_filter;
+       GtkFileFilter *all_img_filter;
+       GSList        *formats;
+       GSList        *it;
+       GtkFileFilter *filter;
+       GSList        *filters = NULL;
+       gchar        **mime_types, **pattern, *tmp;
+       int            i;
+
+       /* All Files Filter */
+       all_file_filter = gtk_file_filter_new ();
+       gtk_file_filter_set_name (all_file_filter, _("All Files"));
+       gtk_file_filter_add_pattern (all_file_filter, "*");
+
+       /* All Image Filter */
+       all_img_filter = gtk_file_filter_new ();
+       gtk_file_filter_set_name (all_img_filter, _("All Images"));
+
+       /* Individual image filters */
+       formats = gdk_pixbuf_get_formats ();
+       for (it = formats; it != NULL; it = it->next) {
+               char *filter_name;
+               GdkPixbufFormat *format;
+               filter = gtk_file_filter_new ();
+
+               format = (GdkPixbufFormat*) it->data;
+
+               /* Filter name: First description then file extension, eg. "The PNG-Format (*.png)".*/
+               filter_name = g_strdup_printf (_("%s (*.%s)"), 
+                                              gdk_pixbuf_format_get_description (format),
+                                              gdk_pixbuf_format_get_name (format));
+               gtk_file_filter_set_name (filter, filter_name);
+               g_free (filter_name);
+
+               mime_types = gdk_pixbuf_format_get_mime_types ((GdkPixbufFormat *) it->data);
+               for (i = 0; mime_types[i] != NULL; i++) {
+                       gtk_file_filter_add_mime_type (filter, mime_types[i]);
+                       gtk_file_filter_add_mime_type (all_img_filter, mime_types[i]);
+               }
+               g_strfreev (mime_types);
+               pattern = gdk_pixbuf_format_get_extensions ((GdkPixbufFormat *) it->data);
+               for (i = 0; pattern[i] != NULL; i++) {
+                       tmp = g_strconcat ("*.", pattern[i], NULL);
+                       gtk_file_filter_add_pattern (filter, tmp);
+                       gtk_file_filter_add_pattern (all_img_filter, tmp);
+                       g_free (tmp);
+               }
+               g_strfreev (pattern);
+
+               filters = g_slist_prepend (filters, filter);
+       }
+       g_slist_free (formats);
+
+       /* Add filter to filechooser */
+       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_file_filter);
+       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_img_filter);
+       gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), all_img_filter);
+
+       for (it = filters; it != NULL; it = it->next) {
+               gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser),
+                                            GTK_FILE_FILTER (it->data));
+       }
+       g_slist_free (filters);
+}