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 * template-designer.c: Template designer module
8 * Copyright (C) 2003 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
26 #include "template-designer.h"
28 #include <glib/gi18n.h>
29 #include <glade/glade-xml.h>
30 #include <libgnome/gnome-program.h>
31 #include <gtk/gtktogglebutton.h>
32 #include <gtk/gtkcombobox.h>
33 #include <gtk/gtkspinbutton.h>
34 #include <gtk/gtklabel.h>
39 #include <libglabels/paper.h>
40 #include <libglabels/template.h>
41 #include "wdgt-mini-preview.h"
46 /*========================================================*/
47 /* Private macros and constants. */
48 /*========================================================*/
49 #define ICON_PIXMAP gnome_program_locate_file (NULL,\
50 GNOME_FILE_DOMAIN_APP_PIXMAP,\
54 #define EX_RECT_IMAGE gnome_program_locate_file (NULL,\
55 GNOME_FILE_DOMAIN_APP_PIXMAP,\
56 "glabels/ex-rect-size.png",\
59 #define EX_ROUND_IMAGE gnome_program_locate_file (NULL,\
60 GNOME_FILE_DOMAIN_APP_PIXMAP,\
61 "glabels/ex-round-size.png",\
64 #define EX_CD_IMAGE gnome_program_locate_file (NULL,\
65 GNOME_FILE_DOMAIN_APP_PIXMAP,\
66 "glabels/ex-cd-size.png",\
69 #define EX_NLAYOUTS_IMAGE1 gnome_program_locate_file (NULL,\
70 GNOME_FILE_DOMAIN_APP_PIXMAP,\
71 "glabels/ex-1layout.png",\
74 #define EX_NLAYOUTS_IMAGE2 gnome_program_locate_file (NULL,\
75 GNOME_FILE_DOMAIN_APP_PIXMAP,\
76 "glabels/ex-2layouts.png",\
79 #define DEFAULT_MARGIN 9.0
81 #define DEFAULT_RECT_W 252.0
82 #define DEFAULT_RECT_H 144.0
83 #define DEFAULT_RECT_R 0.0
84 #define DEFAULT_RECT_WASTE 0.0 /* Should never exceed 1/2 the distance between items. */
86 #define DEFAULT_ROUND_R 72.0
87 #define DEFAULT_ROUND_WASTE 0.0 /* Should never exceed 1/2 the distance between items. */
89 #define DEFAULT_CD_RADIUS 166.5
90 #define DEFAULT_CD_HOLE 58.5
91 #define DEFAULT_CD_WASTE 9.0 /* Should never exceed 1/2 the distance between items. */
94 #define MAX_PAGE_DIM_POINTS 5000.0
96 /*========================================================*/
98 /*========================================================*/
100 struct _glTemplateDesignerPrivate
102 /* Assistant pages */
103 GtkWidget *start_page;
104 GtkWidget *name_page;
105 GtkWidget *pg_size_page;
106 GtkWidget *shape_page;
107 GtkWidget *rect_size_page;
108 GtkWidget *round_size_page;
109 GtkWidget *cd_size_page;
110 GtkWidget *nlayouts_page;
111 GtkWidget *layout_page;
112 GtkWidget *finish_page;
114 /* Name page controls */
115 GtkWidget *brand_entry;
116 GtkWidget *part_num_entry;
117 GtkWidget *description_entry;
119 /* Page size page controls */
120 GtkWidget *pg_size_combo;
121 GtkWidget *pg_w_spin;
122 GtkWidget *pg_h_spin;
123 GtkWidget *pg_w_units_label;
124 GtkWidget *pg_h_units_label;
126 /* Shape page controls */
127 GtkWidget *shape_rect_radio;
128 GtkWidget *shape_round_radio;
129 GtkWidget *shape_cd_radio;
131 /* Label size (rectangular) page controls */
132 GtkWidget *rect_image;
133 GtkWidget *rect_w_spin;
134 GtkWidget *rect_h_spin;
135 GtkWidget *rect_r_spin;
136 GtkWidget *rect_x_waste_spin;
137 GtkWidget *rect_y_waste_spin;
138 GtkWidget *rect_margin_spin;
139 GtkWidget *rect_w_units_label;
140 GtkWidget *rect_h_units_label;
141 GtkWidget *rect_r_units_label;
142 GtkWidget *rect_x_waste_units_label;
143 GtkWidget *rect_y_waste_units_label;
144 GtkWidget *rect_margin_units_label;
146 /* Label size (round) page controls */
147 GtkWidget *round_image;
148 GtkWidget *round_r_spin;
149 GtkWidget *round_waste_spin;
150 GtkWidget *round_margin_spin;
151 GtkWidget *round_r_units_label;
152 GtkWidget *round_waste_units_label;
153 GtkWidget *round_margin_units_label;
155 /* Label size (cd) page controls */
157 GtkWidget *cd_radius_spin;
158 GtkWidget *cd_hole_spin;
159 GtkWidget *cd_w_spin;
160 GtkWidget *cd_h_spin;
161 GtkWidget *cd_waste_spin;
162 GtkWidget *cd_margin_spin;
163 GtkWidget *cd_radius_units_label;
164 GtkWidget *cd_hole_units_label;
165 GtkWidget *cd_w_units_label;
166 GtkWidget *cd_h_units_label;
167 GtkWidget *cd_waste_units_label;
168 GtkWidget *cd_margin_units_label;
170 /* Number of layouts controls */
171 GtkWidget *nlayouts_image1;
172 GtkWidget *nlayouts_image2;
173 GtkWidget *nlayouts_spin;
175 /* Layout page controls */
176 GtkWidget *layout1_head_label;
177 GtkWidget *layout1_nx_spin;
178 GtkWidget *layout1_ny_spin;
179 GtkWidget *layout1_x0_spin;
180 GtkWidget *layout1_y0_spin;
181 GtkWidget *layout1_dx_spin;
182 GtkWidget *layout1_dy_spin;
183 GtkWidget *layout2_head_label;
184 GtkWidget *layout2_nx_spin;
185 GtkWidget *layout2_ny_spin;
186 GtkWidget *layout2_x0_spin;
187 GtkWidget *layout2_y0_spin;
188 GtkWidget *layout2_dx_spin;
189 GtkWidget *layout2_dy_spin;
190 GtkWidget *layout_x0_units_label;
191 GtkWidget *layout_y0_units_label;
192 GtkWidget *layout_dx_units_label;
193 GtkWidget *layout_dy_units_label;
194 GtkWidget *layout_mini_preview;
195 GtkWidget *layout_test_button;
197 /* Units related stuff */
198 const gchar *units_string;
199 gdouble units_per_point;
205 /* Page numbers for traversing GtkAssistant */
219 /*========================================================*/
220 /* Private globals. */
221 /*========================================================*/
223 static GtkAssistantClass* parent_class = NULL;
225 /*========================================================*/
226 /* Private function prototypes. */
227 /*========================================================*/
229 static void gl_template_designer_class_init (glTemplateDesignerClass *klass);
230 static void gl_template_designer_init (glTemplateDesigner *dlg);
231 static void gl_template_designer_finalize (GObject *object);
232 static void gl_template_designer_construct (glTemplateDesigner *dlg);
234 static void construct_start_page (glTemplateDesigner *dlg,
237 static void construct_name_page (glTemplateDesigner *dlg,
240 static void construct_pg_size_page (glTemplateDesigner *dlg,
243 static void construct_shape_page (glTemplateDesigner *dlg,
246 static void construct_rect_size_page (glTemplateDesigner *dlg,
249 static void construct_round_size_page (glTemplateDesigner *dlg,
252 static void construct_cd_size_page (glTemplateDesigner *dlg,
255 static void construct_nlayouts_page (glTemplateDesigner *dlg,
258 static void construct_layout_page (glTemplateDesigner *dlg,
261 static void construct_finish_page (glTemplateDesigner *dlg,
264 static void cancel_cb (glTemplateDesigner *dlg);
265 static void apply_cb (glTemplateDesigner *dlg);
266 static void close_cb (glTemplateDesigner *dlg);
267 static void prepare_cb (glTemplateDesigner *dlg,
270 static gint forward_page_function (gint current_page,
273 static void name_page_changed_cb (glTemplateDesigner *dlg);
275 static void pg_size_page_changed_cb (glTemplateDesigner *dlg);
277 static void rect_size_page_prepare_cb (glTemplateDesigner *dlg);
279 static void round_size_page_prepare_cb (glTemplateDesigner *dlg);
281 static void cd_size_page_prepare_cb (glTemplateDesigner *dlg);
283 static void layout_page_prepare_cb (glTemplateDesigner *dlg);
285 static void layout_page_changed_cb (glTemplateDesigner *dlg);
287 static void print_test_cb (glTemplateDesigner *dlg);
289 static glTemplate *build_template (glTemplateDesigner *dlg);
292 /*****************************************************************************/
293 /* Boilerplate object stuff. */
294 /*****************************************************************************/
296 gl_template_designer_get_type (void)
298 static GType type = 0;
302 static const GTypeInfo info =
304 sizeof (glTemplateDesignerClass),
305 NULL, /* base_init */
306 NULL, /* base_finalize */
307 (GClassInitFunc) gl_template_designer_class_init,
308 NULL, /* class_finalize */
309 NULL, /* class_data */
310 sizeof (glTemplateDesigner),
312 (GInstanceInitFunc) gl_template_designer_init,
316 type = g_type_register_static (GTK_TYPE_ASSISTANT,
317 "glTemplateDesigner", &info, 0);
324 gl_template_designer_class_init (glTemplateDesignerClass *klass)
326 GObjectClass *object_class = G_OBJECT_CLASS (klass);
328 gl_debug (DEBUG_TEMPLATE, "");
330 parent_class = g_type_class_peek_parent (klass);
332 object_class->finalize = gl_template_designer_finalize;
336 gl_template_designer_init (glTemplateDesigner *dialog)
338 gl_debug (DEBUG_TEMPLATE, "START");
340 dialog->priv = g_new0 (glTemplateDesignerPrivate, 1);
342 gl_debug (DEBUG_TEMPLATE, "END");
348 gl_template_designer_finalize (GObject *object)
350 glTemplateDesigner* dialog;
352 gl_debug (DEBUG_TEMPLATE, "START");
354 g_return_if_fail (object != NULL);
356 dialog = GL_TEMPLATE_DESIGNER (object);
358 g_return_if_fail (GL_IS_TEMPLATE_DESIGNER (dialog));
359 g_return_if_fail (dialog->priv != NULL);
361 G_OBJECT_CLASS (parent_class)->finalize (object);
363 g_free (dialog->priv);
365 gl_debug (DEBUG_TEMPLATE, "END");
368 /*****************************************************************************/
369 /* NEW preferences dialog. */
370 /*****************************************************************************/
372 gl_template_designer_new (GtkWindow *parent)
376 gl_debug (DEBUG_TEMPLATE, "START");
378 dialog = GTK_WIDGET (g_object_new (GL_TYPE_TEMPLATE_DESIGNER, NULL));
381 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
383 gl_template_designer_construct (GL_TEMPLATE_DESIGNER(dialog));
386 gl_debug (DEBUG_TEMPLATE, "END");
391 /*---------------------------------------------------------------------------*/
392 /* PRIVATE. Construct composite widget. */
393 /*---------------------------------------------------------------------------*/
395 gl_template_designer_construct (glTemplateDesigner *dialog)
399 g_return_if_fail (dialog && GL_IS_TEMPLATE_DESIGNER (dialog));
400 g_return_if_fail (dialog->priv != NULL);
402 /* Initialize units stuff from prefs */
403 dialog->priv->units_string = gl_prefs_get_units_string ();
404 dialog->priv->units_per_point = gl_prefs_get_units_per_point ();
405 dialog->priv->climb_rate = gl_prefs_get_units_step_size ();
406 dialog->priv->digits = gl_prefs_get_units_precision ();
408 gtk_window_set_title (GTK_WINDOW(dialog), _("gLabels Template Designer"));
410 logo = gdk_pixbuf_new_from_file (ICON_PIXMAP, NULL);
412 /* Costruct and append pages (must be same order as PAGE_NUM enums. */
413 construct_start_page (dialog, logo);
414 construct_name_page (dialog, logo);
415 construct_pg_size_page (dialog, logo);
416 construct_shape_page (dialog, logo);
417 construct_rect_size_page (dialog, logo);
418 construct_round_size_page (dialog, logo);
419 construct_cd_size_page (dialog, logo);
420 construct_nlayouts_page (dialog, logo);
421 construct_layout_page (dialog, logo);
422 construct_finish_page (dialog, logo);
424 gtk_assistant_set_forward_page_func (GTK_ASSISTANT (dialog),
425 forward_page_function,
430 g_signal_connect_swapped (G_OBJECT(dialog), "cancel",
431 G_CALLBACK(cancel_cb), dialog);
432 g_signal_connect_swapped (G_OBJECT(dialog), "apply",
433 G_CALLBACK(apply_cb), dialog);
434 g_signal_connect_swapped (G_OBJECT(dialog), "close",
435 G_CALLBACK(close_cb), dialog);
436 g_signal_connect (G_OBJECT(dialog), "prepare",
437 G_CALLBACK(prepare_cb), NULL);
439 gtk_widget_show_all (GTK_WIDGET(dialog));
442 /*--------------------------------------------------------------------------*/
443 /* PRIVATE. Construct start page. */
444 /*--------------------------------------------------------------------------*/
446 construct_start_page (glTemplateDesigner *dialog,
451 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
455 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
459 dialog->priv->start_page = glade_xml_get_widget (gui, "start_page");
461 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
462 dialog->priv->start_page);
464 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
465 dialog->priv->start_page,
467 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
468 dialog->priv->start_page,
470 gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
471 dialog->priv->start_page,
472 GTK_ASSISTANT_PAGE_INTRO);
473 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
474 dialog->priv->start_page,
478 /*--------------------------------------------------------------------------*/
479 /* PRIVATE. Construct name page. */
480 /*--------------------------------------------------------------------------*/
482 construct_name_page (glTemplateDesigner *dialog,
487 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
491 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
495 dialog->priv->name_page = glade_xml_get_widget (gui, "name_page");
496 dialog->priv->brand_entry = glade_xml_get_widget (gui, "brand_entry");
497 dialog->priv->part_num_entry = glade_xml_get_widget (gui, "part_num_entry");
498 dialog->priv->description_entry = glade_xml_get_widget (gui, "description_entry");
500 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
501 dialog->priv->name_page);
503 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
504 dialog->priv->name_page,
505 _("Name and Description"));
506 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
507 dialog->priv->name_page,
510 /* Connect a handler that listens for changes in these widgets */
511 /* This controls whether we can progress to the next page. */
512 g_signal_connect_swapped (G_OBJECT(dialog->priv->brand_entry), "changed",
513 G_CALLBACK(name_page_changed_cb), dialog);
514 g_signal_connect_swapped (G_OBJECT(dialog->priv->part_num_entry), "changed",
515 G_CALLBACK(name_page_changed_cb), dialog);
516 g_signal_connect_swapped (G_OBJECT(dialog->priv->description_entry), "changed",
517 G_CALLBACK(name_page_changed_cb), dialog);
521 /*--------------------------------------------------------------------------*/
522 /* PRIVATE. Construct page size page. */
523 /*--------------------------------------------------------------------------*/
525 construct_pg_size_page (glTemplateDesigner *dialog,
530 const gchar *default_page_size_id;
531 gchar *default_page_size_name;
533 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
534 "pg_size_page", NULL);
537 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
541 dialog->priv->pg_size_page = glade_xml_get_widget (gui, "pg_size_page");
542 dialog->priv->pg_size_combo = glade_xml_get_widget (gui, "pg_size_combo");
543 dialog->priv->pg_w_spin = glade_xml_get_widget (gui, "pg_w_spin");
544 dialog->priv->pg_h_spin = glade_xml_get_widget (gui, "pg_h_spin");
545 dialog->priv->pg_w_units_label = glade_xml_get_widget (gui, "pg_w_units_label");
546 dialog->priv->pg_h_units_label = glade_xml_get_widget (gui, "pg_h_units_label");
548 gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
550 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
551 dialog->priv->pg_size_page);
553 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
554 dialog->priv->pg_size_page,
556 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
557 dialog->priv->pg_size_page,
559 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
560 dialog->priv->pg_size_page,
563 /* Load page size combo */
564 page_sizes = gl_paper_get_name_list ();
565 gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->pg_size_combo), page_sizes);
566 gl_paper_free_name_list (page_sizes);
567 default_page_size_id = gl_prefs_get_page_size ();
568 default_page_size_name = gl_paper_lookup_name_from_id (default_page_size_id);
569 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), default_page_size_name);
570 g_free (default_page_size_name);
572 /* Apply units to spinbuttons and units labels. */
573 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
574 dialog->priv->digits);
575 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
576 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
577 gtk_label_set_text (GTK_LABEL(dialog->priv->pg_w_units_label),
578 dialog->priv->units_string);
579 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_w_spin),
580 0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
581 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
582 dialog->priv->digits);
583 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
584 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
585 gtk_label_set_text (GTK_LABEL(dialog->priv->pg_h_units_label),
586 dialog->priv->units_string);
587 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_h_spin),
588 0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
590 /* Connect a handler that listens for changes in these widgets */
591 /* This controls sensitivity of related widgets. */
592 g_signal_connect_swapped (G_OBJECT(dialog->priv->pg_size_combo), "changed",
593 G_CALLBACK(pg_size_page_changed_cb), dialog);
596 /*--------------------------------------------------------------------------*/
597 /* PRIVATE. Construct shape page. */
598 /*--------------------------------------------------------------------------*/
600 construct_shape_page (glTemplateDesigner *dialog,
605 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
609 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
613 dialog->priv->shape_page = glade_xml_get_widget (gui, "shape_page");
614 dialog->priv->shape_rect_radio = glade_xml_get_widget (gui, "shape_rect_radio");
615 dialog->priv->shape_round_radio = glade_xml_get_widget (gui, "shape_round_radio");
616 dialog->priv->shape_cd_radio = glade_xml_get_widget (gui, "shape_cd_radio");
618 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
619 dialog->priv->shape_page);
621 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
622 dialog->priv->shape_page,
623 _("Label or Card Shape"));
624 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
625 dialog->priv->shape_page,
627 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
628 dialog->priv->shape_page,
632 /*--------------------------------------------------------------------------*/
633 /* PRIVATE. Construct rect size page. */
634 /*--------------------------------------------------------------------------*/
636 construct_rect_size_page (glTemplateDesigner *dialog,
642 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
643 "rect_size_page", NULL);
646 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
650 dialog->priv->rect_size_page = glade_xml_get_widget (gui, "rect_size_page");
651 dialog->priv->rect_image = glade_xml_get_widget (gui, "rect_image");
652 dialog->priv->rect_w_spin = glade_xml_get_widget (gui, "rect_w_spin");
653 dialog->priv->rect_h_spin = glade_xml_get_widget (gui, "rect_h_spin");
654 dialog->priv->rect_r_spin = glade_xml_get_widget (gui, "rect_r_spin");
655 dialog->priv->rect_x_waste_spin = glade_xml_get_widget (gui, "rect_x_waste_spin");
656 dialog->priv->rect_y_waste_spin = glade_xml_get_widget (gui, "rect_y_waste_spin");
657 dialog->priv->rect_margin_spin = glade_xml_get_widget (gui, "rect_margin_spin");
658 dialog->priv->rect_w_units_label = glade_xml_get_widget (gui, "rect_w_units_label");
659 dialog->priv->rect_h_units_label = glade_xml_get_widget (gui, "rect_h_units_label");
660 dialog->priv->rect_r_units_label = glade_xml_get_widget (gui, "rect_r_units_label");
661 dialog->priv->rect_x_waste_units_label = glade_xml_get_widget (gui, "rect_x_waste_units_label");
662 dialog->priv->rect_y_waste_units_label = glade_xml_get_widget (gui, "rect_y_waste_units_label");
663 dialog->priv->rect_margin_units_label = glade_xml_get_widget (gui, "rect_margin_units_label");
665 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
666 dialog->priv->rect_size_page);
668 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
669 dialog->priv->rect_size_page,
670 _("Label or Card Size"));
671 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
672 dialog->priv->rect_size_page,
674 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
675 dialog->priv->rect_size_page,
678 /* Initialize illustration. */
679 pixbuf = gdk_pixbuf_new_from_file (EX_RECT_IMAGE, NULL);
680 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->rect_image), pixbuf);
682 /* Apply units to spinbuttons and units labels. */
683 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
684 dialog->priv->digits);
685 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
686 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
687 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_w_units_label),
688 dialog->priv->units_string);
689 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
690 dialog->priv->digits);
691 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
692 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
693 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_h_units_label),
694 dialog->priv->units_string);
695 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
696 dialog->priv->digits);
697 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
698 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
699 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_r_units_label),
700 dialog->priv->units_string);
701 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
702 dialog->priv->digits);
703 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
704 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
705 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_x_waste_units_label),
706 dialog->priv->units_string);
707 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
708 dialog->priv->digits);
709 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
710 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
711 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_y_waste_units_label),
712 dialog->priv->units_string);
713 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
714 dialog->priv->digits);
715 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
716 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
717 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_margin_units_label),
718 dialog->priv->units_string);
720 /* Load some realistic defaults. */
721 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
722 DEFAULT_RECT_W * dialog->priv->units_per_point);
723 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
724 DEFAULT_RECT_H * dialog->priv->units_per_point);
725 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
726 DEFAULT_RECT_R * dialog->priv->units_per_point);
727 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
728 DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
729 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
730 DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
731 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
732 DEFAULT_MARGIN * dialog->priv->units_per_point);
735 /*--------------------------------------------------------------------------*/
736 /* PRIVATE. Construct round size page. */
737 /*--------------------------------------------------------------------------*/
739 construct_round_size_page (glTemplateDesigner *dialog,
745 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
746 "round_size_page", NULL);
749 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
753 dialog->priv->round_size_page = glade_xml_get_widget (gui, "round_size_page");
754 dialog->priv->round_image = glade_xml_get_widget (gui, "round_image");
755 dialog->priv->round_r_spin = glade_xml_get_widget (gui, "round_r_spin");
756 dialog->priv->round_waste_spin = glade_xml_get_widget (gui, "round_waste_spin");
757 dialog->priv->round_margin_spin = glade_xml_get_widget (gui, "round_margin_spin");
758 dialog->priv->round_r_units_label = glade_xml_get_widget (gui, "round_r_units_label");
759 dialog->priv->round_waste_units_label = glade_xml_get_widget (gui, "round_waste_units_label");
760 dialog->priv->round_margin_units_label = glade_xml_get_widget (gui, "round_margin_units_label");
762 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
763 dialog->priv->round_size_page);
765 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
766 dialog->priv->round_size_page,
767 _("Label Size (round)"));
768 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
769 dialog->priv->round_size_page,
771 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
772 dialog->priv->round_size_page,
775 /* Initialize illustration. */
776 pixbuf = gdk_pixbuf_new_from_file (EX_ROUND_IMAGE, NULL);
777 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->round_image), pixbuf);
779 /* Apply units to spinbuttons and units labels. */
780 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
781 dialog->priv->digits);
782 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
783 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
784 gtk_label_set_text (GTK_LABEL(dialog->priv->round_r_units_label),
785 dialog->priv->units_string);
786 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
787 dialog->priv->digits);
788 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
789 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
790 gtk_label_set_text (GTK_LABEL(dialog->priv->round_waste_units_label),
791 dialog->priv->units_string);
792 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
793 dialog->priv->digits);
794 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
795 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
796 gtk_label_set_text (GTK_LABEL(dialog->priv->round_margin_units_label),
797 dialog->priv->units_string);
799 /* Load some realistic defaults. */
800 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
801 DEFAULT_ROUND_R * dialog->priv->units_per_point);
802 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
803 DEFAULT_ROUND_WASTE * dialog->priv->units_per_point);
804 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
805 DEFAULT_MARGIN * dialog->priv->units_per_point);
809 /*--------------------------------------------------------------------------*/
810 /* PRIVATE. Construct CD/DVD size page. */
811 /*--------------------------------------------------------------------------*/
813 construct_cd_size_page (glTemplateDesigner *dialog,
819 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
820 "cd_size_page", NULL);
823 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
827 dialog->priv->cd_size_page = glade_xml_get_widget (gui, "cd_size_page");
828 dialog->priv->cd_image = glade_xml_get_widget (gui, "cd_image");
829 dialog->priv->cd_radius_spin = glade_xml_get_widget (gui, "cd_radius_spin");
830 dialog->priv->cd_hole_spin = glade_xml_get_widget (gui, "cd_hole_spin");
831 dialog->priv->cd_w_spin = glade_xml_get_widget (gui, "cd_w_spin");
832 dialog->priv->cd_h_spin = glade_xml_get_widget (gui, "cd_h_spin");
833 dialog->priv->cd_waste_spin = glade_xml_get_widget (gui, "cd_waste_spin");
834 dialog->priv->cd_margin_spin = glade_xml_get_widget (gui, "cd_margin_spin");
835 dialog->priv->cd_radius_units_label = glade_xml_get_widget (gui, "cd_radius_units_label");
836 dialog->priv->cd_hole_units_label = glade_xml_get_widget (gui, "cd_hole_units_label");
837 dialog->priv->cd_w_units_label = glade_xml_get_widget (gui, "cd_w_units_label");
838 dialog->priv->cd_h_units_label = glade_xml_get_widget (gui, "cd_h_units_label");
839 dialog->priv->cd_waste_units_label = glade_xml_get_widget (gui, "cd_waste_units_label");
840 dialog->priv->cd_margin_units_label = glade_xml_get_widget (gui, "cd_margin_units_label");
842 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
843 dialog->priv->cd_size_page);
845 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
846 dialog->priv->cd_size_page,
847 _("Label Size (CD/DVD)"));
848 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
849 dialog->priv->cd_size_page,
851 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
852 dialog->priv->cd_size_page,
855 /* Initialize illustration. */
856 pixbuf = gdk_pixbuf_new_from_file (EX_CD_IMAGE, NULL);
857 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->cd_image), pixbuf);
859 /* Apply units to spinbuttons and units labels. */
860 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
861 dialog->priv->digits);
862 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
863 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
864 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_radius_units_label),
865 dialog->priv->units_string);
866 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
867 dialog->priv->digits);
868 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
869 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
870 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_hole_units_label),
871 dialog->priv->units_string);
872 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
873 dialog->priv->digits);
874 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
875 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
876 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_w_units_label),
877 dialog->priv->units_string);
878 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
879 dialog->priv->digits);
880 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
881 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
882 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_h_units_label),
883 dialog->priv->units_string);
884 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
885 dialog->priv->digits);
886 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
887 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
888 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_waste_units_label),
889 dialog->priv->units_string);
890 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
891 dialog->priv->digits);
892 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
893 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
894 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_margin_units_label),
895 dialog->priv->units_string);
897 /* Load some realistic defaults. */
898 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
899 DEFAULT_CD_RADIUS * dialog->priv->units_per_point);
900 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
901 DEFAULT_CD_HOLE * dialog->priv->units_per_point);
902 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
903 DEFAULT_CD_WASTE * dialog->priv->units_per_point);
904 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
905 DEFAULT_MARGIN * dialog->priv->units_per_point);
909 /*--------------------------------------------------------------------------*/
910 /* PRIVATE. Construct number of layouts page. */
911 /*--------------------------------------------------------------------------*/
913 construct_nlayouts_page (glTemplateDesigner *dialog,
919 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
920 "nlayouts_page", NULL);
923 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
927 dialog->priv->nlayouts_page = glade_xml_get_widget (gui, "nlayouts_page");
928 dialog->priv->nlayouts_image1 = glade_xml_get_widget (gui, "nlayouts_image1");
929 dialog->priv->nlayouts_image2 = glade_xml_get_widget (gui, "nlayouts_image2");
930 dialog->priv->nlayouts_spin = glade_xml_get_widget (gui, "nlayouts_spin");
932 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
933 dialog->priv->nlayouts_page);
935 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
936 dialog->priv->nlayouts_page,
937 _("Number of Layouts"));
938 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
939 dialog->priv->nlayouts_page,
941 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
942 dialog->priv->nlayouts_page,
945 /* Initialize illustrations. */
946 pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE1, NULL);
947 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image1), pixbuf);
948 pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE2, NULL);
949 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image2), pixbuf);
953 /*--------------------------------------------------------------------------*/
954 /* PRIVATE. Construct layout page. */
955 /*--------------------------------------------------------------------------*/
957 construct_layout_page (glTemplateDesigner *dialog,
962 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
963 "layout_page", NULL);
966 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
970 dialog->priv->layout_page = glade_xml_get_widget (gui, "layout_page");
971 dialog->priv->layout1_head_label = glade_xml_get_widget (gui, "layout1_head_label");
972 dialog->priv->layout1_nx_spin = glade_xml_get_widget (gui, "layout1_nx_spin");
973 dialog->priv->layout1_ny_spin = glade_xml_get_widget (gui, "layout1_ny_spin");
974 dialog->priv->layout1_x0_spin = glade_xml_get_widget (gui, "layout1_x0_spin");
975 dialog->priv->layout1_y0_spin = glade_xml_get_widget (gui, "layout1_y0_spin");
976 dialog->priv->layout1_dx_spin = glade_xml_get_widget (gui, "layout1_dx_spin");
977 dialog->priv->layout1_dy_spin = glade_xml_get_widget (gui, "layout1_dy_spin");
978 dialog->priv->layout2_head_label = glade_xml_get_widget (gui, "layout2_head_label");
979 dialog->priv->layout2_nx_spin = glade_xml_get_widget (gui, "layout2_nx_spin");
980 dialog->priv->layout2_ny_spin = glade_xml_get_widget (gui, "layout2_ny_spin");
981 dialog->priv->layout2_x0_spin = glade_xml_get_widget (gui, "layout2_x0_spin");
982 dialog->priv->layout2_y0_spin = glade_xml_get_widget (gui, "layout2_y0_spin");
983 dialog->priv->layout2_dx_spin = glade_xml_get_widget (gui, "layout2_dx_spin");
984 dialog->priv->layout2_dy_spin = glade_xml_get_widget (gui, "layout2_dy_spin");
985 dialog->priv->layout_x0_units_label = glade_xml_get_widget (gui, "layout_x0_units_label");
986 dialog->priv->layout_y0_units_label = glade_xml_get_widget (gui, "layout_y0_units_label");
987 dialog->priv->layout_dx_units_label = glade_xml_get_widget (gui, "layout_dx_units_label");
988 dialog->priv->layout_dy_units_label = glade_xml_get_widget (gui, "layout_dy_units_label");
989 dialog->priv->layout_mini_preview = glade_xml_get_widget (gui, "layout_mini_preview");
990 dialog->priv->layout_test_button = glade_xml_get_widget (gui, "layout_test_button");
992 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
993 dialog->priv->layout_page);
995 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
996 dialog->priv->layout_page,
998 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
999 dialog->priv->layout_page,
1001 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1002 dialog->priv->layout_page,
1005 /* Apply units to spinbuttons and units labels. */
1006 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
1007 dialog->priv->digits);
1008 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
1009 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1010 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
1011 dialog->priv->digits);
1012 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
1013 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1014 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_x0_units_label),
1015 dialog->priv->units_string);
1016 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
1017 dialog->priv->digits);
1018 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
1019 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1020 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1021 dialog->priv->digits);
1022 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1023 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1024 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_y0_units_label),
1025 dialog->priv->units_string);
1026 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1027 dialog->priv->digits);
1028 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1029 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1030 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1031 dialog->priv->digits);
1032 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1033 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1034 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dx_units_label),
1035 dialog->priv->units_string);
1036 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1037 dialog->priv->digits);
1038 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1039 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1040 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1041 dialog->priv->digits);
1042 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1043 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1044 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dy_units_label),
1045 dialog->priv->units_string);
1047 /* Connect a handler that listens for changes in these widgets */
1048 /* This controls sensitivity of related widgets. */
1049 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_nx_spin), "changed",
1050 G_CALLBACK(layout_page_changed_cb), dialog);
1051 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_ny_spin), "changed",
1052 G_CALLBACK(layout_page_changed_cb), dialog);
1053 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_x0_spin), "changed",
1054 G_CALLBACK(layout_page_changed_cb), dialog);
1055 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_y0_spin), "changed",
1056 G_CALLBACK(layout_page_changed_cb), dialog);
1057 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dx_spin), "changed",
1058 G_CALLBACK(layout_page_changed_cb), dialog);
1059 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dy_spin), "changed",
1060 G_CALLBACK(layout_page_changed_cb), dialog);
1061 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_nx_spin), "changed",
1062 G_CALLBACK(layout_page_changed_cb), dialog);
1063 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_ny_spin), "changed",
1064 G_CALLBACK(layout_page_changed_cb), dialog);
1065 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_x0_spin), "changed",
1066 G_CALLBACK(layout_page_changed_cb), dialog);
1067 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_y0_spin), "changed",
1068 G_CALLBACK(layout_page_changed_cb), dialog);
1069 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dx_spin), "changed",
1070 G_CALLBACK(layout_page_changed_cb), dialog);
1071 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dy_spin), "changed",
1072 G_CALLBACK(layout_page_changed_cb), dialog);
1076 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout_test_button), "clicked",
1077 G_CALLBACK(print_test_cb), dialog);
1081 /*--------------------------------------------------------------------------*/
1082 /* PRIVATE. Construct finish page. */
1083 /*--------------------------------------------------------------------------*/
1085 construct_finish_page (glTemplateDesigner *dialog,
1090 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
1091 "finish_page", NULL);
1094 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
1098 dialog->priv->finish_page = glade_xml_get_widget (gui, "finish_page");
1100 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
1101 dialog->priv->finish_page);
1103 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
1104 dialog->priv->finish_page,
1105 _("Design Completed"));
1106 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
1107 dialog->priv->finish_page,
1109 gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
1110 dialog->priv->finish_page,
1111 GTK_ASSISTANT_PAGE_CONFIRM);
1112 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1113 dialog->priv->finish_page,
1118 /*--------------------------------------------------------------------------*/
1119 /* PRIVATE. cancel callback. */
1120 /*--------------------------------------------------------------------------*/
1122 cancel_cb (glTemplateDesigner *dialog)
1125 gtk_widget_destroy (GTK_WIDGET(dialog));
1129 /*--------------------------------------------------------------------------*/
1130 /* PRIVATE. apply callback */
1131 /*--------------------------------------------------------------------------*/
1133 apply_cb (glTemplateDesigner *dialog)
1135 glTemplate *template;
1137 template = build_template (dialog);
1138 gl_template_register (template);
1142 /*--------------------------------------------------------------------------*/
1143 /* PRIVATE. close callback */
1144 /*--------------------------------------------------------------------------*/
1146 close_cb (glTemplateDesigner *dialog)
1149 gtk_widget_destroy (GTK_WIDGET(dialog));
1153 /*--------------------------------------------------------------------------*/
1154 /* PRIVATE. prepare page callback */
1155 /*--------------------------------------------------------------------------*/
1157 prepare_cb (glTemplateDesigner *dialog,
1162 page_num = gtk_assistant_get_current_page (GTK_ASSISTANT (dialog));
1168 name_page_changed_cb (dialog); /* Use to prepare */
1171 case PG_SIZE_PAGE_NUM:
1172 pg_size_page_changed_cb (dialog); /* Use to prepare */
1175 case RECT_SIZE_PAGE_NUM:
1176 rect_size_page_prepare_cb (dialog);
1179 case ROUND_SIZE_PAGE_NUM:
1180 round_size_page_prepare_cb (dialog);
1183 case CD_SIZE_PAGE_NUM:
1184 cd_size_page_prepare_cb (dialog);
1187 case LAYOUT_PAGE_NUM:
1188 layout_page_prepare_cb (dialog);
1192 /* No preparation needed */
1198 /*--------------------------------------------------------------------------*/
1199 /* PRIVATE. Handle non-linear forward traversal. */
1200 /*--------------------------------------------------------------------------*/
1202 forward_page_function (gint current_page,
1205 glTemplateDesigner *dialog = GL_TEMPLATE_DESIGNER (data);
1207 switch (current_page)
1209 case START_PAGE_NUM:
1210 return NAME_PAGE_NUM;
1213 return PG_SIZE_PAGE_NUM;
1215 case PG_SIZE_PAGE_NUM:
1216 return SHAPE_PAGE_NUM;
1218 case SHAPE_PAGE_NUM:
1219 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1220 return RECT_SIZE_PAGE_NUM;
1222 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1223 return ROUND_SIZE_PAGE_NUM;
1225 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1226 return CD_SIZE_PAGE_NUM;
1230 case RECT_SIZE_PAGE_NUM:
1231 case ROUND_SIZE_PAGE_NUM:
1232 case CD_SIZE_PAGE_NUM:
1233 return NLAYOUTS_PAGE_NUM;
1235 case NLAYOUTS_PAGE_NUM:
1236 return LAYOUT_PAGE_NUM;
1238 case LAYOUT_PAGE_NUM:
1239 return FINISH_PAGE_NUM;
1241 case FINISH_PAGE_NUM:
1248 /*--------------------------------------------------------------------------*/
1249 /* PRIVATE. Widget on name page "changed" callback. */
1250 /*--------------------------------------------------------------------------*/
1252 name_page_changed_cb (glTemplateDesigner *dialog)
1254 gchar *brand, *part_num, *desc;
1256 brand = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1);
1257 part_num = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1);
1258 desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1260 if (brand && brand[0] && part_num && part_num[0] && desc && desc[0])
1263 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1264 dialog->priv->name_page,
1270 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1271 dialog->priv->name_page,
1280 /*--------------------------------------------------------------------------*/
1281 /* PRIVATE. Widget on page size page "changed" callback. */
1282 /*--------------------------------------------------------------------------*/
1284 pg_size_page_changed_cb (glTemplateDesigner *dialog)
1286 gchar *page_size_name;
1291 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1293 if (page_size_name && strlen(page_size_name)) {
1295 paper = gl_paper_from_name (page_size_name);
1298 if ( g_strcasecmp (paper->id, "Other") == 0 ) {
1299 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), TRUE);
1300 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), TRUE);
1301 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1303 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1307 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), FALSE);
1308 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), FALSE);
1309 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1311 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1314 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
1315 paper->width * dialog->priv->units_per_point);
1316 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
1317 paper->height * dialog->priv->units_per_point);
1320 gl_paper_free (paper);
1323 g_free (page_size_name);
1327 /*--------------------------------------------------------------------------*/
1328 /* PRIVATE. Prepare rectangular size page. */
1329 /*--------------------------------------------------------------------------*/
1331 rect_size_page_prepare_cb (glTemplateDesigner *dialog)
1333 gdouble max_w, max_h;
1334 gdouble w, h, r, x_waste, y_waste, margin;
1336 /* Limit label size based on already chosen page size. */
1337 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1338 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1340 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1341 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1342 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1343 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1344 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1345 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1347 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_w_spin),
1348 dialog->priv->climb_rate, max_w);
1349 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_h_spin),
1350 dialog->priv->climb_rate, max_h);
1351 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_r_spin),
1352 0.0, MIN(max_w, max_h)/2.0);
1353 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_x_waste_spin),
1354 0.0, MIN(max_w, max_h)/4.0);
1355 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_y_waste_spin),
1356 0.0, MIN(max_w, max_h)/4.0);
1357 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_margin_spin),
1358 0.0, MIN(max_w, max_h)/4.0);
1360 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), w);
1361 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), h);
1362 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), r);
1363 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), x_waste);
1364 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), y_waste);
1365 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), margin);
1369 /*--------------------------------------------------------------------------*/
1370 /* PRIVATE. Prepare round size page. */
1371 /*--------------------------------------------------------------------------*/
1373 round_size_page_prepare_cb (glTemplateDesigner *dialog)
1375 gdouble max_w, max_h;
1376 gdouble r, waste, margin;
1378 /* Limit label size based on already chosen page size. */
1379 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1380 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1382 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1383 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1384 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1386 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_r_spin),
1387 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1388 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_waste_spin),
1389 0.0, MIN(max_w, max_h)/4.0);
1390 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_margin_spin),
1391 0.0, MIN(max_w, max_h)/4.0);
1393 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), r);
1394 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), waste);
1395 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), margin);
1399 /*--------------------------------------------------------------------------*/
1400 /* PRIVATE. Prepare cd/dvd size page. */
1401 /*--------------------------------------------------------------------------*/
1403 cd_size_page_prepare_cb (glTemplateDesigner *dialog)
1405 gdouble max_w, max_h;
1406 gdouble radius, hole, w, h, waste, margin;
1408 /* Limit label size based on already chosen page size. */
1409 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1410 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1412 radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1413 hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1414 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1415 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1416 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1417 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1419 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_radius_spin),
1420 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1421 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_hole_spin),
1422 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1423 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_w_spin),
1425 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_h_spin),
1427 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_waste_spin),
1428 0.0, MIN(max_w, max_h)/4.0);
1429 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_margin_spin),
1430 0.0, MIN(max_w, max_h)/4.0);
1432 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), radius);
1433 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), hole);
1434 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), w);
1435 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), h);
1436 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), waste);
1437 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), margin);
1441 /*--------------------------------------------------------------------------*/
1442 /* PRIVATE. Layout page widget changed cb. */
1443 /*--------------------------------------------------------------------------*/
1445 layout_page_prepare_cb (glTemplateDesigner *dialog)
1447 gdouble page_w, page_h;
1448 gdouble w, h, x_waste, y_waste;
1449 gint max_nx, max_ny;
1451 gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1452 gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1454 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_nx_spin),
1455 G_CALLBACK(layout_page_changed_cb),
1457 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_ny_spin),
1458 G_CALLBACK(layout_page_changed_cb),
1460 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_x0_spin),
1461 G_CALLBACK(layout_page_changed_cb),
1463 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_y0_spin),
1464 G_CALLBACK(layout_page_changed_cb),
1466 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_dx_spin),
1467 G_CALLBACK(layout_page_changed_cb),
1469 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_dy_spin),
1470 G_CALLBACK(layout_page_changed_cb),
1472 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_nx_spin),
1473 G_CALLBACK(layout_page_changed_cb),
1475 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_ny_spin),
1476 G_CALLBACK(layout_page_changed_cb),
1478 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_x0_spin),
1479 G_CALLBACK(layout_page_changed_cb),
1481 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_y0_spin),
1482 G_CALLBACK(layout_page_changed_cb),
1484 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_dx_spin),
1485 G_CALLBACK(layout_page_changed_cb),
1487 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_dy_spin),
1488 G_CALLBACK(layout_page_changed_cb),
1491 /* Limit ranges based on already chosen page and label sizes. */
1492 page_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1493 page_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1494 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1495 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1496 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1497 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1498 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1500 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1501 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1503 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1506 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1507 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1509 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1512 max_nx = MAX (floor (page_w/(w + 2*x_waste) + DELTA), 1.0);
1513 max_ny = MAX (floor (page_h/(h + 2*y_waste) + DELTA), 1.0);
1515 nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1516 ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1517 x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1518 y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1519 dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1520 dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1521 nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1522 ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1523 x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1524 y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1525 dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1526 dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1528 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_nx_spin),
1530 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_ny_spin),
1532 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_x0_spin),
1533 x_waste, page_w - w - x_waste);
1534 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_y0_spin),
1535 y_waste, page_h - h - y_waste);
1536 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dx_spin),
1537 w + 2*x_waste, page_w - w - 2*x_waste);
1538 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dy_spin),
1539 h + 2*y_waste, page_h - h - 2*y_waste);
1540 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_nx_spin),
1542 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_ny_spin),
1544 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_x0_spin),
1545 x_waste, page_w - w - x_waste);
1546 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_y0_spin),
1547 y_waste, page_h - h - y_waste);
1548 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dx_spin),
1549 w + 2*x_waste, page_w - w - 2*x_waste);
1550 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dy_spin),
1551 h + 2*y_waste, page_h - h - 2*y_waste);
1553 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), nx_1);
1554 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), ny_1);
1555 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), x0_1);
1556 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), y0_1);
1557 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), dx_1);
1558 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), dy_1);
1559 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), nx_2);
1560 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), ny_2);
1561 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), x0_2);
1562 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), y0_2);
1563 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), dx_2);
1564 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), dy_2);
1566 /* Set visibility of layout2 widgets as appropriate. */
1567 nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1568 if ( nlayouts == 1 ) {
1570 gtk_widget_hide (dialog->priv->layout1_head_label);
1571 gtk_widget_hide (dialog->priv->layout2_head_label);
1572 gtk_widget_hide (dialog->priv->layout2_nx_spin);
1573 gtk_widget_hide (dialog->priv->layout2_ny_spin);
1574 gtk_widget_hide (dialog->priv->layout2_x0_spin);
1575 gtk_widget_hide (dialog->priv->layout2_y0_spin);
1576 gtk_widget_hide (dialog->priv->layout2_dx_spin);
1577 gtk_widget_hide (dialog->priv->layout2_dy_spin);
1581 gtk_widget_show (dialog->priv->layout1_head_label);
1582 gtk_widget_show (dialog->priv->layout2_head_label);
1583 gtk_widget_show (dialog->priv->layout2_nx_spin);
1584 gtk_widget_show (dialog->priv->layout2_ny_spin);
1585 gtk_widget_show (dialog->priv->layout2_x0_spin);
1586 gtk_widget_show (dialog->priv->layout2_y0_spin);
1587 gtk_widget_show (dialog->priv->layout2_dx_spin);
1588 gtk_widget_show (dialog->priv->layout2_dy_spin);
1592 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_nx_spin),
1593 G_CALLBACK(layout_page_changed_cb),
1595 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_ny_spin),
1596 G_CALLBACK(layout_page_changed_cb),
1598 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_x0_spin),
1599 G_CALLBACK(layout_page_changed_cb),
1601 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_y0_spin),
1602 G_CALLBACK(layout_page_changed_cb),
1604 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_dx_spin),
1605 G_CALLBACK(layout_page_changed_cb),
1607 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_dy_spin),
1608 G_CALLBACK(layout_page_changed_cb),
1610 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_nx_spin),
1611 G_CALLBACK(layout_page_changed_cb),
1613 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_ny_spin),
1614 G_CALLBACK(layout_page_changed_cb),
1616 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_x0_spin),
1617 G_CALLBACK(layout_page_changed_cb),
1619 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_y0_spin),
1620 G_CALLBACK(layout_page_changed_cb),
1622 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_dx_spin),
1623 G_CALLBACK(layout_page_changed_cb),
1625 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_dy_spin),
1626 G_CALLBACK(layout_page_changed_cb),
1629 layout_page_changed_cb (dialog);
1632 /*--------------------------------------------------------------------------*/
1633 /* PRIVATE. Layout page widget changed cb. */
1634 /*--------------------------------------------------------------------------*/
1636 layout_page_changed_cb (glTemplateDesigner *dialog)
1638 glTemplate *template;
1640 template = build_template (dialog);
1642 gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview),
1645 gl_template_free (template);
1648 /*--------------------------------------------------------------------------*/
1649 /* PRIVATE. Print test sheet callback. */
1650 /*--------------------------------------------------------------------------*/
1652 print_test_cb (glTemplateDesigner *dialog)
1655 glTemplate *template;
1656 glPrintOp *print_op;
1658 label = gl_label_new ();
1660 template = build_template (dialog);
1661 gl_label_set_template (GL_LABEL(label), template);
1663 print_op = gl_print_op_new (GL_LABEL(label));
1664 gl_print_op_force_outline_flag (print_op);
1665 gtk_print_operation_run (GTK_PRINT_OPERATION (print_op),
1666 GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
1667 GTK_WINDOW (dialog),
1670 gl_template_free (template);
1671 g_object_unref (G_OBJECT(label));
1674 /*--------------------------------------------------------------------------*/
1675 /* Build a template based on current assistant settings. */
1676 /*--------------------------------------------------------------------------*/
1678 build_template (glTemplateDesigner *dialog)
1681 gchar *brand, *part_num, *name, *desc;
1682 gchar *page_size_name;
1684 glTemplateLabelShape shape;
1685 glTemplateLabelType *label_type;
1686 gdouble w, h, r, radius, hole, waste, x_waste, y_waste, margin;
1688 gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1689 gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1690 glTemplate *template;
1692 upp = dialog->priv->units_per_point;
1694 brand = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1);
1695 part_num = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1);
1696 name = g_strdup_printf ("%s %s", brand, part_num);
1697 desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1700 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1701 paper = gl_paper_from_name (page_size_name);
1702 if ( g_strcasecmp (paper->id, "Other") == 0 ) {
1704 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin))
1707 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin))
1711 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1712 shape = GL_TEMPLATE_SHAPE_RECT;
1713 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1714 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1715 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1716 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1717 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1718 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1721 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1722 shape = GL_TEMPLATE_SHAPE_ROUND;
1723 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1724 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1725 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1728 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1729 shape = GL_TEMPLATE_SHAPE_CD;
1730 radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1731 hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1732 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1733 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1734 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1735 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1738 nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1739 nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1740 ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1741 x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1742 y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1743 dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1744 dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1745 nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1746 ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1747 x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1748 y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1749 dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1750 dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1753 template = gl_template_new (name, desc, paper->id, paper->width, paper->height);
1756 case GL_TEMPLATE_SHAPE_RECT:
1758 gl_template_rect_label_type_new ("0",
1759 w/upp, h/upp, r/upp,
1760 x_waste/upp, y_waste/upp);
1762 case GL_TEMPLATE_SHAPE_ROUND:
1764 gl_template_round_label_type_new ("0", r/upp, waste/upp);
1766 case GL_TEMPLATE_SHAPE_CD:
1768 gl_template_cd_label_type_new ("0",
1769 radius/upp, hole/upp,
1774 gl_template_add_label_type (template, label_type);
1776 gl_template_add_markup (label_type,
1777 gl_template_markup_margin_new (margin/upp));
1779 gl_template_add_layout (label_type,
1780 gl_template_layout_new (nx_1, ny_1,
1786 gl_template_add_layout (label_type,
1787 gl_template_layout_new (nx_2, ny_2,
1799 g_free (page_size_name);
1800 gl_paper_free (paper);
1805 /*****************************************************************************/
1806 /* Construct mini preview widget. */
1807 /*****************************************************************************/
1809 gl_template_designer_construct_mini_preview (gchar *name,
1818 return gl_wdgt_mini_preview_new (height, width);