1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4 * (GLABELS) Label and Business Card Creation program for GNOME
6 * wdgt_media_select.c: media selection widget module
8 * Copyright (C) 2001-2006 Jim Evins <evins@snaught.com>.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "wdgt-media-select.h"
29 #include <glib/gi18n.h>
30 #include <glade/glade-xml.h>
31 #include <gtk/gtknotebook.h>
32 #include <gtk/gtkcombobox.h>
33 #include <gtk/gtktreeview.h>
34 #include <gtk/gtktreeselection.h>
35 #include <gtk/gtkliststore.h>
36 #include <gtk/gtkcellrenderertext.h>
37 #include <gtk/gtkcellrendererpixbuf.h>
38 #include <gtk/gtkstock.h>
41 #include "mini-preview-pixbuf-cache.h"
46 #include <libglabels/db.h>
50 /*===========================================*/
52 /*===========================================*/
58 PREVIEW_COLUMN_STOCK_SIZE,
63 struct _glWdgtMediaSelectPrivate {
66 guint current_page_num;
69 GtkWidget *recent_tab_vbox;
70 GtkWidget *recent_treeview;
71 GtkListStore *recent_store;
73 gint search_all_page_num;
74 GtkWidget *search_all_tab_vbox;
75 GtkWidget *brand_combo;
76 GtkWidget *page_size_combo;
77 GtkWidget *category_combo;
78 GtkWidget *search_all_treeview;
79 GtkListStore *search_all_store;
81 /* Prevent recursion */
82 gboolean stop_signals;
90 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
92 /*===========================================*/
94 /*===========================================*/
96 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
98 /*===========================================*/
99 /* Local function prototypes */
100 /*===========================================*/
102 static void gl_wdgt_media_select_finalize (GObject *object);
104 static void gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select);
106 static void filter_changed_cb (GtkComboBox *combo,
108 static void selection_changed_cb (GtkTreeSelection *selection,
110 static void page_changed_cb (GtkNotebook *notebook,
111 GtkNotebookPage *page,
115 static gchar *get_layout_desc (const lglTemplate *template);
116 static gchar *get_label_size_desc (const lglTemplate *template);
117 static void load_recent_list (GtkListStore *store,
118 GtkTreeSelection *selection,
120 static void load_search_all_list (GtkListStore *store,
121 GtkTreeSelection *selection,
124 /****************************************************************************/
125 /* Boilerplate Object stuff. */
126 /****************************************************************************/
127 G_DEFINE_TYPE (glWdgtMediaSelect, gl_wdgt_media_select, GTK_TYPE_VBOX);
131 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass *class)
133 GObjectClass *object_class = G_OBJECT_CLASS (class);
135 gl_debug (DEBUG_MEDIA_SELECT, "START");
137 gl_wdgt_media_select_parent_class = g_type_class_peek_parent (class);
139 object_class->finalize = gl_wdgt_media_select_finalize;
141 wdgt_media_select_signals[CHANGED] =
142 g_signal_new ("changed",
143 G_OBJECT_CLASS_TYPE(object_class),
145 G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
147 gl_marshal_VOID__VOID,
150 gl_debug (DEBUG_MEDIA_SELECT, "END");
154 gl_wdgt_media_select_init (glWdgtMediaSelect *media_select)
156 gl_debug (DEBUG_MEDIA_SELECT, "START");
158 media_select->priv = g_new0 (glWdgtMediaSelectPrivate, 1);
160 gl_debug (DEBUG_MEDIA_SELECT, "END");
164 gl_wdgt_media_select_finalize (GObject *object)
166 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (object);
168 gl_debug (DEBUG_MEDIA_SELECT, "START");
170 g_return_if_fail (object != NULL);
171 g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
173 g_object_unref (media_select->priv->recent_store);
174 g_object_unref (media_select->priv->search_all_store);
175 g_free (media_select->priv);
177 G_OBJECT_CLASS (gl_wdgt_media_select_parent_class)->finalize (object);
179 gl_debug (DEBUG_MEDIA_SELECT, "END");
183 gl_wdgt_media_select_new (void)
185 glWdgtMediaSelect *media_select;
187 gl_debug (DEBUG_MEDIA_SELECT, "START");
189 media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
191 gl_wdgt_media_select_construct (media_select);
193 gl_debug (DEBUG_MEDIA_SELECT, "END");
195 return GTK_WIDGET (media_select);
198 /*--------------------------------------------------------------------------*/
199 /* PRIVATE. Construct composite widget. */
200 /*--------------------------------------------------------------------------*/
202 gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select)
206 GList *brands = NULL;
207 GList *page_sizes = NULL;
208 GList *categories = NULL;
209 GList *search_all_names = NULL;
210 const gchar *page_size_id;
211 gchar *page_size_name;
212 GtkCellRenderer *renderer;
213 GtkTreeViewColumn *column;
214 GtkTreeSelection *recent_selection;
215 GtkTreeSelection *search_all_selection;
217 gl_debug (DEBUG_MEDIA_SELECT, "START");
219 g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (media_select));
220 g_return_if_fail (media_select->priv != NULL);
222 gui = glade_xml_new (GLABELS_GLADE_DIR "wdgt-media-select.glade",
223 "wdgt_media_select_hbox", NULL);
226 g_critical ("Could not open wdgt-media-select.glade. gLabels may not be installed correctly!");
230 hbox = glade_xml_get_widget (gui, "wdgt_media_select_hbox");
231 gtk_container_add (GTK_CONTAINER (media_select), hbox);
233 media_select->priv->notebook =
234 glade_xml_get_widget (gui, "notebook");
236 media_select->priv->recent_tab_vbox =
237 glade_xml_get_widget (gui, "recent_tab_vbox");
238 media_select->priv->recent_treeview =
239 glade_xml_get_widget (gui, "recent_treeview");
241 media_select->priv->search_all_tab_vbox =
242 glade_xml_get_widget (gui, "search_all_tab_vbox");
243 media_select->priv->brand_combo =
244 glade_xml_get_widget (gui, "brand_combo");
245 media_select->priv->page_size_combo =
246 glade_xml_get_widget (gui, "page_size_combo");
247 media_select->priv->category_combo =
248 glade_xml_get_widget (gui, "category_combo");
249 media_select->priv->search_all_treeview =
250 glade_xml_get_widget (gui, "search_all_treeview");
252 g_object_unref (gui);
254 media_select->priv->recent_page_num =
255 gtk_notebook_page_num (GTK_NOTEBOOK (media_select->priv->notebook),
256 media_select->priv->recent_tab_vbox);
257 media_select->priv->search_all_page_num =
258 gtk_notebook_page_num (GTK_NOTEBOOK (media_select->priv->notebook),
259 media_select->priv->search_all_tab_vbox);
261 /* Recent templates treeview */
262 media_select->priv->recent_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
263 gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->recent_treeview),
264 GTK_TREE_MODEL (media_select->priv->recent_store));
265 renderer = gtk_cell_renderer_pixbuf_new ();
266 column = gtk_tree_view_column_new_with_attributes ("", renderer,
267 "pixbuf", PREVIEW_COLUMN,
268 "stock-id", PREVIEW_COLUMN_STOCK,
269 "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
271 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
272 gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->recent_treeview), column);
273 renderer = gtk_cell_renderer_text_new ();
274 column = gtk_tree_view_column_new_with_attributes ("", renderer,
275 "markup", DESCRIPTION_COLUMN,
277 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
278 gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->recent_treeview), column);
279 recent_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->recent_treeview));
280 load_recent_list (media_select->priv->recent_store, recent_selection, gl_prefs->recent_templates);
282 page_size_id = gl_prefs_get_page_size ();
283 page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
285 /* Brand selection control */
286 gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->brand_combo));
287 brands = lgl_db_get_brand_list (NULL, NULL);
288 brands = g_list_prepend (brands, g_strdup (_("Any")));
289 gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->brand_combo), brands);
290 lgl_db_free_brand_list (brands);
291 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->brand_combo),
294 /* Page size selection control */
295 gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->page_size_combo));
296 page_sizes = lgl_db_get_paper_name_list ();
297 page_sizes = g_list_prepend (page_sizes, g_strdup (_("Any")));
298 gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->page_size_combo), page_sizes);
299 lgl_db_free_paper_name_list (page_sizes);
300 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
303 /* Category selection control */
304 gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->category_combo));
305 categories = lgl_db_get_category_name_list ();
306 categories = g_list_prepend (categories, g_strdup (_("Any")));
307 gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->category_combo), categories);
308 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
310 lgl_db_free_category_name_list (categories);
312 /* Search all treeview */
313 media_select->priv->search_all_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
314 gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->search_all_treeview),
315 GTK_TREE_MODEL (media_select->priv->search_all_store));
316 renderer = gtk_cell_renderer_pixbuf_new ();
317 column = gtk_tree_view_column_new_with_attributes ("", renderer,
318 "pixbuf", PREVIEW_COLUMN,
319 "stock-id", PREVIEW_COLUMN_STOCK,
320 "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
322 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
323 gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->search_all_treeview), column);
324 renderer = gtk_cell_renderer_text_new ();
325 column = gtk_tree_view_column_new_with_attributes ("", renderer,
326 "markup", DESCRIPTION_COLUMN,
328 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
329 gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->search_all_treeview), column);
330 search_all_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
331 search_all_names = lgl_db_get_template_name_list_all (NULL, page_size_id, NULL);
332 load_search_all_list (media_select->priv->search_all_store, search_all_selection, search_all_names);
333 lgl_db_free_template_name_list (search_all_names);
335 /* Connect signals to controls */
336 g_signal_connect (G_OBJECT (media_select->priv->brand_combo), "changed",
337 G_CALLBACK (filter_changed_cb),
339 g_signal_connect (G_OBJECT (media_select->priv->page_size_combo), "changed",
340 G_CALLBACK (filter_changed_cb),
342 g_signal_connect (G_OBJECT (media_select->priv->category_combo), "changed",
343 G_CALLBACK (filter_changed_cb),
345 g_signal_connect (G_OBJECT (recent_selection), "changed",
346 G_CALLBACK (selection_changed_cb),
348 g_signal_connect (G_OBJECT (search_all_selection), "changed",
349 G_CALLBACK (selection_changed_cb),
351 g_signal_connect (G_OBJECT (media_select->priv->notebook), "switch-page",
352 G_CALLBACK (page_changed_cb),
355 g_free (page_size_name);
357 gtk_widget_show_all (GTK_WIDGET (media_select));
358 if ( gl_prefs->recent_templates )
360 gtk_notebook_set_current_page (GTK_NOTEBOOK (media_select->priv->notebook),
361 media_select->priv->recent_page_num);
365 gtk_notebook_set_current_page (GTK_NOTEBOOK (media_select->priv->notebook),
366 media_select->priv->search_all_page_num);
369 gl_debug (DEBUG_MEDIA_SELECT, "END");
372 /*--------------------------------------------------------------------------*/
373 /* PRIVATE. modify widget due to change in selection */
374 /*--------------------------------------------------------------------------*/
376 filter_changed_cb (GtkComboBox *combo,
379 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
381 gchar *page_size_name, *page_size_id;
382 gchar *category_name, *category_id;
383 GList *search_all_names;
384 GtkTreeSelection *selection;
386 gl_debug (DEBUG_MEDIA_SELECT, "START");
389 media_select->priv->stop_signals = TRUE;
391 /* Update template selections for new filter settings */
392 brand = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->brand_combo));
393 page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
394 category_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
395 if ( brand && strlen(brand) &&
396 page_size_name && strlen(page_size_name) &&
397 category_name && strlen(category_name) )
399 gl_debug (DEBUG_MEDIA_SELECT, "brand = \"%s\"", brand);
400 gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = \"%s\"", page_size_name);
401 gl_debug (DEBUG_MEDIA_SELECT, "category_name = \"%s\"", category_name);
402 if (!g_utf8_collate (brand, _("Any")))
407 page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
408 category_id = lgl_db_lookup_category_id_from_name (category_name);
409 gl_debug (DEBUG_MEDIA_SELECT, "page_size_id = \"%s\"", page_size_id);
410 gl_debug (DEBUG_MEDIA_SELECT, "category_id = \"%s\"", category_id);
411 search_all_names = lgl_db_get_template_name_list_all (brand, page_size_id, category_id);
412 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
413 load_search_all_list (media_select->priv->search_all_store, selection, search_all_names);
414 lgl_db_free_template_name_list (search_all_names);
415 g_free (page_size_id);
416 g_free (category_id);
418 /* Emit our "changed" signal */
419 g_signal_emit (G_OBJECT (user_data),
420 wdgt_media_select_signals[CHANGED], 0);
423 g_free (page_size_name);
424 g_free (category_name);
427 media_select->priv->stop_signals = FALSE;
429 gl_debug (DEBUG_MEDIA_SELECT, "END");
432 /*--------------------------------------------------------------------------*/
433 /* PRIVATE. modify widget due to change in selection */
434 /*--------------------------------------------------------------------------*/
436 selection_changed_cb (GtkTreeSelection *selection,
439 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
441 if (media_select->priv->stop_signals) return;
443 gl_debug (DEBUG_MEDIA_SELECT, "START");
445 /* Emit our "changed" signal */
446 g_signal_emit (G_OBJECT (user_data),
447 wdgt_media_select_signals[CHANGED], 0);
449 gl_debug (DEBUG_MEDIA_SELECT, "END");
452 /*--------------------------------------------------------------------------*/
453 /* PRIVATE. modify widget due to change in selection */
454 /*--------------------------------------------------------------------------*/
456 page_changed_cb (GtkNotebook *notebook,
457 GtkNotebookPage *page,
461 glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
463 if (media_select->priv->stop_signals) return;
465 gl_debug (DEBUG_MEDIA_SELECT, "START");
468 * Store new current page, because this signal is emitted before the actual page change.
470 media_select->priv->current_page_num = page_num;
472 /* Emit our "changed" signal */
473 g_signal_emit (G_OBJECT (user_data),
474 wdgt_media_select_signals[CHANGED], 0);
476 gl_debug (DEBUG_MEDIA_SELECT, "END");
479 /****************************************************************************/
480 /* query selected label template name. */
481 /****************************************************************************/
483 gl_wdgt_media_select_get_name (glWdgtMediaSelect *media_select)
486 GtkTreeSelection *selection;
491 gl_debug (DEBUG_MEDIA_SELECT, "START");
493 page_num = media_select->priv->current_page_num;
494 if (page_num == media_select->priv->recent_page_num)
496 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->recent_treeview));
498 else if (page_num == media_select->priv->search_all_page_num)
500 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
504 g_print ("notebook page = %d\n", page_num);
505 g_assert_not_reached ();
508 if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
514 gtk_tree_selection_get_selected (selection, &model, &iter);
515 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
518 gl_debug (DEBUG_MEDIA_SELECT, "END");
522 /****************************************************************************/
523 /* set selected label template name. */
524 /****************************************************************************/
526 gl_wdgt_media_select_set_name (glWdgtMediaSelect *media_select,
529 GtkTreeSelection *selection;
536 gl_debug (DEBUG_MEDIA_SELECT, "START");
538 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
539 g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
541 model = GTK_TREE_MODEL (media_select->priv->search_all_store);
543 for ( flag = gtk_tree_model_get_iter_first (model, &iter);
545 flag = gtk_tree_model_iter_next(model, &iter) )
547 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name_i, -1);
548 if (strcasecmp(name, name_i) == 0)
550 gtk_tree_selection_select_iter (selection, &iter);
551 path = gtk_tree_model_get_path (model, &iter);
552 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (media_select->priv->search_all_treeview),
556 gtk_tree_path_free (path);
561 gl_debug (DEBUG_MEDIA_SELECT, "END");
564 /****************************************************************************/
565 /* query current filter parameters. */
566 /****************************************************************************/
568 gl_wdgt_media_select_get_filter_parameters (glWdgtMediaSelect *media_select,
569 gchar **page_size_id,
572 gchar *page_size_name, *category_name;
574 gl_debug (DEBUG_MEDIA_SELECT, "");
576 g_free (*page_size_id);
577 g_free (*category_id);
580 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
582 *page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
585 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
587 *category_id = lgl_db_lookup_category_id_from_name (category_name);
589 g_free (page_size_name);
590 g_free (category_name);
593 /****************************************************************************/
594 /* set filter parameters. */
595 /****************************************************************************/
597 gl_wdgt_media_select_set_filter_parameters (glWdgtMediaSelect *media_select,
598 const gchar *page_size_id,
599 const gchar *category_id)
601 gchar *page_size_name;
602 gchar *category_name;
604 gl_debug (DEBUG_MEDIA_SELECT, "START");
606 page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
607 if (page_size_name == NULL)
609 page_size_name = g_strdup (_("Any"));
612 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
615 category_name = lgl_db_lookup_category_name_from_id (category_id);
616 if (category_name == NULL)
618 category_name = g_strdup (_("Any"));
621 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
623 g_free (page_size_name);
624 g_free (category_name);
626 gl_debug (DEBUG_MEDIA_SELECT, "END");
629 /*--------------------------------------------------------------------------*/
630 /* PRIVATE. Get a description of the layout and number of labels. */
631 /*--------------------------------------------------------------------------*/
633 get_layout_desc (const lglTemplate *template)
635 const lglTemplateFrame *frame;
639 frame = (lglTemplateFrame *)template->frames->data;
641 n_labels = lgl_template_frame_get_n_labels (frame);
643 string = g_strdup_printf (_("%d per sheet"), n_labels);
648 /*--------------------------------------------------------------------------*/
649 /* PRIVATE. Get label size description. */
650 /*--------------------------------------------------------------------------*/
652 get_label_size_desc (const lglTemplate *template)
655 const gchar *units_string;
656 gdouble units_per_point;
657 const lglTemplateFrame *frame;
658 gchar *string = NULL;
660 units = gl_prefs_get_units ();
661 units_string = gl_prefs_get_units_string ();
662 units_per_point = gl_prefs_get_units_per_point ();
664 frame = (lglTemplateFrame *)template->frames->data;
666 switch (frame->shape) {
667 case LGL_TEMPLATE_FRAME_SHAPE_RECT:
668 if ( units == LGL_UNITS_INCH ) {
671 xstr = gl_util_fraction (frame->rect.w*units_per_point);
672 ystr = gl_util_fraction (frame->rect.h*units_per_point);
673 string = g_strdup_printf (_("%s x %s %s"),
674 xstr, ystr, units_string);
678 string = g_strdup_printf (_("%.5g x %.5g %s"),
679 frame->rect.w*units_per_point,
680 frame->rect.h*units_per_point,
684 case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
685 if ( units == LGL_UNITS_INCH ) {
688 dstr = gl_util_fraction (2.0*frame->round.r*units_per_point);
689 string = g_strdup_printf (_("%s %s diameter"),
693 string = g_strdup_printf (_("%.5g %s diameter"),
694 2.0*frame->round.r*units_per_point,
698 case LGL_TEMPLATE_FRAME_SHAPE_CD:
699 if ( units == LGL_UNITS_INCH ) {
702 dstr = gl_util_fraction (2.0*frame->cd.r1*units_per_point);
703 string = g_strdup_printf (_("%s %s diameter"),
707 string = g_strdup_printf (_("%.5g %s diameter"),
708 2.0*frame->cd.r1*units_per_point,
719 /*--------------------------------------------------------------------------*/
720 /* PRIVATE. Load list store from template name list. */
721 /*--------------------------------------------------------------------------*/
723 load_recent_list (GtkListStore *store,
724 GtkTreeSelection *selection,
729 lglTemplate *template;
735 gl_debug (DEBUG_MEDIA_SELECT, "START");
737 gtk_list_store_clear (store);
742 for ( p=list; p!=NULL; p=p->next )
745 gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
747 template = lgl_db_lookup_template_from_name (p->data);
748 pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
750 size = get_label_size_desc (template);
751 layout = get_layout_desc (template);
752 description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
754 template->description,
760 lgl_template_free (template);
762 gtk_list_store_append (store, &iter);
763 gtk_list_store_set (store, &iter,
764 NAME_COLUMN, p->data,
765 PREVIEW_COLUMN, pixbuf,
766 DESCRIPTION_COLUMN, description,
769 g_object_unref (G_OBJECT (pixbuf));
770 g_free (description);
773 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
774 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
775 gtk_tree_selection_select_iter (selection, &iter);
780 gchar *text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
781 _("No recent templates found."),
782 _("Try selecting a template from the \"Search all templates\" page."));
783 gtk_list_store_append (store, &iter);
784 gtk_list_store_set (store, &iter,
785 NAME_COLUMN, "empty",
786 PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING,
787 PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG,
788 DESCRIPTION_COLUMN, text,
792 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
796 gl_debug (DEBUG_MEDIA_SELECT, "END");
799 /*--------------------------------------------------------------------------*/
800 /* PRIVATE. Load list store from template name list. */
801 /*--------------------------------------------------------------------------*/
803 load_search_all_list (GtkListStore *store,
804 GtkTreeSelection *selection,
809 lglTemplate *template;
815 gl_debug (DEBUG_MEDIA_SELECT, "START");
817 gtk_list_store_clear (store);
822 for ( p=list; p!=NULL; p=p->next )
825 gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
827 template = lgl_db_lookup_template_from_name (p->data);
828 pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
830 size = get_label_size_desc (template);
831 layout = get_layout_desc (template);
832 description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
834 template->description,
840 lgl_template_free (template);
842 gtk_list_store_append (store, &iter);
843 gtk_list_store_set (store, &iter,
844 NAME_COLUMN, p->data,
845 PREVIEW_COLUMN, pixbuf,
846 DESCRIPTION_COLUMN, description,
849 g_object_unref (G_OBJECT (pixbuf));
850 g_free (description);
853 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
854 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
855 gtk_tree_selection_select_iter (selection, &iter);
860 gchar *text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
862 _("Try selecting a different brand, page size or category."));
863 gtk_list_store_append (store, &iter);
864 gtk_list_store_set (store, &iter,
865 NAME_COLUMN, "empty",
866 PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING,
867 PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG,
868 DESCRIPTION_COLUMN, text,
872 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
876 gl_debug (DEBUG_MEDIA_SELECT, "END");