3 * Copyright (C) 2001-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 "media-select.h"
25 #include <glib/gi18n.h>
29 #include <libglabels.h>
30 #include "mini-preview-pixbuf-cache.h"
32 #include "message-bar.h"
33 #include "template-history.h"
34 #include "template-designer.h"
36 #include "combo-util.h"
37 #include "builder-util.h"
44 #define HISTORY_SIZE 5
46 /*===========================================*/
48 /*===========================================*/
54 PREVIEW_COLUMN_STOCK_SIZE,
59 struct _glMediaSelectPrivate {
66 guint current_page_num;
69 GtkWidget *recent_tab_vbox;
70 GtkWidget *recent_info_vbox;
71 GtkWidget *recent_info_bar;
72 GtkWidget *recent_treeview;
73 GtkListStore *recent_store;
75 gint search_all_page_num;
76 GtkWidget *search_all_tab_vbox;
77 GtkWidget *search_all_info_vbox;
78 GtkWidget *search_all_info_bar;
79 GtkWidget *brand_combo;
80 GtkWidget *page_size_combo;
81 GtkWidget *category_combo;
82 GtkWidget *search_all_treeview;
83 GtkListStore *search_all_store;
86 GtkWidget *custom_tab_vbox;
87 GtkWidget *custom_info_vbox;
88 GtkWidget *custom_info_bar;
89 GtkWidget *custom_treeview;
90 GtkListStore *custom_store;
91 GtkWidget *custom_add_button;
92 GtkWidget *custom_edit_button;
93 GtkWidget *custom_delete_button;
95 /* Prevent recursion */
96 gboolean stop_signals;
105 /*===========================================*/
106 /* Private globals */
107 /*===========================================*/
109 static gint signals[LAST_SIGNAL] = { 0 };
112 /*===========================================*/
113 /* Local function prototypes */
114 /*===========================================*/
116 static void gl_media_select_finalize (GObject *object);
118 static void gl_media_select_construct (glMediaSelect *this);
120 static void filter_changed_cb (glMediaSelect *this);
122 static void selection_changed_cb (GtkTreeSelection *selection,
125 static void custom_add_clicked_cb (GtkButton *button,
128 static void custom_edit_clicked_cb (GtkButton *button,
131 static void custom_delete_clicked_cb (GtkButton *button,
134 static void page_changed_cb (GtkNotebook *notebook,
139 static void db_changed_cb (glMediaSelect *this);
141 static void load_recent_list (glMediaSelect *this,
143 GtkTreeSelection *selection,
146 static void load_custom_list (glMediaSelect *this,
148 GtkTreeSelection *selection,
151 static void load_search_all_list (glMediaSelect *this,
153 GtkTreeSelection *selection,
157 /****************************************************************************/
158 /* Boilerplate Object stuff. */
159 /****************************************************************************/
160 G_DEFINE_TYPE (glMediaSelect, gl_media_select, GTK_TYPE_VBOX);
164 gl_media_select_class_init (glMediaSelectClass *class)
166 GObjectClass *object_class = G_OBJECT_CLASS (class);
168 gl_debug (DEBUG_MEDIA_SELECT, "START");
170 gl_media_select_parent_class = g_type_class_peek_parent (class);
172 object_class->finalize = gl_media_select_finalize;
175 g_signal_new ("changed",
176 G_OBJECT_CLASS_TYPE(object_class),
178 G_STRUCT_OFFSET (glMediaSelectClass, changed),
180 gl_marshal_VOID__VOID,
183 gl_debug (DEBUG_MEDIA_SELECT, "END");
188 gl_media_select_init (glMediaSelect *this)
190 gl_debug (DEBUG_MEDIA_SELECT, "START");
192 this->priv = g_new0 (glMediaSelectPrivate, 1);
194 gl_debug (DEBUG_MEDIA_SELECT, "END");
199 gl_media_select_finalize (GObject *object)
201 glMediaSelect *this = GL_MEDIA_SELECT (object);
203 gl_debug (DEBUG_MEDIA_SELECT, "START");
205 g_return_if_fail (object != NULL);
206 g_return_if_fail (GL_IS_MEDIA_SELECT (object));
208 if (this->priv->db_notify_id)
210 lgl_db_notify_remove (this->priv->db_notify_id);
213 if (this->priv->builder)
215 g_object_unref (this->priv->builder);
217 g_object_unref (this->priv->recent_store);
218 g_object_unref (this->priv->search_all_store);
221 G_OBJECT_CLASS (gl_media_select_parent_class)->finalize (object);
223 gl_debug (DEBUG_MEDIA_SELECT, "END");
228 gl_media_select_new (void)
232 gl_debug (DEBUG_MEDIA_SELECT, "START");
234 this = g_object_new (gl_media_select_get_type (), NULL);
236 gl_media_select_construct (this);
238 gl_debug (DEBUG_MEDIA_SELECT, "END");
240 return GTK_WIDGET (this);
244 /*--------------------------------------------------------------------------*/
245 /* PRIVATE. Construct composite widget. */
246 /*--------------------------------------------------------------------------*/
248 gl_media_select_construct (glMediaSelect *this)
250 gchar *builder_filename;
252 static gchar *object_ids[] = { "media_select_hbox",
253 "custom_buttons_sizegroup",
255 GError *error = NULL;
257 GList *recent_list = NULL;
258 GList *brands = NULL;
259 GList *page_sizes = NULL;
260 GList *categories = NULL;
261 GList *search_all_names = NULL;
262 const gchar *page_size_id;
263 gchar *page_size_name;
264 GList *custom_list = NULL;
265 GtkCellRenderer *renderer;
266 GtkTreeViewColumn *column;
267 GtkTreeSelection *recent_selection;
268 GtkTreeSelection *search_all_selection;
269 GtkTreeSelection *custom_selection;
271 gl_debug (DEBUG_MEDIA_SELECT, "START");
273 g_return_if_fail (GL_IS_MEDIA_SELECT (this));
274 g_return_if_fail (this->priv != NULL);
276 builder = gtk_builder_new ();
277 builder_filename = g_build_filename (GLABELS_DATA_DIR, "ui", "media-select.ui", NULL);
278 gtk_builder_add_objects_from_file (builder, builder_filename, object_ids, &error);
279 g_free (builder_filename);
281 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
282 g_error_free (error);
286 gl_builder_util_get_widgets (builder,
287 "media_select_hbox", &hbox,
288 "notebook", &this->priv->notebook,
289 "recent_tab_vbox", &this->priv->recent_tab_vbox,
290 "recent_info_vbox", &this->priv->recent_info_vbox,
291 "recent_treeview", &this->priv->recent_treeview,
292 "search_all_tab_vbox", &this->priv->search_all_tab_vbox,
293 "brand_combo", &this->priv->brand_combo,
294 "page_size_combo", &this->priv->page_size_combo,
295 "category_combo", &this->priv->category_combo,
296 "search_all_info_vbox", &this->priv->search_all_info_vbox,
297 "search_all_treeview", &this->priv->search_all_treeview,
298 "custom_tab_vbox", &this->priv->custom_tab_vbox,
299 "custom_info_vbox", &this->priv->custom_info_vbox,
300 "custom_treeview", &this->priv->custom_treeview,
301 "custom_add_button", &this->priv->custom_add_button,
302 "custom_edit_button", &this->priv->custom_edit_button,
303 "custom_delete_button", &this->priv->custom_delete_button,
306 gtk_container_add (GTK_CONTAINER (this), hbox);
307 this->priv->builder = builder;
309 this->priv->recent_page_num =
310 gtk_notebook_page_num (GTK_NOTEBOOK (this->priv->notebook),
311 this->priv->recent_tab_vbox);
312 this->priv->search_all_page_num =
313 gtk_notebook_page_num (GTK_NOTEBOOK (this->priv->notebook),
314 this->priv->search_all_tab_vbox);
315 this->priv->custom_page_num =
316 gtk_notebook_page_num (GTK_NOTEBOOK (this->priv->notebook),
317 this->priv->custom_tab_vbox);
319 gtk_widget_show_all (GTK_WIDGET (this));
321 /* Recent templates treeview */
322 this->priv->recent_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
323 gtk_tree_view_set_model (GTK_TREE_VIEW (this->priv->recent_treeview),
324 GTK_TREE_MODEL (this->priv->recent_store));
325 renderer = gtk_cell_renderer_pixbuf_new ();
326 column = gtk_tree_view_column_new_with_attributes ("", renderer,
327 "pixbuf", PREVIEW_COLUMN,
328 "stock-id", PREVIEW_COLUMN_STOCK,
329 "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
331 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
332 gtk_tree_view_append_column (GTK_TREE_VIEW (this->priv->recent_treeview), column);
333 renderer = gtk_cell_renderer_text_new ();
334 column = gtk_tree_view_column_new_with_attributes ("", renderer,
335 "markup", DESCRIPTION_COLUMN,
337 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
338 gtk_tree_view_append_column (GTK_TREE_VIEW (this->priv->recent_treeview), column);
339 recent_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->recent_treeview));
340 recent_list = gl_template_history_model_get_name_list (gl_template_history);
341 load_recent_list (this, this->priv->recent_store, recent_selection, recent_list);
343 page_size_id = gl_prefs_model_get_default_page_size (gl_prefs);
344 page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
346 /* Brand selection control */
347 gl_combo_util_add_text_model (GTK_COMBO_BOX (this->priv->brand_combo));
348 brands = lgl_db_get_brand_list (NULL, NULL);
349 brands = g_list_prepend (brands, g_strdup (C_("Brand", "Any")));
350 gl_combo_util_set_strings (GTK_COMBO_BOX (this->priv->brand_combo), brands);
351 lgl_db_free_brand_list (brands);
352 gl_combo_util_set_active_text (GTK_COMBO_BOX (this->priv->brand_combo),
355 /* Page size selection control */
356 gl_combo_util_add_text_model (GTK_COMBO_BOX (this->priv->page_size_combo));
357 page_sizes = lgl_db_get_paper_name_list ();
358 page_sizes = g_list_prepend (page_sizes, g_strdup (C_("Page size", "Any")));
359 gl_combo_util_set_strings (GTK_COMBO_BOX (this->priv->page_size_combo), page_sizes);
360 lgl_db_free_paper_name_list (page_sizes);
361 gl_combo_util_set_active_text (GTK_COMBO_BOX (this->priv->page_size_combo),
364 /* Category selection control */
365 gl_combo_util_add_text_model (GTK_COMBO_BOX (this->priv->category_combo));
366 categories = lgl_db_get_category_name_list ();
367 categories = g_list_prepend (categories, g_strdup (C_("Category", "Any")));
368 gl_combo_util_set_strings (GTK_COMBO_BOX (this->priv->category_combo), categories);
369 gl_combo_util_set_active_text (GTK_COMBO_BOX (this->priv->category_combo),
370 C_("Category", "Any"));
371 lgl_db_free_category_name_list (categories);
373 /* Search all treeview */
374 this->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);
375 gtk_tree_view_set_model (GTK_TREE_VIEW (this->priv->search_all_treeview),
376 GTK_TREE_MODEL (this->priv->search_all_store));
377 renderer = gtk_cell_renderer_pixbuf_new ();
378 column = gtk_tree_view_column_new_with_attributes ("", renderer,
379 "pixbuf", PREVIEW_COLUMN,
380 "stock-id", PREVIEW_COLUMN_STOCK,
381 "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
383 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
384 gtk_tree_view_append_column (GTK_TREE_VIEW (this->priv->search_all_treeview), column);
385 renderer = gtk_cell_renderer_text_new ();
386 column = gtk_tree_view_column_new_with_attributes ("", renderer,
387 "markup", DESCRIPTION_COLUMN,
389 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
390 gtk_tree_view_append_column (GTK_TREE_VIEW (this->priv->search_all_treeview), column);
391 search_all_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->search_all_treeview));
392 search_all_names = lgl_db_get_template_name_list_all (NULL, page_size_id, NULL);
393 load_search_all_list (this, this->priv->search_all_store, search_all_selection, search_all_names);
394 lgl_db_free_template_name_list (search_all_names);
396 /* Custom templates treeview */
397 this->priv->custom_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
398 gtk_tree_view_set_model (GTK_TREE_VIEW (this->priv->custom_treeview),
399 GTK_TREE_MODEL (this->priv->custom_store));
400 renderer = gtk_cell_renderer_pixbuf_new ();
401 column = gtk_tree_view_column_new_with_attributes ("", renderer,
402 "pixbuf", PREVIEW_COLUMN,
403 "stock-id", PREVIEW_COLUMN_STOCK,
404 "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
406 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
407 gtk_tree_view_append_column (GTK_TREE_VIEW (this->priv->custom_treeview), column);
408 renderer = gtk_cell_renderer_text_new ();
409 column = gtk_tree_view_column_new_with_attributes ("", renderer,
410 "markup", DESCRIPTION_COLUMN,
412 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
413 gtk_tree_view_append_column (GTK_TREE_VIEW (this->priv->custom_treeview), column);
414 custom_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->custom_treeview));
415 custom_list = lgl_db_get_template_name_list_all (NULL, NULL, "user-defined");
416 load_custom_list (this, this->priv->custom_store, custom_selection, custom_list);
417 lgl_db_free_template_name_list (custom_list);
419 page_size_id = gl_prefs_model_get_default_page_size (gl_prefs);
420 page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
422 /* Connect signals to controls */
423 g_signal_connect_swapped (G_OBJECT (this->priv->brand_combo), "changed",
424 G_CALLBACK (filter_changed_cb),
426 g_signal_connect_swapped (G_OBJECT (this->priv->page_size_combo), "changed",
427 G_CALLBACK (filter_changed_cb),
429 g_signal_connect_swapped (G_OBJECT (this->priv->category_combo), "changed",
430 G_CALLBACK (filter_changed_cb),
432 g_signal_connect (G_OBJECT (recent_selection), "changed",
433 G_CALLBACK (selection_changed_cb),
435 g_signal_connect (G_OBJECT (search_all_selection), "changed",
436 G_CALLBACK (selection_changed_cb),
438 g_signal_connect (G_OBJECT (custom_selection), "changed",
439 G_CALLBACK (selection_changed_cb),
441 g_signal_connect (G_OBJECT (this->priv->custom_add_button), "clicked",
442 G_CALLBACK (custom_add_clicked_cb),
444 g_signal_connect (G_OBJECT (this->priv->custom_edit_button), "clicked",
445 G_CALLBACK (custom_edit_clicked_cb),
447 g_signal_connect (G_OBJECT (this->priv->custom_delete_button), "clicked",
448 G_CALLBACK (custom_delete_clicked_cb),
450 g_signal_connect (G_OBJECT (this->priv->notebook), "switch-page",
451 G_CALLBACK (page_changed_cb),
454 g_free (page_size_name);
458 gtk_notebook_set_current_page (GTK_NOTEBOOK (this->priv->notebook),
459 this->priv->recent_page_num);
463 gtk_notebook_set_current_page (GTK_NOTEBOOK (this->priv->notebook),
464 this->priv->search_all_page_num);
466 gl_template_history_model_free_name_list (recent_list);
468 this->priv->db_notify_id = lgl_db_notify_add ((lglDbNotifyFunc)db_changed_cb, this);
470 gl_debug (DEBUG_MEDIA_SELECT, "END");
474 /*--------------------------------------------------------------------------*/
475 /* PRIVATE. modify widget due to change in selection */
476 /*--------------------------------------------------------------------------*/
478 filter_changed_cb (glMediaSelect *this)
481 gchar *page_size_name, *page_size_id;
482 gchar *category_name, *category_id;
483 GList *search_all_names;
484 GtkTreeSelection *selection;
486 gl_debug (DEBUG_MEDIA_SELECT, "START");
489 this->priv->stop_signals = TRUE;
491 /* Update template selections for new filter settings */
492 brand = gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->brand_combo));
493 page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->page_size_combo));
494 category_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->category_combo));
495 if ( brand && strlen(brand) &&
496 page_size_name && strlen(page_size_name) &&
497 category_name && strlen(category_name) )
499 gl_debug (DEBUG_MEDIA_SELECT, "brand = \"%s\"", brand);
500 gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = \"%s\"", page_size_name);
501 gl_debug (DEBUG_MEDIA_SELECT, "category_name = \"%s\"", category_name);
502 if (!g_utf8_collate (brand, C_("Brand", "Any")))
507 page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
508 category_id = lgl_db_lookup_category_id_from_name (category_name);
509 gl_debug (DEBUG_MEDIA_SELECT, "page_size_id = \"%s\"", page_size_id);
510 gl_debug (DEBUG_MEDIA_SELECT, "category_id = \"%s\"", category_id);
511 search_all_names = lgl_db_get_template_name_list_all (brand, page_size_id, category_id);
512 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->search_all_treeview));
513 load_search_all_list (this, this->priv->search_all_store, selection, search_all_names);
514 lgl_db_free_template_name_list (search_all_names);
515 g_free (page_size_id);
516 g_free (category_id);
518 /* Emit our "changed" signal */
519 g_signal_emit (G_OBJECT (this), signals[CHANGED], 0);
522 g_free (page_size_name);
523 g_free (category_name);
526 this->priv->stop_signals = FALSE;
528 gl_debug (DEBUG_MEDIA_SELECT, "END");
532 /*--------------------------------------------------------------------------*/
533 /* PRIVATE. modify widget due to change in selection */
534 /*--------------------------------------------------------------------------*/
536 selection_changed_cb (GtkTreeSelection *selection,
539 glMediaSelect *this = GL_MEDIA_SELECT (user_data);
540 GtkTreeSelection *custom_selection;
542 if (this->priv->stop_signals) return;
544 gl_debug (DEBUG_MEDIA_SELECT, "START");
546 custom_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->custom_treeview));
547 gtk_widget_set_sensitive (GTK_WIDGET (this->priv->custom_edit_button),
548 gtk_tree_selection_get_mode (custom_selection) != GTK_SELECTION_NONE );
549 gtk_widget_set_sensitive (GTK_WIDGET (this->priv->custom_delete_button),
550 gtk_tree_selection_get_mode (custom_selection) != GTK_SELECTION_NONE );
552 /* Emit our "changed" signal */
553 g_signal_emit (G_OBJECT (user_data), signals[CHANGED], 0);
555 gl_debug (DEBUG_MEDIA_SELECT, "END");
559 /*--------------------------------------------------------------------------*/
560 /* PRIVATE. Custom add button clicked callback. */
561 /*--------------------------------------------------------------------------*/
563 custom_add_clicked_cb (GtkButton *button,
566 glMediaSelect *this = GL_MEDIA_SELECT (user_data);
570 window = gtk_widget_get_toplevel (GTK_WIDGET (this));
572 dialog = gl_template_designer_new (GTK_WINDOW (window));
574 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
575 gtk_widget_show (dialog);
579 /*--------------------------------------------------------------------------*/
580 /* PRIVATE. Custom edit button clicked callback. */
581 /*--------------------------------------------------------------------------*/
583 custom_edit_clicked_cb (GtkButton *button,
586 glMediaSelect *this = GL_MEDIA_SELECT (user_data);
587 GtkTreeSelection *selection;
594 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->custom_treeview));
596 if (!gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
598 gtk_tree_selection_get_selected (selection, &model, &iter);
599 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
601 window = gtk_widget_get_toplevel (GTK_WIDGET (this));
603 dialog = gl_template_designer_new (GTK_WINDOW (window));
604 gl_template_designer_set_from_name (GL_TEMPLATE_DESIGNER (dialog), name);
606 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
607 gtk_widget_show (dialog);
614 /*--------------------------------------------------------------------------*/
615 /* PRIVATE. Custom delete button clicked callback. */
616 /*--------------------------------------------------------------------------*/
618 custom_delete_clicked_cb (GtkButton *button,
621 glMediaSelect *this = GL_MEDIA_SELECT (user_data);
622 GtkTreeSelection *selection;
627 this->priv->stop_signals = TRUE;
629 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->custom_treeview));
631 if (!gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
633 gtk_tree_selection_get_selected (selection, &model, &iter);
634 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
636 lgl_db_delete_template_by_name (name);
637 gl_mini_preview_pixbuf_cache_delete_by_name (name);
642 this->priv->stop_signals = FALSE;
646 /*--------------------------------------------------------------------------*/
647 /* PRIVATE. modify widget due to change in selection */
648 /*--------------------------------------------------------------------------*/
650 page_changed_cb (GtkNotebook *notebook,
655 glMediaSelect *this = GL_MEDIA_SELECT (user_data);
657 if (this->priv->stop_signals) return;
659 gl_debug (DEBUG_MEDIA_SELECT, "START");
662 * Store new current page, because this signal is emitted before the actual page change.
664 this->priv->current_page_num = page_num;
666 /* Emit our "changed" signal */
667 g_signal_emit (G_OBJECT (user_data), signals[CHANGED], 0);
669 gl_debug (DEBUG_MEDIA_SELECT, "END");
673 /*--------------------------------------------------------------------------*/
674 /* PRIVATE. DB changed notification callback. */
675 /*--------------------------------------------------------------------------*/
677 db_changed_cb (glMediaSelect *this)
680 gchar *page_size_name, *page_size_id;
681 gchar *category_name, *category_id;
682 GtkTreeSelection *selection;
685 this->priv->stop_signals = TRUE;
687 /* Update recent page. */
688 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->recent_treeview));
689 list = gl_template_history_model_get_name_list (gl_template_history);
690 load_recent_list (this, this->priv->recent_store, selection, list);
691 lgl_db_free_template_name_list (list);
693 /* Update search all page. */
694 brand = gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->brand_combo));
695 page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->page_size_combo));
696 category_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->category_combo));
697 if ( brand && strlen(brand) &&
698 page_size_name && strlen(page_size_name) &&
699 category_name && strlen(category_name) )
701 if (!g_utf8_collate (brand, C_("Brand", "Any")))
706 page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
707 category_id = lgl_db_lookup_category_id_from_name (category_name);
708 list = lgl_db_get_template_name_list_all (brand, page_size_id, category_id);
709 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->search_all_treeview));
710 load_search_all_list (this, this->priv->search_all_store, selection, list);
711 lgl_db_free_template_name_list (list);
712 g_free (page_size_id);
713 g_free (category_id);
716 g_free (page_size_name);
717 g_free (category_name);
719 /* Update custom page. */
720 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->custom_treeview));
721 list = lgl_db_get_template_name_list_all (NULL, NULL, "user-defined");
722 load_custom_list (this, this->priv->custom_store, selection, list);
723 lgl_db_free_template_name_list (list);
725 this->priv->stop_signals = FALSE;
727 /* Emit our "changed" signal */
728 g_signal_emit (G_OBJECT (this), signals[CHANGED], 0);
730 filter_changed_cb (this);
734 /****************************************************************************/
735 /* query selected label template name. */
736 /****************************************************************************/
738 gl_media_select_get_name (glMediaSelect *this)
741 GtkTreeSelection *selection;
746 gl_debug (DEBUG_MEDIA_SELECT, "START");
748 page_num = this->priv->current_page_num;
749 if (page_num == this->priv->recent_page_num)
751 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->recent_treeview));
753 else if (page_num == this->priv->search_all_page_num)
755 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->search_all_treeview));
757 else if (page_num == this->priv->custom_page_num)
759 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->custom_treeview));
763 g_print ("notebook page = %d\n", page_num);
764 g_assert_not_reached ();
767 if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
773 gtk_tree_selection_get_selected (selection, &model, &iter);
774 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
777 gl_debug (DEBUG_MEDIA_SELECT, "END");
782 /****************************************************************************/
783 /* set selected label template name. */
784 /****************************************************************************/
786 gl_media_select_set_name (glMediaSelect *this,
789 GtkTreeSelection *selection;
796 gl_debug (DEBUG_MEDIA_SELECT, "START");
798 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->search_all_treeview));
799 g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
801 model = GTK_TREE_MODEL (this->priv->search_all_store);
803 for ( flag = gtk_tree_model_get_iter_first (model, &iter);
805 flag = gtk_tree_model_iter_next(model, &iter) )
807 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name_i, -1);
808 if (strcasecmp(name, name_i) == 0)
810 gtk_tree_selection_select_iter (selection, &iter);
811 path = gtk_tree_model_get_path (model, &iter);
812 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (this->priv->search_all_treeview),
816 gtk_tree_path_free (path);
821 gl_debug (DEBUG_MEDIA_SELECT, "END");
825 /****************************************************************************/
826 /* query current filter parameters. */
827 /****************************************************************************/
829 gl_media_select_get_filter_parameters (glMediaSelect *this,
830 gchar **page_size_id,
833 gchar *page_size_name, *category_name;
835 gl_debug (DEBUG_MEDIA_SELECT, "");
837 g_free (*page_size_id);
838 g_free (*category_id);
841 gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->page_size_combo));
843 *page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
846 gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->category_combo));
848 *category_id = lgl_db_lookup_category_id_from_name (category_name);
850 g_free (page_size_name);
851 g_free (category_name);
855 /****************************************************************************/
856 /* set filter parameters. */
857 /****************************************************************************/
859 gl_media_select_set_filter_parameters (glMediaSelect *this,
860 const gchar *page_size_id,
861 const gchar *category_id)
863 gchar *page_size_name;
864 gchar *category_name;
866 gl_debug (DEBUG_MEDIA_SELECT, "START");
868 page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
869 if (page_size_name == NULL)
871 page_size_name = g_strdup (C_("Page size", "Any"));
874 gl_combo_util_set_active_text (GTK_COMBO_BOX (this->priv->page_size_combo),
877 category_name = lgl_db_lookup_category_name_from_id (category_id);
878 if (category_name == NULL)
880 category_name = g_strdup (C_("Category", "Any"));
883 gl_combo_util_set_active_text (GTK_COMBO_BOX (this->priv->category_combo),
885 g_free (page_size_name);
886 g_free (category_name);
888 gl_debug (DEBUG_MEDIA_SELECT, "END");
892 /*--------------------------------------------------------------------------*/
893 /* PRIVATE. Load list store from template name list. */
894 /*--------------------------------------------------------------------------*/
896 load_recent_list (glMediaSelect *this,
898 GtkTreeSelection *selection,
904 lglTemplate *template;
905 lglTemplateFrame *frame;
911 gl_debug (DEBUG_MEDIA_SELECT, "START");
913 gtk_list_store_clear (store);
916 if ( this->priv->recent_info_bar )
918 gtk_container_remove (GTK_CONTAINER (this->priv->recent_info_vbox),
919 this->priv->recent_info_bar);
920 this->priv->recent_info_bar = NULL;
926 units = gl_prefs_model_get_units (gl_prefs);
928 for ( p=list; p!=NULL; p=p->next )
931 gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
933 template = lgl_db_lookup_template_from_name (p->data);
934 frame = (lglTemplateFrame *)template->frames->data;
935 pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
937 size = lgl_template_frame_get_size_description (frame, units);
938 layout = lgl_template_frame_get_layout_description (frame);
939 description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
941 template->description,
947 lgl_template_free (template);
949 gtk_list_store_append (store, &iter);
950 gtk_list_store_set (store, &iter,
951 NAME_COLUMN, p->data,
952 PREVIEW_COLUMN, pixbuf,
953 DESCRIPTION_COLUMN, description,
956 g_object_unref (G_OBJECT (pixbuf));
957 g_free (description);
960 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
961 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
962 gtk_tree_selection_select_iter (selection, &iter);
967 this->priv->recent_info_bar = gl_message_bar_new (GTK_MESSAGE_INFO, GTK_BUTTONS_NONE,
968 "%s", _("No recent templates found."));
969 gl_message_bar_format_secondary_text (GL_MESSAGE_BAR (this->priv->recent_info_bar),
970 "%s", _("Try selecting a template in the \"Search all\" tab."));
972 gtk_box_pack_start (GTK_BOX (this->priv->recent_info_vbox),
973 this->priv->recent_info_bar,
975 gtk_widget_show_all (this->priv->recent_info_bar);
977 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
981 gl_debug (DEBUG_MEDIA_SELECT, "END");
985 /*--------------------------------------------------------------------------*/
986 /* PRIVATE. Load list store from template name list. */
987 /*--------------------------------------------------------------------------*/
989 load_search_all_list (glMediaSelect *this,
991 GtkTreeSelection *selection,
997 lglTemplate *template;
998 lglTemplateFrame *frame;
1004 gl_debug (DEBUG_MEDIA_SELECT, "START");
1006 gtk_list_store_clear (store);
1008 if ( this->priv->search_all_info_bar )
1010 gtk_container_remove (GTK_CONTAINER (this->priv->search_all_info_vbox),
1011 this->priv->search_all_info_bar);
1012 this->priv->search_all_info_bar = NULL;
1018 units = gl_prefs_model_get_units (gl_prefs);
1020 for ( p=list; p!=NULL; p=p->next )
1023 gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
1025 template = lgl_db_lookup_template_from_name (p->data);
1026 frame = (lglTemplateFrame *)template->frames->data;
1027 pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
1029 size = lgl_template_frame_get_size_description (frame, units);
1030 layout = lgl_template_frame_get_layout_description (frame);
1031 description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
1033 template->description,
1039 lgl_template_free (template);
1041 gtk_list_store_append (store, &iter);
1042 gtk_list_store_set (store, &iter,
1043 NAME_COLUMN, p->data,
1044 PREVIEW_COLUMN, pixbuf,
1045 DESCRIPTION_COLUMN, description,
1048 g_object_unref (G_OBJECT (pixbuf));
1049 g_free (description);
1052 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
1053 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
1054 gtk_tree_selection_select_iter (selection, &iter);
1059 /* Translators: "No match" means that for the given template search criteria, there
1060 * were no matches found. */
1061 this->priv->search_all_info_bar = gl_message_bar_new (GTK_MESSAGE_INFO, GTK_BUTTONS_NONE, "%s", _("No match."));
1062 gl_message_bar_format_secondary_text (GL_MESSAGE_BAR (this->priv->search_all_info_bar),
1063 "%s", _("Try selecting a different brand, page size or category."));
1065 gtk_box_pack_start (GTK_BOX (this->priv->search_all_info_vbox),
1066 this->priv->search_all_info_bar,
1068 gtk_widget_show_all (this->priv->search_all_info_bar);
1070 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
1074 gl_debug (DEBUG_MEDIA_SELECT, "END");
1078 /*--------------------------------------------------------------------------*/
1079 /* PRIVATE. Load list store from template name list. */
1080 /*--------------------------------------------------------------------------*/
1082 load_custom_list (glMediaSelect *this,
1083 GtkListStore *store,
1084 GtkTreeSelection *selection,
1090 lglTemplate *template;
1091 lglTemplateFrame *frame;
1097 gl_debug (DEBUG_MEDIA_SELECT, "START");
1099 gtk_list_store_clear (store);
1102 if ( this->priv->custom_info_bar )
1104 gtk_container_remove (GTK_CONTAINER (this->priv->custom_info_vbox),
1105 this->priv->custom_info_bar);
1106 this->priv->custom_info_bar = NULL;
1112 units = gl_prefs_model_get_units (gl_prefs);
1114 for ( p=list; p!=NULL; p=p->next )
1117 gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
1119 template = lgl_db_lookup_template_from_name (p->data);
1120 frame = (lglTemplateFrame *)template->frames->data;
1121 pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
1123 size = lgl_template_frame_get_size_description (frame, units);
1124 layout = lgl_template_frame_get_layout_description (frame);
1125 description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
1127 template->description,
1133 lgl_template_free (template);
1135 gtk_list_store_append (store, &iter);
1136 gtk_list_store_set (store, &iter,
1137 NAME_COLUMN, p->data,
1138 PREVIEW_COLUMN, pixbuf,
1139 DESCRIPTION_COLUMN, description,
1142 g_object_unref (G_OBJECT (pixbuf));
1143 g_free (description);
1146 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
1147 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
1148 gtk_tree_selection_select_iter (selection, &iter);
1150 gtk_widget_set_sensitive (GTK_WIDGET (this->priv->custom_edit_button), TRUE);
1151 gtk_widget_set_sensitive (GTK_WIDGET (this->priv->custom_delete_button), TRUE);
1155 this->priv->custom_info_bar = gl_message_bar_new (GTK_MESSAGE_INFO,
1157 "%s", _("No custom templates found."));
1158 gl_message_bar_format_secondary_text (GL_MESSAGE_BAR (this->priv->custom_info_bar),
1159 "%s", _("You may create new templates or try searching for pre-defined templates in the \"Search all\" tab."));
1161 gtk_box_pack_start (GTK_BOX (this->priv->custom_info_vbox),
1162 this->priv->custom_info_bar,
1164 gtk_widget_show_all (this->priv->custom_info_bar);
1166 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
1168 gtk_widget_set_sensitive (GTK_WIDGET (this->priv->custom_edit_button), FALSE);
1169 gtk_widget_set_sensitive (GTK_WIDGET (this->priv->custom_delete_button), FALSE);
1172 gl_debug (DEBUG_MEDIA_SELECT, "END");
1178 * Local Variables: -- emacs
1180 * c-basic-offset: 8 -- emacs
1181 * tab-width: 8 -- emacs
1182 * indent-tabs-mode: nil -- emacs