]> git.sur5r.net Git - glabels/blob - src/wdgt-media-select.c
Organized master branch to be top-level directory for glabels, instead of
[glabels] / src / wdgt-media-select.c
1 /*
2  *  wdgt-media-select.c
3  *  Copyright (C) 2001-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
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.
11  *
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.
16  *
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/>.
19  */
20
21 #include <config.h>
22
23 #include "wdgt-media-select.h"
24
25 #include <glib/gi18n.h>
26 #include <gtk/gtk.h>
27 #include <string.h>
28
29 #include <libglabels/libglabels.h>
30 #include "mini-preview-pixbuf-cache.h"
31 #include "prefs.h"
32 #include "str-util.h"
33 #include "combo-util.h"
34 #include "builder-util.h"
35 #include "color.h"
36 #include "marshal.h"
37
38 #include "debug.h"
39
40
41 /*===========================================*/
42 /* Private types                             */
43 /*===========================================*/
44
45 enum {
46         NAME_COLUMN,
47         PREVIEW_COLUMN,
48         PREVIEW_COLUMN_STOCK,
49         PREVIEW_COLUMN_STOCK_SIZE,
50         DESCRIPTION_COLUMN,
51         N_COLUMNS
52 };
53
54 struct _glWdgtMediaSelectPrivate {
55
56         GtkBuilder   *builder;
57
58         GtkWidget    *notebook;
59         guint         current_page_num;
60
61         gint          recent_page_num;
62         GtkWidget    *recent_tab_vbox;
63         GtkWidget    *recent_treeview;
64         GtkListStore *recent_store;
65
66         gint          search_all_page_num;
67         GtkWidget    *search_all_tab_vbox;
68         GtkWidget    *brand_combo;
69         GtkWidget    *page_size_combo;
70         GtkWidget    *category_combo;
71         GtkWidget    *search_all_treeview;
72         GtkListStore *search_all_store;
73
74         /* Prevent recursion */
75         gboolean    stop_signals;
76 };
77
78 enum {
79         CHANGED,
80         LAST_SIGNAL
81 };
82
83 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
84
85
86 /*===========================================*/
87 /* Private globals                           */
88 /*===========================================*/
89
90 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
91
92
93 /*===========================================*/
94 /* Local function prototypes                 */
95 /*===========================================*/
96
97 static void gl_wdgt_media_select_finalize      (GObject                *object);
98
99 static void gl_wdgt_media_select_construct     (glWdgtMediaSelect      *media_select);
100
101 static void filter_changed_cb                  (GtkComboBox            *combo,
102                                                 gpointer                user_data);
103 static void selection_changed_cb               (GtkTreeSelection       *selection,
104                                                 gpointer                user_data);
105 static void page_changed_cb                    (GtkNotebook            *notebook,
106                                                 GtkNotebookPage        *page,
107                                                 guint                   page_num,
108                                                 gpointer                user_data);
109
110 static gchar *get_layout_desc                  (const lglTemplate      *template);
111 static gchar *get_label_size_desc              (const lglTemplate      *template);
112 static void   load_recent_list                 (GtkListStore           *store,
113                                                 GtkTreeSelection       *selection,
114                                                 GSList                 *list);
115 static void   load_search_all_list             (GtkListStore           *store,
116                                                 GtkTreeSelection       *selection,
117                                                 GList                  *list);
118
119
120 /****************************************************************************/
121 /* Boilerplate Object stuff.                                                */
122 /****************************************************************************/
123 G_DEFINE_TYPE (glWdgtMediaSelect, gl_wdgt_media_select, GTK_TYPE_VBOX);
124
125
126 static void
127 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass *class)
128 {
129         GObjectClass *object_class = G_OBJECT_CLASS (class);
130
131         gl_debug (DEBUG_MEDIA_SELECT, "START");
132
133         gl_wdgt_media_select_parent_class = g_type_class_peek_parent (class);
134
135         object_class->finalize = gl_wdgt_media_select_finalize;
136
137         wdgt_media_select_signals[CHANGED] =
138             g_signal_new ("changed",
139                           G_OBJECT_CLASS_TYPE(object_class),
140                           G_SIGNAL_RUN_LAST,
141                           G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
142                           NULL, NULL,
143                           gl_marshal_VOID__VOID,
144                           G_TYPE_NONE, 0);
145
146         gl_debug (DEBUG_MEDIA_SELECT, "END");
147 }
148
149
150 static void
151 gl_wdgt_media_select_init (glWdgtMediaSelect *media_select)
152 {
153         gl_debug (DEBUG_MEDIA_SELECT, "START");
154
155         media_select->priv = g_new0 (glWdgtMediaSelectPrivate, 1);
156
157         gl_debug (DEBUG_MEDIA_SELECT, "END");
158 }
159
160
161 static void
162 gl_wdgt_media_select_finalize (GObject *object)
163 {
164         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (object);
165
166         gl_debug (DEBUG_MEDIA_SELECT, "START");
167
168         g_return_if_fail (object != NULL);
169         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
170
171         if (media_select->priv->builder)
172         {
173                 g_object_unref (media_select->priv->builder);
174         }
175         g_object_unref (media_select->priv->recent_store);
176         g_object_unref (media_select->priv->search_all_store);
177         g_free (media_select->priv);
178
179         G_OBJECT_CLASS (gl_wdgt_media_select_parent_class)->finalize (object);
180
181         gl_debug (DEBUG_MEDIA_SELECT, "END");
182 }
183
184
185 GtkWidget *
186 gl_wdgt_media_select_new (void)
187 {
188         glWdgtMediaSelect *media_select;
189
190         gl_debug (DEBUG_MEDIA_SELECT, "START");
191
192         media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
193
194         gl_wdgt_media_select_construct (media_select);
195
196         gl_debug (DEBUG_MEDIA_SELECT, "END");
197
198         return GTK_WIDGET (media_select);
199 }
200
201
202 /*--------------------------------------------------------------------------*/
203 /* PRIVATE.  Construct composite widget.                                    */
204 /*--------------------------------------------------------------------------*/
205 static void
206 gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select)
207 {
208         GtkBuilder        *builder;
209         static gchar      *object_ids[] = { "wdgt_media_select_hbox", NULL };
210         GError            *error = NULL;
211         GtkWidget         *hbox;
212         GList             *brands = NULL;
213         GList             *page_sizes = NULL;
214         GList             *categories = NULL;
215         GList             *search_all_names = NULL;
216         const gchar       *page_size_id;
217         gchar             *page_size_name;
218         GtkCellRenderer   *renderer;
219         GtkTreeViewColumn *column;
220         GtkTreeSelection  *recent_selection;
221         GtkTreeSelection  *search_all_selection;
222
223         gl_debug (DEBUG_MEDIA_SELECT, "START");
224
225         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (media_select));
226         g_return_if_fail (media_select->priv != NULL);
227
228         builder = gtk_builder_new ();
229         gtk_builder_add_objects_from_file (builder,
230                                            GLABELS_BUILDER_DIR "wdgt-media-select.builder",
231                                            object_ids,
232                                            &error);
233         if (error) {
234                 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
235                 g_error_free (error);
236                 return;
237         }
238
239         gl_builder_util_get_widgets (builder,
240                                      "wdgt_media_select_hbox", &hbox,
241                                      "notebook",               &media_select->priv->notebook,
242
243                                      "recent_tab_vbox",        &media_select->priv->recent_tab_vbox,
244
245                                      "recent_treeview",        &media_select->priv->recent_treeview,
246                                      "search_all_tab_vbox",    &media_select->priv->search_all_tab_vbox,
247                                      "brand_combo",            &media_select->priv->brand_combo,
248                                      "page_size_combo",        &media_select->priv->page_size_combo,
249                                      "category_combo",         &media_select->priv->category_combo,
250                                      "search_all_treeview",    &media_select->priv->search_all_treeview,
251                                      NULL);
252
253         gtk_container_add (GTK_CONTAINER (media_select), hbox);
254         media_select->priv->builder = builder;
255
256         media_select->priv->recent_page_num =
257                 gtk_notebook_page_num (GTK_NOTEBOOK (media_select->priv->notebook),
258                                        media_select->priv->recent_tab_vbox);
259         media_select->priv->search_all_page_num =
260                 gtk_notebook_page_num (GTK_NOTEBOOK (media_select->priv->notebook),
261                                        media_select->priv->search_all_tab_vbox);
262
263         /* Recent templates treeview */
264         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);
265         gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->recent_treeview),
266                                  GTK_TREE_MODEL (media_select->priv->recent_store));
267         renderer = gtk_cell_renderer_pixbuf_new ();
268         column = gtk_tree_view_column_new_with_attributes ("", renderer,
269                                                            "pixbuf", PREVIEW_COLUMN,
270                                                            "stock-id", PREVIEW_COLUMN_STOCK,
271                                                            "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
272                                                            NULL);
273         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
274         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->recent_treeview), column);
275         renderer = gtk_cell_renderer_text_new ();
276         column = gtk_tree_view_column_new_with_attributes ("", renderer,
277                                                            "markup", DESCRIPTION_COLUMN,
278                                                            NULL);
279         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
280         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->recent_treeview), column);
281         recent_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->recent_treeview));
282         load_recent_list (media_select->priv->recent_store, recent_selection, gl_prefs->recent_templates);
283
284         page_size_id = gl_prefs_get_page_size ();
285         page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
286
287         /* Brand selection control */
288         gl_combo_util_add_text_model (GTK_COMBO_BOX (media_select->priv->brand_combo));
289         brands = lgl_db_get_brand_list (NULL, NULL);
290         brands = g_list_prepend (brands, g_strdup (_("Any")));
291         gl_combo_util_set_strings (GTK_COMBO_BOX (media_select->priv->brand_combo), brands);
292         lgl_db_free_brand_list (brands);
293         gl_combo_util_set_active_text (GTK_COMBO_BOX (media_select->priv->brand_combo),
294                                        _("Any"));
295
296         /* Page size selection control */
297         gl_combo_util_add_text_model (GTK_COMBO_BOX (media_select->priv->page_size_combo));
298         page_sizes = lgl_db_get_paper_name_list ();
299         page_sizes = g_list_prepend (page_sizes, g_strdup (_("Any")));
300         gl_combo_util_set_strings (GTK_COMBO_BOX (media_select->priv->page_size_combo), page_sizes);
301         lgl_db_free_paper_name_list (page_sizes);
302         gl_combo_util_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
303                                        page_size_name);
304
305         /* Category selection control */
306         gl_combo_util_add_text_model (GTK_COMBO_BOX (media_select->priv->category_combo));
307         categories = lgl_db_get_category_name_list ();
308         categories = g_list_prepend (categories, g_strdup (_("Any")));
309         gl_combo_util_set_strings (GTK_COMBO_BOX (media_select->priv->category_combo), categories);
310         gl_combo_util_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
311                                        _("Any"));
312         lgl_db_free_category_name_list (categories);
313
314         /* Search all treeview */
315         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);
316         gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->search_all_treeview),
317                                  GTK_TREE_MODEL (media_select->priv->search_all_store));
318         renderer = gtk_cell_renderer_pixbuf_new ();
319         column = gtk_tree_view_column_new_with_attributes ("", renderer,
320                                                            "pixbuf", PREVIEW_COLUMN,
321                                                            "stock-id", PREVIEW_COLUMN_STOCK,
322                                                            "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
323                                                            NULL);
324         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
325         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->search_all_treeview), column);
326         renderer = gtk_cell_renderer_text_new ();
327         column = gtk_tree_view_column_new_with_attributes ("", renderer,
328                                                            "markup", DESCRIPTION_COLUMN,
329                                                            NULL);
330         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
331         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->search_all_treeview), column);
332         search_all_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
333         search_all_names = lgl_db_get_template_name_list_all (NULL, page_size_id, NULL);
334         load_search_all_list (media_select->priv->search_all_store, search_all_selection, search_all_names);
335         lgl_db_free_template_name_list (search_all_names);
336
337         /* Connect signals to controls */
338         g_signal_connect (G_OBJECT (media_select->priv->brand_combo), "changed",
339                           G_CALLBACK (filter_changed_cb),
340                           media_select);
341         g_signal_connect (G_OBJECT (media_select->priv->page_size_combo), "changed",
342                           G_CALLBACK (filter_changed_cb),
343                           media_select);
344         g_signal_connect (G_OBJECT (media_select->priv->category_combo), "changed",
345                           G_CALLBACK (filter_changed_cb),
346                           media_select);
347         g_signal_connect (G_OBJECT (recent_selection), "changed",
348                           G_CALLBACK (selection_changed_cb),
349                           media_select);
350         g_signal_connect (G_OBJECT (search_all_selection), "changed",
351                           G_CALLBACK (selection_changed_cb),
352                           media_select);
353         g_signal_connect (G_OBJECT (media_select->priv->notebook), "switch-page",
354                           G_CALLBACK (page_changed_cb),
355                           media_select);
356
357         g_free (page_size_name);
358
359         gtk_widget_show_all (GTK_WIDGET (media_select));
360         if ( gl_prefs->recent_templates )
361         {
362                 gtk_notebook_set_current_page (GTK_NOTEBOOK (media_select->priv->notebook),
363                                                media_select->priv->recent_page_num);
364         }
365         else
366         {
367                 gtk_notebook_set_current_page (GTK_NOTEBOOK (media_select->priv->notebook),
368                                                media_select->priv->search_all_page_num);
369         }
370
371         gl_debug (DEBUG_MEDIA_SELECT, "END");
372 }
373
374
375 /*--------------------------------------------------------------------------*/
376 /* PRIVATE.  modify widget due to change in selection                       */
377 /*--------------------------------------------------------------------------*/
378 static void
379 filter_changed_cb (GtkComboBox *combo,
380                    gpointer     user_data)
381 {
382         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
383         gchar             *brand;
384         gchar             *page_size_name, *page_size_id;
385         gchar             *category_name, *category_id;
386         GList             *search_all_names;
387         GtkTreeSelection  *selection;
388
389         gl_debug (DEBUG_MEDIA_SELECT, "START");
390
391
392         media_select->priv->stop_signals = TRUE;
393
394         /* Update template selections for new filter settings */
395         brand = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->brand_combo));
396         page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
397         category_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
398         if ( brand && strlen(brand) &&
399              page_size_name && strlen(page_size_name) &&
400              category_name && strlen(category_name) )
401         {
402                 gl_debug (DEBUG_MEDIA_SELECT, "brand = \"%s\"", brand);
403                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = \"%s\"", page_size_name);
404                 gl_debug (DEBUG_MEDIA_SELECT, "category_name = \"%s\"", category_name);
405                 if (!g_utf8_collate (brand, _("Any")))
406                 {
407                         g_free (brand);
408                         brand = NULL;
409                 }
410                 page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
411                 category_id = lgl_db_lookup_category_id_from_name (category_name);
412                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_id = \"%s\"", page_size_id);
413                 gl_debug (DEBUG_MEDIA_SELECT, "category_id = \"%s\"", category_id);
414                 search_all_names = lgl_db_get_template_name_list_all (brand, page_size_id, category_id);
415                 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
416                 load_search_all_list (media_select->priv->search_all_store, selection, search_all_names);
417                 lgl_db_free_template_name_list (search_all_names);
418                 g_free (page_size_id);
419                 g_free (category_id);
420
421                 /* Emit our "changed" signal */
422                 g_signal_emit (G_OBJECT (user_data),
423                                wdgt_media_select_signals[CHANGED], 0);
424         }
425         g_free (brand);
426         g_free (page_size_name);
427         g_free (category_name);
428
429
430         media_select->priv->stop_signals = FALSE;
431
432         gl_debug (DEBUG_MEDIA_SELECT, "END");
433 }
434
435
436 /*--------------------------------------------------------------------------*/
437 /* PRIVATE.  modify widget due to change in selection                       */
438 /*--------------------------------------------------------------------------*/
439 static void
440 selection_changed_cb (GtkTreeSelection       *selection,
441                       gpointer                user_data)
442 {
443         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
444
445         if (media_select->priv->stop_signals) return;
446
447         gl_debug (DEBUG_MEDIA_SELECT, "START");
448
449         /* Emit our "changed" signal */
450         g_signal_emit (G_OBJECT (user_data),
451                        wdgt_media_select_signals[CHANGED], 0);
452
453         gl_debug (DEBUG_MEDIA_SELECT, "END");
454 }
455
456
457 /*--------------------------------------------------------------------------*/
458 /* PRIVATE.  modify widget due to change in selection                       */
459 /*--------------------------------------------------------------------------*/
460 static void
461 page_changed_cb (GtkNotebook            *notebook,
462                  GtkNotebookPage        *page,
463                  guint                   page_num,
464                  gpointer                user_data)
465 {
466         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
467
468         if (media_select->priv->stop_signals) return;
469
470         gl_debug (DEBUG_MEDIA_SELECT, "START");
471
472         /*
473          * Store new current page, because this signal is emitted before the actual page change.
474          */
475         media_select->priv->current_page_num = page_num;
476
477         /* Emit our "changed" signal */
478         g_signal_emit (G_OBJECT (user_data),
479                        wdgt_media_select_signals[CHANGED], 0);
480
481         gl_debug (DEBUG_MEDIA_SELECT, "END");
482 }
483
484
485 /****************************************************************************/
486 /* query selected label template name.                                      */
487 /****************************************************************************/
488 gchar *
489 gl_wdgt_media_select_get_name (glWdgtMediaSelect *media_select)
490 {
491         gint               page_num;
492         GtkTreeSelection  *selection;
493         GtkTreeIter        iter;
494         GtkTreeModel      *model;        
495         gchar             *name;
496
497         gl_debug (DEBUG_MEDIA_SELECT, "START");
498
499         page_num = media_select->priv->current_page_num;
500         if (page_num == media_select->priv->recent_page_num)
501         {
502                 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->recent_treeview));
503         }
504         else if (page_num == media_select->priv->search_all_page_num)
505         {
506                 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
507         }
508         else
509         {
510                 g_print ("notebook page = %d\n", page_num);
511                 g_assert_not_reached ();
512         }
513
514         if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
515         {
516                 name = NULL;
517         }
518         else
519         {
520                 gtk_tree_selection_get_selected (selection, &model, &iter);
521                 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
522         }
523
524         gl_debug (DEBUG_MEDIA_SELECT, "END");
525         return name;
526 }
527
528
529 /****************************************************************************/
530 /* set selected label template name.                                        */
531 /****************************************************************************/
532 void
533 gl_wdgt_media_select_set_name (glWdgtMediaSelect *media_select,
534                                gchar             *name)
535 {
536         GtkTreeSelection  *selection;
537         GtkTreeModel      *model;
538         GtkTreeIter        iter;
539         GtkTreePath       *path;
540         gchar             *name_i;
541         gboolean           flag;
542
543         gl_debug (DEBUG_MEDIA_SELECT, "START");
544
545         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
546         g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
547
548         model = GTK_TREE_MODEL (media_select->priv->search_all_store);
549
550         for ( flag = gtk_tree_model_get_iter_first (model, &iter);
551               flag;
552               flag = gtk_tree_model_iter_next(model, &iter) )
553         {
554                 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name_i, -1); 
555                 if (strcasecmp(name, name_i) == 0)
556                 {
557                         gtk_tree_selection_select_iter (selection, &iter);
558                         path = gtk_tree_model_get_path (model, &iter);
559                         gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (media_select->priv->search_all_treeview),
560                                                       path,
561                                                       NULL,
562                                                       TRUE, 0.5, 0.0);
563                         gtk_tree_path_free (path);
564                         break;
565                 }
566         }
567
568         gl_debug (DEBUG_MEDIA_SELECT, "END");
569 }
570
571
572 /****************************************************************************/
573 /* query current filter parameters.                                         */
574 /****************************************************************************/
575 void
576 gl_wdgt_media_select_get_filter_parameters (glWdgtMediaSelect *media_select,
577                                             gchar            **page_size_id,
578                                             gchar            **category_id)
579 {
580         gchar *page_size_name, *category_name;
581
582         gl_debug (DEBUG_MEDIA_SELECT, "");
583
584         g_free (*page_size_id);
585         g_free (*category_id);
586
587         page_size_name =
588                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
589
590         *page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
591
592         category_name =
593                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
594
595         *category_id = lgl_db_lookup_category_id_from_name (category_name);
596
597         g_free (page_size_name);
598         g_free (category_name);
599 }
600
601
602 /****************************************************************************/
603 /* set filter parameters.                                                   */
604 /****************************************************************************/
605 void
606 gl_wdgt_media_select_set_filter_parameters (glWdgtMediaSelect *media_select,
607                                             const gchar       *page_size_id,
608                                             const gchar       *category_id)
609 {
610         gchar *page_size_name;
611         gchar *category_name;
612
613         gl_debug (DEBUG_MEDIA_SELECT, "START");
614
615         page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
616         if (page_size_name == NULL)
617         {
618                 page_size_name = g_strdup (_("Any"));
619         }
620
621         gl_combo_util_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
622                                        page_size_name);
623
624         category_name = lgl_db_lookup_category_name_from_id (category_id);
625         if (category_name == NULL)
626         {
627                 category_name = g_strdup (_("Any"));
628         }
629
630         gl_combo_util_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
631                                        category_name);
632         g_free (page_size_name);
633         g_free (category_name);
634
635         gl_debug (DEBUG_MEDIA_SELECT, "END");
636 }
637
638
639 /*--------------------------------------------------------------------------*/
640 /* PRIVATE.  Get a description of the layout and number of labels.          */
641 /*--------------------------------------------------------------------------*/
642 static gchar *
643 get_layout_desc (const lglTemplate *template)
644 {
645         const lglTemplateFrame *frame;
646         gint                    n_labels;
647         gchar                  *string;
648
649         frame = (lglTemplateFrame *)template->frames->data;
650
651         n_labels = lgl_template_frame_get_n_labels (frame);
652
653         string = g_strdup_printf (_("%d per sheet"), n_labels);
654
655         return string;
656 }
657
658
659 /*--------------------------------------------------------------------------*/
660 /* PRIVATE.  Get label size description.                                    */ 
661 /*--------------------------------------------------------------------------*/
662 static gchar *
663 get_label_size_desc (const lglTemplate *template)
664 {
665         lglUnitsType               units;
666         const gchar               *units_string;
667         gdouble                    units_per_point;
668         const lglTemplateFrame    *frame;
669         gchar                     *string = NULL;
670
671         units           = gl_prefs_get_units ();
672         units_string    = gl_prefs_get_units_string ();
673         units_per_point = gl_prefs_get_units_per_point ();
674
675         frame = (lglTemplateFrame *)template->frames->data;
676
677         switch (frame->shape) {
678         case LGL_TEMPLATE_FRAME_SHAPE_RECT:
679                 if ( units == LGL_UNITS_INCH ) {
680                         gchar *xstr, *ystr;
681
682                         xstr = gl_str_util_fraction_to_string (frame->rect.w*units_per_point);
683                         ystr = gl_str_util_fraction_to_string (frame->rect.h*units_per_point);
684                         string = g_strdup_printf (_("%s x %s %s"),
685                                                   xstr, ystr, units_string);
686                         g_free (xstr);
687                         g_free (ystr);
688                 } else {
689                         string = g_strdup_printf (_("%.5g x %.5g %s"),
690                                                   frame->rect.w*units_per_point,
691                                                   frame->rect.h*units_per_point,
692                                                   units_string);
693                 }
694                 break;
695         case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
696                 if ( units == LGL_UNITS_INCH ) {
697                         gchar *dstr;
698
699                         dstr = gl_str_util_fraction_to_string (2.0*frame->round.r*units_per_point);
700                         string = g_strdup_printf (_("%s %s diameter"),
701                                                   dstr, units_string);
702                         g_free (dstr);
703                 } else {
704                         string = g_strdup_printf (_("%.5g %s diameter"),
705                                                   2.0*frame->round.r*units_per_point,
706                                                   units_string);
707                 }
708                 break;
709         case LGL_TEMPLATE_FRAME_SHAPE_CD:
710                 if ( units == LGL_UNITS_INCH ) {
711                         gchar *dstr;
712
713                         dstr = gl_str_util_fraction_to_string (2.0*frame->cd.r1*units_per_point);
714                         string = g_strdup_printf (_("%s %s diameter"),
715                                                   dstr, units_string);
716                         g_free (dstr);
717                 } else {
718                         string = g_strdup_printf (_("%.5g %s diameter"),
719                                                   2.0*frame->cd.r1*units_per_point,
720                                                   units_string);
721                 }
722                 break;
723         default:
724                 break;
725         }
726
727         return string;
728 }
729
730
731 /*--------------------------------------------------------------------------*/
732 /* PRIVATE.  Load list store from template name list.                       */
733 /*--------------------------------------------------------------------------*/
734 static void
735 load_recent_list (GtkListStore           *store,
736                   GtkTreeSelection       *selection,
737                   GSList                  *list)
738 {
739         GSList      *p;
740         GtkTreeIter  iter;
741         lglTemplate *template;
742         GdkPixbuf   *pixbuf;
743         gchar       *size;
744         gchar       *layout;
745         gchar       *description;
746
747         gl_debug (DEBUG_MEDIA_SELECT, "START");
748
749         gtk_list_store_clear (store);
750
751         if (list)
752         {
753
754                 for ( p=list; p!=NULL; p=p->next )
755                 {
756
757                         gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
758
759                         template = lgl_db_lookup_template_from_name (p->data);
760                         pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
761
762                         size = get_label_size_desc (template);
763                         layout = get_layout_desc (template);
764                         description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
765                                                        (gchar *)p->data,
766                                                        template->description,
767                                                        size,
768                                                        layout);
769                         g_free (size);
770                         g_free (layout);
771
772                         lgl_template_free (template);
773
774                         gtk_list_store_append (store, &iter);
775                         gtk_list_store_set (store, &iter,
776                                             NAME_COLUMN, p->data,
777                                             PREVIEW_COLUMN, pixbuf,
778                                             DESCRIPTION_COLUMN, description,
779                                             -1);
780
781                         g_object_unref (G_OBJECT (pixbuf));
782                         g_free (description);
783                 }
784
785                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
786                 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
787                 gtk_tree_selection_select_iter (selection, &iter);
788
789         }
790         else
791         {
792                 gchar *text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
793                                                _("No recent templates found."),
794                                                _("Try selecting a template from the \"Search all templates\" page."));
795                 gtk_list_store_append (store, &iter);
796                 gtk_list_store_set (store, &iter,
797                                     NAME_COLUMN, "empty",
798                                     PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING,
799                                     PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG,
800                                     DESCRIPTION_COLUMN, text,
801                                     -1);
802                 g_free (text);
803
804                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
805
806         }
807
808         gl_debug (DEBUG_MEDIA_SELECT, "END");
809 }
810
811
812 /*--------------------------------------------------------------------------*/
813 /* PRIVATE.  Load list store from template name list.                       */
814 /*--------------------------------------------------------------------------*/
815 static void
816 load_search_all_list (GtkListStore           *store,
817                       GtkTreeSelection       *selection,
818                       GList                  *list)
819 {
820         GList       *p;
821         GtkTreeIter  iter;
822         lglTemplate *template;
823         GdkPixbuf   *pixbuf;
824         gchar       *size;
825         gchar       *layout;
826         gchar       *description;
827
828         gl_debug (DEBUG_MEDIA_SELECT, "START");
829
830         gtk_list_store_clear (store);
831
832         if (list)
833         {
834
835                 for ( p=list; p!=NULL; p=p->next )
836                 {
837
838                         gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
839
840                         template = lgl_db_lookup_template_from_name (p->data);
841                         pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
842
843                         size = get_label_size_desc (template);
844                         layout = get_layout_desc (template);
845                         description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
846                                                        (gchar *)p->data,
847                                                        template->description,
848                                                        size,
849                                                        layout);
850                         g_free (size);
851                         g_free (layout);
852
853                         lgl_template_free (template);
854
855                         gtk_list_store_append (store, &iter);
856                         gtk_list_store_set (store, &iter,
857                                             NAME_COLUMN, p->data,
858                                             PREVIEW_COLUMN, pixbuf,
859                                             DESCRIPTION_COLUMN, description,
860                                             -1);
861
862                         g_object_unref (G_OBJECT (pixbuf));
863                         g_free (description);
864                 }
865
866                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
867                 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
868                 gtk_tree_selection_select_iter (selection, &iter);
869
870         }
871         else
872         {
873                 gchar *text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
874                                                _("No match."),
875                                                _("Try selecting a different brand, page size or category."));
876                 gtk_list_store_append (store, &iter);
877                 gtk_list_store_set (store, &iter,
878                                     NAME_COLUMN, "empty",
879                                     PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING,
880                                     PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG,
881                                     DESCRIPTION_COLUMN, text,
882                                     -1);
883                 g_free (text);
884
885                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
886
887         }
888
889         gl_debug (DEBUG_MEDIA_SELECT, "END");
890 }
891
892
893
894 /*
895  * Local Variables:       -- emacs
896  * mode: C                -- emacs
897  * c-basic-offset: 8      -- emacs
898  * tab-width: 8           -- emacs
899  * indent-tabs-mode: nil  -- emacs
900  * End:                   -- emacs
901  */