2 * object-editor-image-page.c
3 * Copyright (C) 2003-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
7 * gLabels is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * gLabels is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with gLabels. If not, see <http://www.gnu.org/licenses/>.
23 #include "object-editor.h"
25 #include <glib/gi18n.h>
30 #include "field-button.h"
31 #include "builder-util.h"
33 #include "object-editor-private.h"
38 /*===========================================*/
40 /*===========================================*/
43 /*===========================================*/
44 /* Private data types */
45 /*===========================================*/
48 /*===========================================*/
50 /*===========================================*/
53 /*===========================================*/
54 /* Local function prototypes */
55 /*===========================================*/
57 static void img_radio_toggled_cb (glObjectEditor *editor);
59 static void update_preview_cb (GtkFileChooser *file_chooser,
61 static void add_image_filters_to_chooser (GtkFileChooser *file_chooser);
63 static void img_selection_changed_cb (glObjectEditor *editor);
66 /*--------------------------------------------------------------------------*/
67 /* PRIVATE. Prepare image page. */
68 /*--------------------------------------------------------------------------*/
70 gl_object_editor_prepare_image_page (glObjectEditor *editor)
75 gl_debug (DEBUG_EDITOR, "START");
77 /* Extract widgets from XML tree. */
78 gl_builder_util_get_widgets (editor->priv->builder,
79 "img_page_vbox", &editor->priv->img_page_vbox,
80 "img_file_radio", &editor->priv->img_file_radio,
81 "img_key_radio", &editor->priv->img_key_radio,
82 "img_file_button", &editor->priv->img_file_button,
83 "img_key_hbox", &editor->priv->img_key_hbox,
86 editor->priv->img_key_combo = gl_field_button_new (NULL);
87 gtk_box_pack_start (GTK_BOX (editor->priv->img_key_hbox),
88 editor->priv->img_key_combo,
92 /* Modify file button properties. */
93 add_image_filters_to_chooser (GTK_FILE_CHOOSER (editor->priv->img_file_button));
94 preview = gtk_image_new ();
95 gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (editor->priv->img_file_button), preview);
96 g_signal_connect (G_OBJECT (editor->priv->img_file_button),
98 G_CALLBACK (update_preview_cb), preview);
101 gtk_widget_show_all (editor->priv->img_page_vbox);
103 /* Connect signals */
104 g_signal_connect_swapped (G_OBJECT (editor->priv->img_file_button),
106 G_CALLBACK (img_selection_changed_cb),
108 g_signal_connect_swapped (G_OBJECT (editor->priv->img_key_combo),
110 G_CALLBACK (gl_object_editor_changed_cb),
112 g_signal_connect_swapped (G_OBJECT (editor->priv->img_file_radio),
114 G_CALLBACK (img_radio_toggled_cb),
116 g_signal_connect_swapped (G_OBJECT (editor->priv->img_key_radio),
118 G_CALLBACK (img_radio_toggled_cb),
121 gl_debug (DEBUG_EDITOR, "END");
125 /*--------------------------------------------------------------------------*/
126 /* PRIVATE. image radio callback. */
127 /*--------------------------------------------------------------------------*/
129 img_radio_toggled_cb (glObjectEditor *editor)
131 gl_debug (DEBUG_WDGT, "START");
133 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->img_file_radio))) {
134 gtk_widget_set_sensitive (editor->priv->img_file_button, TRUE);
135 gtk_widget_set_sensitive (editor->priv->img_key_combo, FALSE);
137 gtk_widget_set_sensitive (editor->priv->img_file_button, FALSE);
138 gtk_widget_set_sensitive (editor->priv->img_key_combo, TRUE);
141 gl_object_editor_changed_cb (editor);
143 gl_debug (DEBUG_WDGT, "END");
147 /*****************************************************************************/
149 /*****************************************************************************/
151 gl_object_editor_set_image (glObjectEditor *editor,
153 glTextNode *text_node)
155 gl_debug (DEBUG_EDITOR, "START");
158 g_signal_handlers_block_by_func (G_OBJECT (editor->priv->img_file_radio),
159 img_radio_toggled_cb, editor);
160 g_signal_handlers_block_by_func (G_OBJECT (editor->priv->img_key_radio),
161 img_radio_toggled_cb, editor);
162 g_signal_handlers_block_by_func (G_OBJECT (editor->priv->img_file_button),
163 img_selection_changed_cb, editor);
164 g_signal_handlers_block_by_func (G_OBJECT (editor->priv->img_key_combo),
165 gl_object_editor_changed_cb, editor);
168 gtk_widget_set_sensitive (editor->priv->img_key_radio, merge_flag);
170 if (!text_node->field_flag || !merge_flag)
172 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->img_file_radio), TRUE);
173 gtk_widget_set_sensitive (editor->priv->img_file_button, TRUE);
174 gtk_widget_set_sensitive (editor->priv->img_key_combo, FALSE);
176 if (text_node->data != NULL )
178 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(editor->priv->img_file_button),
183 gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER(editor->priv->img_file_button));
188 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->img_key_radio), TRUE);
190 gtk_widget_set_sensitive (editor->priv->img_file_button, FALSE);
191 gtk_widget_set_sensitive (editor->priv->img_key_combo, TRUE);
193 gl_field_button_set_key (GL_FIELD_BUTTON (editor->priv->img_key_combo),
198 g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->img_file_radio),
199 img_radio_toggled_cb, editor);
200 g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->img_key_radio),
201 img_radio_toggled_cb, editor);
202 g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->img_file_button),
203 img_selection_changed_cb, editor);
204 g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->img_key_combo),
205 gl_object_editor_changed_cb, editor);
208 gl_debug (DEBUG_EDITOR, "END");
212 /*****************************************************************************/
214 /*****************************************************************************/
216 gl_object_editor_get_image (glObjectEditor *editor)
218 glTextNode *text_node;
220 gl_debug (DEBUG_EDITOR, "START");
222 text_node = g_new0(glTextNode,1);
224 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->img_file_radio)))
226 text_node->field_flag = FALSE;
228 gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(editor->priv->img_file_button));
232 text_node->field_flag = TRUE;
234 gl_field_button_get_key (GL_FIELD_BUTTON (editor->priv->img_key_combo));
237 gl_debug (DEBUG_EDITOR, "text_node: field_flag=%d, data=%s",
238 text_node->field_flag, text_node->data);
240 gl_debug (DEBUG_EDITOR, "END");
246 /*--------------------------------------------------------------------------*/
247 /* PRIVATE. Update preview image. */
248 /*--------------------------------------------------------------------------*/
250 update_preview_cb (GtkFileChooser *file_chooser, gpointer data)
256 gl_debug (DEBUG_EDITOR, "START");
258 preview = GTK_WIDGET (data);
259 filename = gtk_file_chooser_get_preview_filename (file_chooser);
263 gl_debug (DEBUG_EDITOR, "filename =\"%s\"", filename);
264 pixbuf = gdk_pixbuf_new_from_file_at_size (filename, 128, 128, NULL);
267 gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf);
268 g_object_unref (G_OBJECT (pixbuf));
270 gtk_file_chooser_set_preview_widget_active (file_chooser,
277 gtk_file_chooser_set_preview_widget_active (file_chooser, FALSE);
280 gl_debug (DEBUG_EDITOR, "END");
284 /*--------------------------------------------------------------------------*/
285 /* PRIVATE. Add filters to file chooser. */
286 /* Based on eog's eog_file_selection_add_filter(). */
287 /*--------------------------------------------------------------------------*/
289 add_image_filters_to_chooser (GtkFileChooser *chooser)
291 GtkFileFilter *all_file_filter;
292 GtkFileFilter *all_img_filter;
295 GtkFileFilter *filter;
296 GSList *filters = NULL;
297 gchar **mime_types, **pattern, *tmp;
300 /* All Files Filter */
301 all_file_filter = gtk_file_filter_new ();
302 gtk_file_filter_set_name (all_file_filter, _("All Files"));
303 gtk_file_filter_add_pattern (all_file_filter, "*");
305 /* All Image Filter */
306 all_img_filter = gtk_file_filter_new ();
307 gtk_file_filter_set_name (all_img_filter, _("All Images"));
309 /* Individual image filters */
310 formats = gdk_pixbuf_get_formats ();
311 for (it = formats; it != NULL; it = it->next)
314 GdkPixbufFormat *format;
315 filter = gtk_file_filter_new ();
316 gchar *description, *name;
318 format = (GdkPixbufFormat*) it->data;
320 /* Filter name: First description then file extension, eg. "The PNG-Format (*.png)".*/
321 description = gdk_pixbuf_format_get_description (format);
322 name = gdk_pixbuf_format_get_name (format);
323 filter_name = g_strdup_printf (_("%s (*.%s)"), description, name);
324 g_free (description);
326 gtk_file_filter_set_name (filter, filter_name);
327 g_free (filter_name);
329 mime_types = gdk_pixbuf_format_get_mime_types ((GdkPixbufFormat *) it->data);
330 for (i = 0; mime_types[i] != NULL; i++)
332 gtk_file_filter_add_mime_type (filter, mime_types[i]);
333 gtk_file_filter_add_mime_type (all_img_filter, mime_types[i]);
335 g_strfreev (mime_types);
337 pattern = gdk_pixbuf_format_get_extensions ((GdkPixbufFormat *) it->data);
338 for (i = 0; pattern[i] != NULL; i++)
340 tmp = g_strconcat ("*.", pattern[i], NULL);
341 gtk_file_filter_add_pattern (filter, tmp);
342 gtk_file_filter_add_pattern (all_img_filter, tmp);
345 g_strfreev (pattern);
347 filters = g_slist_prepend (filters, filter);
349 g_slist_free (formats);
351 /* Add filter to filechooser */
352 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_file_filter);
353 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_img_filter);
354 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), all_img_filter);
356 for (it = filters; it != NULL; it = it->next) {
357 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser),
358 GTK_FILE_FILTER (it->data));
360 g_slist_free (filters);
364 /*--------------------------------------------------------------------------*/
365 /* PRIVATE. Selection changed callback. */
366 /*--------------------------------------------------------------------------*/
368 img_selection_changed_cb (glObjectEditor *editor)
372 gl_debug (DEBUG_EDITOR, "START");
374 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(editor->priv->img_file_button));
375 if (filename != NULL)
377 gl_object_editor_changed_cb (editor);
381 gl_debug (DEBUG_EDITOR, "END");
387 * Local Variables: -- emacs
389 * c-basic-offset: 8 -- emacs
390 * tab-width: 8 -- emacs
391 * indent-tabs-mode: nil -- emacs