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 <gtk/gtktogglebutton.h>
31 #include <gtk/gtkcombobox.h>
32 #include <gtk/gtkspinbutton.h>
33 #include <gtk/gtklabel.h>
38 #include <libglabels/paper.h>
39 #include <libglabels/template.h>
40 #include "wdgt-mini-preview.h"
45 /*========================================================*/
46 /* Private macros and constants. */
47 /*========================================================*/
48 #define ICON_PIXMAP (GLABELS_ICON_DIR "glabels.png")
50 #define EX_RECT_IMAGE (GLABELS_PIXMAP_DIR "ex-rect-size.png")
51 #define EX_ROUND_IMAGE (GLABELS_PIXMAP_DIR "ex-round-size.png")
52 #define EX_CD_IMAGE (GLABELS_PIXMAP_DIR "ex-cd-size.png")
53 #define EX_NLAYOUTS_IMAGE1 (GLABELS_PIXMAP_DIR "ex-1layout.png")
54 #define EX_NLAYOUTS_IMAGE2 (GLABELS_PIXMAP_DIR "ex-2layouts.png")
56 #define DEFAULT_MARGIN 9.0
58 #define DEFAULT_RECT_W 252.0
59 #define DEFAULT_RECT_H 144.0
60 #define DEFAULT_RECT_R 0.0
61 #define DEFAULT_RECT_WASTE 0.0 /* Should never exceed 1/2 the distance between items. */
63 #define DEFAULT_ROUND_R 72.0
64 #define DEFAULT_ROUND_WASTE 0.0 /* Should never exceed 1/2 the distance between items. */
66 #define DEFAULT_CD_RADIUS 166.5
67 #define DEFAULT_CD_HOLE 58.5
68 #define DEFAULT_CD_WASTE 9.0 /* Should never exceed 1/2 the distance between items. */
71 #define MAX_PAGE_DIM_POINTS 5000.0
73 /*========================================================*/
75 /*========================================================*/
77 struct _glTemplateDesignerPrivate
80 GtkWidget *start_page;
82 GtkWidget *pg_size_page;
83 GtkWidget *shape_page;
84 GtkWidget *rect_size_page;
85 GtkWidget *round_size_page;
86 GtkWidget *cd_size_page;
87 GtkWidget *nlayouts_page;
88 GtkWidget *layout_page;
89 GtkWidget *finish_page;
91 /* Name page controls */
92 GtkWidget *brand_entry;
93 GtkWidget *part_num_entry;
94 GtkWidget *description_entry;
96 /* Page size page controls */
97 GtkWidget *pg_size_combo;
100 GtkWidget *pg_w_units_label;
101 GtkWidget *pg_h_units_label;
103 /* Shape page controls */
104 GtkWidget *shape_rect_radio;
105 GtkWidget *shape_round_radio;
106 GtkWidget *shape_cd_radio;
108 /* Label size (rectangular) page controls */
109 GtkWidget *rect_image;
110 GtkWidget *rect_w_spin;
111 GtkWidget *rect_h_spin;
112 GtkWidget *rect_r_spin;
113 GtkWidget *rect_x_waste_spin;
114 GtkWidget *rect_y_waste_spin;
115 GtkWidget *rect_margin_spin;
116 GtkWidget *rect_w_units_label;
117 GtkWidget *rect_h_units_label;
118 GtkWidget *rect_r_units_label;
119 GtkWidget *rect_x_waste_units_label;
120 GtkWidget *rect_y_waste_units_label;
121 GtkWidget *rect_margin_units_label;
123 /* Label size (round) page controls */
124 GtkWidget *round_image;
125 GtkWidget *round_r_spin;
126 GtkWidget *round_waste_spin;
127 GtkWidget *round_margin_spin;
128 GtkWidget *round_r_units_label;
129 GtkWidget *round_waste_units_label;
130 GtkWidget *round_margin_units_label;
132 /* Label size (cd) page controls */
134 GtkWidget *cd_radius_spin;
135 GtkWidget *cd_hole_spin;
136 GtkWidget *cd_w_spin;
137 GtkWidget *cd_h_spin;
138 GtkWidget *cd_waste_spin;
139 GtkWidget *cd_margin_spin;
140 GtkWidget *cd_radius_units_label;
141 GtkWidget *cd_hole_units_label;
142 GtkWidget *cd_w_units_label;
143 GtkWidget *cd_h_units_label;
144 GtkWidget *cd_waste_units_label;
145 GtkWidget *cd_margin_units_label;
147 /* Number of layouts controls */
148 GtkWidget *nlayouts_image1;
149 GtkWidget *nlayouts_image2;
150 GtkWidget *nlayouts_spin;
152 /* Layout page controls */
153 GtkWidget *layout1_head_label;
154 GtkWidget *layout1_nx_spin;
155 GtkWidget *layout1_ny_spin;
156 GtkWidget *layout1_x0_spin;
157 GtkWidget *layout1_y0_spin;
158 GtkWidget *layout1_dx_spin;
159 GtkWidget *layout1_dy_spin;
160 GtkWidget *layout2_head_label;
161 GtkWidget *layout2_nx_spin;
162 GtkWidget *layout2_ny_spin;
163 GtkWidget *layout2_x0_spin;
164 GtkWidget *layout2_y0_spin;
165 GtkWidget *layout2_dx_spin;
166 GtkWidget *layout2_dy_spin;
167 GtkWidget *layout_x0_units_label;
168 GtkWidget *layout_y0_units_label;
169 GtkWidget *layout_dx_units_label;
170 GtkWidget *layout_dy_units_label;
171 GtkWidget *layout_mini_preview;
172 GtkWidget *layout_test_button;
174 /* Units related stuff */
175 const gchar *units_string;
176 gdouble units_per_point;
182 /* Page numbers for traversing GtkAssistant */
196 /*========================================================*/
197 /* Private globals. */
198 /*========================================================*/
200 static GtkAssistantClass* parent_class = NULL;
202 /*========================================================*/
203 /* Private function prototypes. */
204 /*========================================================*/
206 static void gl_template_designer_class_init (glTemplateDesignerClass *klass);
207 static void gl_template_designer_init (glTemplateDesigner *dlg);
208 static void gl_template_designer_finalize (GObject *object);
209 static void gl_template_designer_construct (glTemplateDesigner *dlg);
211 static void construct_start_page (glTemplateDesigner *dlg,
214 static void construct_name_page (glTemplateDesigner *dlg,
217 static void construct_pg_size_page (glTemplateDesigner *dlg,
220 static void construct_shape_page (glTemplateDesigner *dlg,
223 static void construct_rect_size_page (glTemplateDesigner *dlg,
226 static void construct_round_size_page (glTemplateDesigner *dlg,
229 static void construct_cd_size_page (glTemplateDesigner *dlg,
232 static void construct_nlayouts_page (glTemplateDesigner *dlg,
235 static void construct_layout_page (glTemplateDesigner *dlg,
238 static void construct_finish_page (glTemplateDesigner *dlg,
241 static void cancel_cb (glTemplateDesigner *dlg);
242 static void apply_cb (glTemplateDesigner *dlg);
243 static void close_cb (glTemplateDesigner *dlg);
244 static void prepare_cb (glTemplateDesigner *dlg,
247 static gint forward_page_function (gint current_page,
250 static void name_page_changed_cb (glTemplateDesigner *dlg);
252 static void pg_size_page_changed_cb (glTemplateDesigner *dlg);
254 static void rect_size_page_prepare_cb (glTemplateDesigner *dlg);
256 static void round_size_page_prepare_cb (glTemplateDesigner *dlg);
258 static void cd_size_page_prepare_cb (glTemplateDesigner *dlg);
260 static void layout_page_prepare_cb (glTemplateDesigner *dlg);
262 static void layout_page_changed_cb (glTemplateDesigner *dlg);
264 static void print_test_cb (glTemplateDesigner *dlg);
266 static glTemplate *build_template (glTemplateDesigner *dlg);
269 /*****************************************************************************/
270 /* Boilerplate object stuff. */
271 /*****************************************************************************/
273 gl_template_designer_get_type (void)
275 static GType type = 0;
279 static const GTypeInfo info =
281 sizeof (glTemplateDesignerClass),
282 NULL, /* base_init */
283 NULL, /* base_finalize */
284 (GClassInitFunc) gl_template_designer_class_init,
285 NULL, /* class_finalize */
286 NULL, /* class_data */
287 sizeof (glTemplateDesigner),
289 (GInstanceInitFunc) gl_template_designer_init,
293 type = g_type_register_static (GTK_TYPE_ASSISTANT,
294 "glTemplateDesigner", &info, 0);
301 gl_template_designer_class_init (glTemplateDesignerClass *klass)
303 GObjectClass *object_class = G_OBJECT_CLASS (klass);
305 gl_debug (DEBUG_TEMPLATE, "");
307 parent_class = g_type_class_peek_parent (klass);
309 object_class->finalize = gl_template_designer_finalize;
313 gl_template_designer_init (glTemplateDesigner *dialog)
315 gl_debug (DEBUG_TEMPLATE, "START");
317 dialog->priv = g_new0 (glTemplateDesignerPrivate, 1);
319 gl_debug (DEBUG_TEMPLATE, "END");
325 gl_template_designer_finalize (GObject *object)
327 glTemplateDesigner* dialog;
329 gl_debug (DEBUG_TEMPLATE, "START");
331 g_return_if_fail (object != NULL);
333 dialog = GL_TEMPLATE_DESIGNER (object);
335 g_return_if_fail (GL_IS_TEMPLATE_DESIGNER (dialog));
336 g_return_if_fail (dialog->priv != NULL);
338 G_OBJECT_CLASS (parent_class)->finalize (object);
340 g_free (dialog->priv);
342 gl_debug (DEBUG_TEMPLATE, "END");
345 /*****************************************************************************/
346 /* NEW preferences dialog. */
347 /*****************************************************************************/
349 gl_template_designer_new (GtkWindow *parent)
353 gl_debug (DEBUG_TEMPLATE, "START");
355 dialog = GTK_WIDGET (g_object_new (GL_TYPE_TEMPLATE_DESIGNER, NULL));
358 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
360 gl_template_designer_construct (GL_TEMPLATE_DESIGNER(dialog));
363 gl_debug (DEBUG_TEMPLATE, "END");
368 /*---------------------------------------------------------------------------*/
369 /* PRIVATE. Construct composite widget. */
370 /*---------------------------------------------------------------------------*/
372 gl_template_designer_construct (glTemplateDesigner *dialog)
376 g_return_if_fail (dialog && GL_IS_TEMPLATE_DESIGNER (dialog));
377 g_return_if_fail (dialog->priv != NULL);
379 /* Initialize units stuff from prefs */
380 dialog->priv->units_string = gl_prefs_get_units_string ();
381 dialog->priv->units_per_point = gl_prefs_get_units_per_point ();
382 dialog->priv->climb_rate = gl_prefs_get_units_step_size ();
383 dialog->priv->digits = gl_prefs_get_units_precision ();
385 gtk_window_set_title (GTK_WINDOW(dialog), _("gLabels Template Designer"));
387 logo = gdk_pixbuf_new_from_file (ICON_PIXMAP, NULL);
389 /* Costruct and append pages (must be same order as PAGE_NUM enums. */
390 construct_start_page (dialog, logo);
391 construct_name_page (dialog, logo);
392 construct_pg_size_page (dialog, logo);
393 construct_shape_page (dialog, logo);
394 construct_rect_size_page (dialog, logo);
395 construct_round_size_page (dialog, logo);
396 construct_cd_size_page (dialog, logo);
397 construct_nlayouts_page (dialog, logo);
398 construct_layout_page (dialog, logo);
399 construct_finish_page (dialog, logo);
401 gtk_assistant_set_forward_page_func (GTK_ASSISTANT (dialog),
402 forward_page_function,
407 g_signal_connect_swapped (G_OBJECT(dialog), "cancel",
408 G_CALLBACK(cancel_cb), dialog);
409 g_signal_connect_swapped (G_OBJECT(dialog), "apply",
410 G_CALLBACK(apply_cb), dialog);
411 g_signal_connect_swapped (G_OBJECT(dialog), "close",
412 G_CALLBACK(close_cb), dialog);
413 g_signal_connect (G_OBJECT(dialog), "prepare",
414 G_CALLBACK(prepare_cb), NULL);
416 gtk_widget_show_all (GTK_WIDGET(dialog));
419 /*--------------------------------------------------------------------------*/
420 /* PRIVATE. Construct start page. */
421 /*--------------------------------------------------------------------------*/
423 construct_start_page (glTemplateDesigner *dialog,
428 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
432 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
436 dialog->priv->start_page = glade_xml_get_widget (gui, "start_page");
438 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
439 dialog->priv->start_page);
441 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
442 dialog->priv->start_page,
444 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
445 dialog->priv->start_page,
447 gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
448 dialog->priv->start_page,
449 GTK_ASSISTANT_PAGE_INTRO);
450 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
451 dialog->priv->start_page,
455 /*--------------------------------------------------------------------------*/
456 /* PRIVATE. Construct name page. */
457 /*--------------------------------------------------------------------------*/
459 construct_name_page (glTemplateDesigner *dialog,
464 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
468 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
472 dialog->priv->name_page = glade_xml_get_widget (gui, "name_page");
473 dialog->priv->brand_entry = glade_xml_get_widget (gui, "brand_entry");
474 dialog->priv->part_num_entry = glade_xml_get_widget (gui, "part_num_entry");
475 dialog->priv->description_entry = glade_xml_get_widget (gui, "description_entry");
477 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
478 dialog->priv->name_page);
480 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
481 dialog->priv->name_page,
482 _("Name and Description"));
483 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
484 dialog->priv->name_page,
487 /* Connect a handler that listens for changes in these widgets */
488 /* This controls whether we can progress to the next page. */
489 g_signal_connect_swapped (G_OBJECT(dialog->priv->brand_entry), "changed",
490 G_CALLBACK(name_page_changed_cb), dialog);
491 g_signal_connect_swapped (G_OBJECT(dialog->priv->part_num_entry), "changed",
492 G_CALLBACK(name_page_changed_cb), dialog);
493 g_signal_connect_swapped (G_OBJECT(dialog->priv->description_entry), "changed",
494 G_CALLBACK(name_page_changed_cb), dialog);
498 /*--------------------------------------------------------------------------*/
499 /* PRIVATE. Construct page size page. */
500 /*--------------------------------------------------------------------------*/
502 construct_pg_size_page (glTemplateDesigner *dialog,
507 const gchar *default_page_size_id;
508 gchar *default_page_size_name;
510 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
511 "pg_size_page", NULL);
514 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
518 dialog->priv->pg_size_page = glade_xml_get_widget (gui, "pg_size_page");
519 dialog->priv->pg_size_combo = glade_xml_get_widget (gui, "pg_size_combo");
520 dialog->priv->pg_w_spin = glade_xml_get_widget (gui, "pg_w_spin");
521 dialog->priv->pg_h_spin = glade_xml_get_widget (gui, "pg_h_spin");
522 dialog->priv->pg_w_units_label = glade_xml_get_widget (gui, "pg_w_units_label");
523 dialog->priv->pg_h_units_label = glade_xml_get_widget (gui, "pg_h_units_label");
525 gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
527 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
528 dialog->priv->pg_size_page);
530 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
531 dialog->priv->pg_size_page,
533 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
534 dialog->priv->pg_size_page,
536 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
537 dialog->priv->pg_size_page,
540 /* Load page size combo */
541 page_sizes = gl_paper_get_name_list ();
542 gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->pg_size_combo), page_sizes);
543 gl_paper_free_name_list (page_sizes);
544 default_page_size_id = gl_prefs_get_page_size ();
545 default_page_size_name = gl_paper_lookup_name_from_id (default_page_size_id);
546 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), default_page_size_name);
547 g_free (default_page_size_name);
549 /* Apply units to spinbuttons and units labels. */
550 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
551 dialog->priv->digits);
552 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
553 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
554 gtk_label_set_text (GTK_LABEL(dialog->priv->pg_w_units_label),
555 dialog->priv->units_string);
556 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_w_spin),
557 0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
558 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
559 dialog->priv->digits);
560 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
561 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
562 gtk_label_set_text (GTK_LABEL(dialog->priv->pg_h_units_label),
563 dialog->priv->units_string);
564 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_h_spin),
565 0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
567 /* Connect a handler that listens for changes in these widgets */
568 /* This controls sensitivity of related widgets. */
569 g_signal_connect_swapped (G_OBJECT(dialog->priv->pg_size_combo), "changed",
570 G_CALLBACK(pg_size_page_changed_cb), dialog);
573 /*--------------------------------------------------------------------------*/
574 /* PRIVATE. Construct shape page. */
575 /*--------------------------------------------------------------------------*/
577 construct_shape_page (glTemplateDesigner *dialog,
582 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
586 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
590 dialog->priv->shape_page = glade_xml_get_widget (gui, "shape_page");
591 dialog->priv->shape_rect_radio = glade_xml_get_widget (gui, "shape_rect_radio");
592 dialog->priv->shape_round_radio = glade_xml_get_widget (gui, "shape_round_radio");
593 dialog->priv->shape_cd_radio = glade_xml_get_widget (gui, "shape_cd_radio");
595 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
596 dialog->priv->shape_page);
598 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
599 dialog->priv->shape_page,
600 _("Label or Card Shape"));
601 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
602 dialog->priv->shape_page,
604 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
605 dialog->priv->shape_page,
609 /*--------------------------------------------------------------------------*/
610 /* PRIVATE. Construct rect size page. */
611 /*--------------------------------------------------------------------------*/
613 construct_rect_size_page (glTemplateDesigner *dialog,
619 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
620 "rect_size_page", NULL);
623 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
627 dialog->priv->rect_size_page = glade_xml_get_widget (gui, "rect_size_page");
628 dialog->priv->rect_image = glade_xml_get_widget (gui, "rect_image");
629 dialog->priv->rect_w_spin = glade_xml_get_widget (gui, "rect_w_spin");
630 dialog->priv->rect_h_spin = glade_xml_get_widget (gui, "rect_h_spin");
631 dialog->priv->rect_r_spin = glade_xml_get_widget (gui, "rect_r_spin");
632 dialog->priv->rect_x_waste_spin = glade_xml_get_widget (gui, "rect_x_waste_spin");
633 dialog->priv->rect_y_waste_spin = glade_xml_get_widget (gui, "rect_y_waste_spin");
634 dialog->priv->rect_margin_spin = glade_xml_get_widget (gui, "rect_margin_spin");
635 dialog->priv->rect_w_units_label = glade_xml_get_widget (gui, "rect_w_units_label");
636 dialog->priv->rect_h_units_label = glade_xml_get_widget (gui, "rect_h_units_label");
637 dialog->priv->rect_r_units_label = glade_xml_get_widget (gui, "rect_r_units_label");
638 dialog->priv->rect_x_waste_units_label = glade_xml_get_widget (gui, "rect_x_waste_units_label");
639 dialog->priv->rect_y_waste_units_label = glade_xml_get_widget (gui, "rect_y_waste_units_label");
640 dialog->priv->rect_margin_units_label = glade_xml_get_widget (gui, "rect_margin_units_label");
642 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
643 dialog->priv->rect_size_page);
645 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
646 dialog->priv->rect_size_page,
647 _("Label or Card Size"));
648 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
649 dialog->priv->rect_size_page,
651 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
652 dialog->priv->rect_size_page,
655 /* Initialize illustration. */
656 pixbuf = gdk_pixbuf_new_from_file (EX_RECT_IMAGE, NULL);
657 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->rect_image), pixbuf);
659 /* Apply units to spinbuttons and units labels. */
660 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
661 dialog->priv->digits);
662 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
663 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
664 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_w_units_label),
665 dialog->priv->units_string);
666 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
667 dialog->priv->digits);
668 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
669 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
670 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_h_units_label),
671 dialog->priv->units_string);
672 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
673 dialog->priv->digits);
674 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
675 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
676 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_r_units_label),
677 dialog->priv->units_string);
678 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
679 dialog->priv->digits);
680 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
681 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
682 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_x_waste_units_label),
683 dialog->priv->units_string);
684 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
685 dialog->priv->digits);
686 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
687 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
688 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_y_waste_units_label),
689 dialog->priv->units_string);
690 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
691 dialog->priv->digits);
692 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
693 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
694 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_margin_units_label),
695 dialog->priv->units_string);
697 /* Load some realistic defaults. */
698 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
699 DEFAULT_RECT_W * dialog->priv->units_per_point);
700 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
701 DEFAULT_RECT_H * dialog->priv->units_per_point);
702 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
703 DEFAULT_RECT_R * dialog->priv->units_per_point);
704 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
705 DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
706 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
707 DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
708 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
709 DEFAULT_MARGIN * dialog->priv->units_per_point);
712 /*--------------------------------------------------------------------------*/
713 /* PRIVATE. Construct round size page. */
714 /*--------------------------------------------------------------------------*/
716 construct_round_size_page (glTemplateDesigner *dialog,
722 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
723 "round_size_page", NULL);
726 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
730 dialog->priv->round_size_page = glade_xml_get_widget (gui, "round_size_page");
731 dialog->priv->round_image = glade_xml_get_widget (gui, "round_image");
732 dialog->priv->round_r_spin = glade_xml_get_widget (gui, "round_r_spin");
733 dialog->priv->round_waste_spin = glade_xml_get_widget (gui, "round_waste_spin");
734 dialog->priv->round_margin_spin = glade_xml_get_widget (gui, "round_margin_spin");
735 dialog->priv->round_r_units_label = glade_xml_get_widget (gui, "round_r_units_label");
736 dialog->priv->round_waste_units_label = glade_xml_get_widget (gui, "round_waste_units_label");
737 dialog->priv->round_margin_units_label = glade_xml_get_widget (gui, "round_margin_units_label");
739 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
740 dialog->priv->round_size_page);
742 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
743 dialog->priv->round_size_page,
744 _("Label Size (round)"));
745 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
746 dialog->priv->round_size_page,
748 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
749 dialog->priv->round_size_page,
752 /* Initialize illustration. */
753 pixbuf = gdk_pixbuf_new_from_file (EX_ROUND_IMAGE, NULL);
754 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->round_image), pixbuf);
756 /* Apply units to spinbuttons and units labels. */
757 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
758 dialog->priv->digits);
759 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
760 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
761 gtk_label_set_text (GTK_LABEL(dialog->priv->round_r_units_label),
762 dialog->priv->units_string);
763 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
764 dialog->priv->digits);
765 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
766 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
767 gtk_label_set_text (GTK_LABEL(dialog->priv->round_waste_units_label),
768 dialog->priv->units_string);
769 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
770 dialog->priv->digits);
771 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
772 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
773 gtk_label_set_text (GTK_LABEL(dialog->priv->round_margin_units_label),
774 dialog->priv->units_string);
776 /* Load some realistic defaults. */
777 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
778 DEFAULT_ROUND_R * dialog->priv->units_per_point);
779 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
780 DEFAULT_ROUND_WASTE * dialog->priv->units_per_point);
781 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
782 DEFAULT_MARGIN * dialog->priv->units_per_point);
786 /*--------------------------------------------------------------------------*/
787 /* PRIVATE. Construct CD/DVD size page. */
788 /*--------------------------------------------------------------------------*/
790 construct_cd_size_page (glTemplateDesigner *dialog,
796 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
797 "cd_size_page", NULL);
800 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
804 dialog->priv->cd_size_page = glade_xml_get_widget (gui, "cd_size_page");
805 dialog->priv->cd_image = glade_xml_get_widget (gui, "cd_image");
806 dialog->priv->cd_radius_spin = glade_xml_get_widget (gui, "cd_radius_spin");
807 dialog->priv->cd_hole_spin = glade_xml_get_widget (gui, "cd_hole_spin");
808 dialog->priv->cd_w_spin = glade_xml_get_widget (gui, "cd_w_spin");
809 dialog->priv->cd_h_spin = glade_xml_get_widget (gui, "cd_h_spin");
810 dialog->priv->cd_waste_spin = glade_xml_get_widget (gui, "cd_waste_spin");
811 dialog->priv->cd_margin_spin = glade_xml_get_widget (gui, "cd_margin_spin");
812 dialog->priv->cd_radius_units_label = glade_xml_get_widget (gui, "cd_radius_units_label");
813 dialog->priv->cd_hole_units_label = glade_xml_get_widget (gui, "cd_hole_units_label");
814 dialog->priv->cd_w_units_label = glade_xml_get_widget (gui, "cd_w_units_label");
815 dialog->priv->cd_h_units_label = glade_xml_get_widget (gui, "cd_h_units_label");
816 dialog->priv->cd_waste_units_label = glade_xml_get_widget (gui, "cd_waste_units_label");
817 dialog->priv->cd_margin_units_label = glade_xml_get_widget (gui, "cd_margin_units_label");
819 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
820 dialog->priv->cd_size_page);
822 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
823 dialog->priv->cd_size_page,
824 _("Label Size (CD/DVD)"));
825 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
826 dialog->priv->cd_size_page,
828 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
829 dialog->priv->cd_size_page,
832 /* Initialize illustration. */
833 pixbuf = gdk_pixbuf_new_from_file (EX_CD_IMAGE, NULL);
834 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->cd_image), pixbuf);
836 /* Apply units to spinbuttons and units labels. */
837 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
838 dialog->priv->digits);
839 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
840 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
841 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_radius_units_label),
842 dialog->priv->units_string);
843 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
844 dialog->priv->digits);
845 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
846 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
847 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_hole_units_label),
848 dialog->priv->units_string);
849 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
850 dialog->priv->digits);
851 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
852 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
853 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_w_units_label),
854 dialog->priv->units_string);
855 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
856 dialog->priv->digits);
857 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
858 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
859 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_h_units_label),
860 dialog->priv->units_string);
861 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
862 dialog->priv->digits);
863 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
864 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
865 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_waste_units_label),
866 dialog->priv->units_string);
867 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
868 dialog->priv->digits);
869 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
870 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
871 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_margin_units_label),
872 dialog->priv->units_string);
874 /* Load some realistic defaults. */
875 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
876 DEFAULT_CD_RADIUS * dialog->priv->units_per_point);
877 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
878 DEFAULT_CD_HOLE * dialog->priv->units_per_point);
879 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
880 DEFAULT_CD_WASTE * dialog->priv->units_per_point);
881 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
882 DEFAULT_MARGIN * dialog->priv->units_per_point);
886 /*--------------------------------------------------------------------------*/
887 /* PRIVATE. Construct number of layouts page. */
888 /*--------------------------------------------------------------------------*/
890 construct_nlayouts_page (glTemplateDesigner *dialog,
896 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
897 "nlayouts_page", NULL);
900 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
904 dialog->priv->nlayouts_page = glade_xml_get_widget (gui, "nlayouts_page");
905 dialog->priv->nlayouts_image1 = glade_xml_get_widget (gui, "nlayouts_image1");
906 dialog->priv->nlayouts_image2 = glade_xml_get_widget (gui, "nlayouts_image2");
907 dialog->priv->nlayouts_spin = glade_xml_get_widget (gui, "nlayouts_spin");
909 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
910 dialog->priv->nlayouts_page);
912 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
913 dialog->priv->nlayouts_page,
914 _("Number of Layouts"));
915 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
916 dialog->priv->nlayouts_page,
918 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
919 dialog->priv->nlayouts_page,
922 /* Initialize illustrations. */
923 pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE1, NULL);
924 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image1), pixbuf);
925 pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE2, NULL);
926 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image2), pixbuf);
930 /*--------------------------------------------------------------------------*/
931 /* PRIVATE. Construct layout page. */
932 /*--------------------------------------------------------------------------*/
934 construct_layout_page (glTemplateDesigner *dialog,
939 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
940 "layout_page", NULL);
943 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
947 dialog->priv->layout_page = glade_xml_get_widget (gui, "layout_page");
948 dialog->priv->layout1_head_label = glade_xml_get_widget (gui, "layout1_head_label");
949 dialog->priv->layout1_nx_spin = glade_xml_get_widget (gui, "layout1_nx_spin");
950 dialog->priv->layout1_ny_spin = glade_xml_get_widget (gui, "layout1_ny_spin");
951 dialog->priv->layout1_x0_spin = glade_xml_get_widget (gui, "layout1_x0_spin");
952 dialog->priv->layout1_y0_spin = glade_xml_get_widget (gui, "layout1_y0_spin");
953 dialog->priv->layout1_dx_spin = glade_xml_get_widget (gui, "layout1_dx_spin");
954 dialog->priv->layout1_dy_spin = glade_xml_get_widget (gui, "layout1_dy_spin");
955 dialog->priv->layout2_head_label = glade_xml_get_widget (gui, "layout2_head_label");
956 dialog->priv->layout2_nx_spin = glade_xml_get_widget (gui, "layout2_nx_spin");
957 dialog->priv->layout2_ny_spin = glade_xml_get_widget (gui, "layout2_ny_spin");
958 dialog->priv->layout2_x0_spin = glade_xml_get_widget (gui, "layout2_x0_spin");
959 dialog->priv->layout2_y0_spin = glade_xml_get_widget (gui, "layout2_y0_spin");
960 dialog->priv->layout2_dx_spin = glade_xml_get_widget (gui, "layout2_dx_spin");
961 dialog->priv->layout2_dy_spin = glade_xml_get_widget (gui, "layout2_dy_spin");
962 dialog->priv->layout_x0_units_label = glade_xml_get_widget (gui, "layout_x0_units_label");
963 dialog->priv->layout_y0_units_label = glade_xml_get_widget (gui, "layout_y0_units_label");
964 dialog->priv->layout_dx_units_label = glade_xml_get_widget (gui, "layout_dx_units_label");
965 dialog->priv->layout_dy_units_label = glade_xml_get_widget (gui, "layout_dy_units_label");
966 dialog->priv->layout_mini_preview = glade_xml_get_widget (gui, "layout_mini_preview");
967 dialog->priv->layout_test_button = glade_xml_get_widget (gui, "layout_test_button");
969 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
970 dialog->priv->layout_page);
972 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
973 dialog->priv->layout_page,
975 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
976 dialog->priv->layout_page,
978 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
979 dialog->priv->layout_page,
982 /* Apply units to spinbuttons and units labels. */
983 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
984 dialog->priv->digits);
985 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
986 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
987 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
988 dialog->priv->digits);
989 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
990 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
991 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_x0_units_label),
992 dialog->priv->units_string);
993 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
994 dialog->priv->digits);
995 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
996 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
997 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
998 dialog->priv->digits);
999 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1000 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1001 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_y0_units_label),
1002 dialog->priv->units_string);
1003 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1004 dialog->priv->digits);
1005 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1006 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1007 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1008 dialog->priv->digits);
1009 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1010 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1011 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dx_units_label),
1012 dialog->priv->units_string);
1013 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1014 dialog->priv->digits);
1015 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1016 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1017 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1018 dialog->priv->digits);
1019 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1020 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1021 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dy_units_label),
1022 dialog->priv->units_string);
1024 /* Connect a handler that listens for changes in these widgets */
1025 /* This controls sensitivity of related widgets. */
1026 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_nx_spin), "changed",
1027 G_CALLBACK(layout_page_changed_cb), dialog);
1028 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_ny_spin), "changed",
1029 G_CALLBACK(layout_page_changed_cb), dialog);
1030 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_x0_spin), "changed",
1031 G_CALLBACK(layout_page_changed_cb), dialog);
1032 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_y0_spin), "changed",
1033 G_CALLBACK(layout_page_changed_cb), dialog);
1034 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dx_spin), "changed",
1035 G_CALLBACK(layout_page_changed_cb), dialog);
1036 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dy_spin), "changed",
1037 G_CALLBACK(layout_page_changed_cb), dialog);
1038 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_nx_spin), "changed",
1039 G_CALLBACK(layout_page_changed_cb), dialog);
1040 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_ny_spin), "changed",
1041 G_CALLBACK(layout_page_changed_cb), dialog);
1042 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_x0_spin), "changed",
1043 G_CALLBACK(layout_page_changed_cb), dialog);
1044 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_y0_spin), "changed",
1045 G_CALLBACK(layout_page_changed_cb), dialog);
1046 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dx_spin), "changed",
1047 G_CALLBACK(layout_page_changed_cb), dialog);
1048 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dy_spin), "changed",
1049 G_CALLBACK(layout_page_changed_cb), dialog);
1053 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout_test_button), "clicked",
1054 G_CALLBACK(print_test_cb), dialog);
1058 /*--------------------------------------------------------------------------*/
1059 /* PRIVATE. Construct finish page. */
1060 /*--------------------------------------------------------------------------*/
1062 construct_finish_page (glTemplateDesigner *dialog,
1067 gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
1068 "finish_page", NULL);
1071 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
1075 dialog->priv->finish_page = glade_xml_get_widget (gui, "finish_page");
1077 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
1078 dialog->priv->finish_page);
1080 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
1081 dialog->priv->finish_page,
1082 _("Design Completed"));
1083 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
1084 dialog->priv->finish_page,
1086 gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
1087 dialog->priv->finish_page,
1088 GTK_ASSISTANT_PAGE_CONFIRM);
1089 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1090 dialog->priv->finish_page,
1095 /*--------------------------------------------------------------------------*/
1096 /* PRIVATE. cancel callback. */
1097 /*--------------------------------------------------------------------------*/
1099 cancel_cb (glTemplateDesigner *dialog)
1102 gtk_widget_destroy (GTK_WIDGET(dialog));
1106 /*--------------------------------------------------------------------------*/
1107 /* PRIVATE. apply callback */
1108 /*--------------------------------------------------------------------------*/
1110 apply_cb (glTemplateDesigner *dialog)
1112 glTemplate *template;
1114 template = build_template (dialog);
1115 gl_template_register (template);
1119 /*--------------------------------------------------------------------------*/
1120 /* PRIVATE. close callback */
1121 /*--------------------------------------------------------------------------*/
1123 close_cb (glTemplateDesigner *dialog)
1126 gtk_widget_destroy (GTK_WIDGET(dialog));
1130 /*--------------------------------------------------------------------------*/
1131 /* PRIVATE. prepare page callback */
1132 /*--------------------------------------------------------------------------*/
1134 prepare_cb (glTemplateDesigner *dialog,
1139 page_num = gtk_assistant_get_current_page (GTK_ASSISTANT (dialog));
1145 name_page_changed_cb (dialog); /* Use to prepare */
1148 case PG_SIZE_PAGE_NUM:
1149 pg_size_page_changed_cb (dialog); /* Use to prepare */
1152 case RECT_SIZE_PAGE_NUM:
1153 rect_size_page_prepare_cb (dialog);
1156 case ROUND_SIZE_PAGE_NUM:
1157 round_size_page_prepare_cb (dialog);
1160 case CD_SIZE_PAGE_NUM:
1161 cd_size_page_prepare_cb (dialog);
1164 case LAYOUT_PAGE_NUM:
1165 layout_page_prepare_cb (dialog);
1169 /* No preparation needed */
1175 /*--------------------------------------------------------------------------*/
1176 /* PRIVATE. Handle non-linear forward traversal. */
1177 /*--------------------------------------------------------------------------*/
1179 forward_page_function (gint current_page,
1182 glTemplateDesigner *dialog = GL_TEMPLATE_DESIGNER (data);
1184 switch (current_page)
1186 case START_PAGE_NUM:
1187 return NAME_PAGE_NUM;
1190 return PG_SIZE_PAGE_NUM;
1192 case PG_SIZE_PAGE_NUM:
1193 return SHAPE_PAGE_NUM;
1195 case SHAPE_PAGE_NUM:
1196 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1197 return RECT_SIZE_PAGE_NUM;
1199 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1200 return ROUND_SIZE_PAGE_NUM;
1202 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1203 return CD_SIZE_PAGE_NUM;
1207 case RECT_SIZE_PAGE_NUM:
1208 case ROUND_SIZE_PAGE_NUM:
1209 case CD_SIZE_PAGE_NUM:
1210 return NLAYOUTS_PAGE_NUM;
1212 case NLAYOUTS_PAGE_NUM:
1213 return LAYOUT_PAGE_NUM;
1215 case LAYOUT_PAGE_NUM:
1216 return FINISH_PAGE_NUM;
1218 case FINISH_PAGE_NUM:
1225 /*--------------------------------------------------------------------------*/
1226 /* PRIVATE. Widget on name page "changed" callback. */
1227 /*--------------------------------------------------------------------------*/
1229 name_page_changed_cb (glTemplateDesigner *dialog)
1231 gchar *brand, *part_num, *desc;
1233 brand = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1);
1234 part_num = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1);
1235 desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1237 if (brand && brand[0] && part_num && part_num[0] && desc && desc[0])
1240 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1241 dialog->priv->name_page,
1247 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1248 dialog->priv->name_page,
1257 /*--------------------------------------------------------------------------*/
1258 /* PRIVATE. Widget on page size page "changed" callback. */
1259 /*--------------------------------------------------------------------------*/
1261 pg_size_page_changed_cb (glTemplateDesigner *dialog)
1263 gchar *page_size_name;
1268 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1270 if (page_size_name && strlen(page_size_name)) {
1272 paper = gl_paper_from_name (page_size_name);
1275 if ( g_strcasecmp (paper->id, "Other") == 0 ) {
1276 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), TRUE);
1277 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), TRUE);
1278 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1280 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1284 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), FALSE);
1285 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), FALSE);
1286 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1288 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1291 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
1292 paper->width * dialog->priv->units_per_point);
1293 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
1294 paper->height * dialog->priv->units_per_point);
1297 gl_paper_free (paper);
1300 g_free (page_size_name);
1304 /*--------------------------------------------------------------------------*/
1305 /* PRIVATE. Prepare rectangular size page. */
1306 /*--------------------------------------------------------------------------*/
1308 rect_size_page_prepare_cb (glTemplateDesigner *dialog)
1310 gdouble max_w, max_h;
1311 gdouble w, h, r, x_waste, y_waste, margin;
1313 /* Limit label size based on already chosen page size. */
1314 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1315 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1317 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1318 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1319 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1320 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1321 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1322 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1324 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_w_spin),
1325 dialog->priv->climb_rate, max_w);
1326 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_h_spin),
1327 dialog->priv->climb_rate, max_h);
1328 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_r_spin),
1329 0.0, MIN(max_w, max_h)/2.0);
1330 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_x_waste_spin),
1331 0.0, MIN(max_w, max_h)/4.0);
1332 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_y_waste_spin),
1333 0.0, MIN(max_w, max_h)/4.0);
1334 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_margin_spin),
1335 0.0, MIN(max_w, max_h)/4.0);
1337 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), w);
1338 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), h);
1339 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), r);
1340 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), x_waste);
1341 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), y_waste);
1342 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), margin);
1346 /*--------------------------------------------------------------------------*/
1347 /* PRIVATE. Prepare round size page. */
1348 /*--------------------------------------------------------------------------*/
1350 round_size_page_prepare_cb (glTemplateDesigner *dialog)
1352 gdouble max_w, max_h;
1353 gdouble r, waste, margin;
1355 /* Limit label size based on already chosen page size. */
1356 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1357 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1359 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1360 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1361 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1363 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_r_spin),
1364 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1365 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_waste_spin),
1366 0.0, MIN(max_w, max_h)/4.0);
1367 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_margin_spin),
1368 0.0, MIN(max_w, max_h)/4.0);
1370 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), r);
1371 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), waste);
1372 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), margin);
1376 /*--------------------------------------------------------------------------*/
1377 /* PRIVATE. Prepare cd/dvd size page. */
1378 /*--------------------------------------------------------------------------*/
1380 cd_size_page_prepare_cb (glTemplateDesigner *dialog)
1382 gdouble max_w, max_h;
1383 gdouble radius, hole, w, h, waste, margin;
1385 /* Limit label size based on already chosen page size. */
1386 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1387 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1389 radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1390 hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1391 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1392 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1393 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1394 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1396 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_radius_spin),
1397 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1398 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_hole_spin),
1399 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1400 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_w_spin),
1402 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_h_spin),
1404 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_waste_spin),
1405 0.0, MIN(max_w, max_h)/4.0);
1406 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_margin_spin),
1407 0.0, MIN(max_w, max_h)/4.0);
1409 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), radius);
1410 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), hole);
1411 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), w);
1412 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), h);
1413 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), waste);
1414 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), margin);
1418 /*--------------------------------------------------------------------------*/
1419 /* PRIVATE. Layout page widget changed cb. */
1420 /*--------------------------------------------------------------------------*/
1422 layout_page_prepare_cb (glTemplateDesigner *dialog)
1424 gdouble page_w, page_h;
1425 gdouble w, h, x_waste, y_waste;
1426 gint max_nx, max_ny;
1428 gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1429 gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1431 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_nx_spin),
1432 G_CALLBACK(layout_page_changed_cb),
1434 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_ny_spin),
1435 G_CALLBACK(layout_page_changed_cb),
1437 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_x0_spin),
1438 G_CALLBACK(layout_page_changed_cb),
1440 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_y0_spin),
1441 G_CALLBACK(layout_page_changed_cb),
1443 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_dx_spin),
1444 G_CALLBACK(layout_page_changed_cb),
1446 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_dy_spin),
1447 G_CALLBACK(layout_page_changed_cb),
1449 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_nx_spin),
1450 G_CALLBACK(layout_page_changed_cb),
1452 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_ny_spin),
1453 G_CALLBACK(layout_page_changed_cb),
1455 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_x0_spin),
1456 G_CALLBACK(layout_page_changed_cb),
1458 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_y0_spin),
1459 G_CALLBACK(layout_page_changed_cb),
1461 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_dx_spin),
1462 G_CALLBACK(layout_page_changed_cb),
1464 g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_dy_spin),
1465 G_CALLBACK(layout_page_changed_cb),
1468 /* Limit ranges based on already chosen page and label sizes. */
1469 page_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1470 page_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1471 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1472 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1473 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1474 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1475 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1477 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1478 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1480 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1483 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1484 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1486 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1489 max_nx = MAX (floor (page_w/(w + 2*x_waste) + DELTA), 1.0);
1490 max_ny = MAX (floor (page_h/(h + 2*y_waste) + DELTA), 1.0);
1492 nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1493 ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1494 x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1495 y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1496 dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1497 dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1498 nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1499 ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1500 x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1501 y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1502 dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1503 dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1505 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_nx_spin),
1507 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_ny_spin),
1509 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_x0_spin),
1510 x_waste, page_w - w - x_waste);
1511 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_y0_spin),
1512 y_waste, page_h - h - y_waste);
1513 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dx_spin),
1514 w + 2*x_waste, page_w - w - 2*x_waste);
1515 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dy_spin),
1516 h + 2*y_waste, page_h - h - 2*y_waste);
1517 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_nx_spin),
1519 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_ny_spin),
1521 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_x0_spin),
1522 x_waste, page_w - w - x_waste);
1523 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_y0_spin),
1524 y_waste, page_h - h - y_waste);
1525 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dx_spin),
1526 w + 2*x_waste, page_w - w - 2*x_waste);
1527 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dy_spin),
1528 h + 2*y_waste, page_h - h - 2*y_waste);
1530 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), nx_1);
1531 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), ny_1);
1532 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), x0_1);
1533 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), y0_1);
1534 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), dx_1);
1535 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), dy_1);
1536 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), nx_2);
1537 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), ny_2);
1538 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), x0_2);
1539 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), y0_2);
1540 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), dx_2);
1541 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), dy_2);
1543 /* Set visibility of layout2 widgets as appropriate. */
1544 nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1545 if ( nlayouts == 1 ) {
1547 gtk_widget_hide (dialog->priv->layout1_head_label);
1548 gtk_widget_hide (dialog->priv->layout2_head_label);
1549 gtk_widget_hide (dialog->priv->layout2_nx_spin);
1550 gtk_widget_hide (dialog->priv->layout2_ny_spin);
1551 gtk_widget_hide (dialog->priv->layout2_x0_spin);
1552 gtk_widget_hide (dialog->priv->layout2_y0_spin);
1553 gtk_widget_hide (dialog->priv->layout2_dx_spin);
1554 gtk_widget_hide (dialog->priv->layout2_dy_spin);
1558 gtk_widget_show (dialog->priv->layout1_head_label);
1559 gtk_widget_show (dialog->priv->layout2_head_label);
1560 gtk_widget_show (dialog->priv->layout2_nx_spin);
1561 gtk_widget_show (dialog->priv->layout2_ny_spin);
1562 gtk_widget_show (dialog->priv->layout2_x0_spin);
1563 gtk_widget_show (dialog->priv->layout2_y0_spin);
1564 gtk_widget_show (dialog->priv->layout2_dx_spin);
1565 gtk_widget_show (dialog->priv->layout2_dy_spin);
1569 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_nx_spin),
1570 G_CALLBACK(layout_page_changed_cb),
1572 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_ny_spin),
1573 G_CALLBACK(layout_page_changed_cb),
1575 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_x0_spin),
1576 G_CALLBACK(layout_page_changed_cb),
1578 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_y0_spin),
1579 G_CALLBACK(layout_page_changed_cb),
1581 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_dx_spin),
1582 G_CALLBACK(layout_page_changed_cb),
1584 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_dy_spin),
1585 G_CALLBACK(layout_page_changed_cb),
1587 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_nx_spin),
1588 G_CALLBACK(layout_page_changed_cb),
1590 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_ny_spin),
1591 G_CALLBACK(layout_page_changed_cb),
1593 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_x0_spin),
1594 G_CALLBACK(layout_page_changed_cb),
1596 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_y0_spin),
1597 G_CALLBACK(layout_page_changed_cb),
1599 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_dx_spin),
1600 G_CALLBACK(layout_page_changed_cb),
1602 g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_dy_spin),
1603 G_CALLBACK(layout_page_changed_cb),
1606 layout_page_changed_cb (dialog);
1609 /*--------------------------------------------------------------------------*/
1610 /* PRIVATE. Layout page widget changed cb. */
1611 /*--------------------------------------------------------------------------*/
1613 layout_page_changed_cb (glTemplateDesigner *dialog)
1615 glTemplate *template;
1617 template = build_template (dialog);
1619 gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview),
1622 gl_template_free (template);
1625 /*--------------------------------------------------------------------------*/
1626 /* PRIVATE. Print test sheet callback. */
1627 /*--------------------------------------------------------------------------*/
1629 print_test_cb (glTemplateDesigner *dialog)
1632 glTemplate *template;
1633 glPrintOp *print_op;
1635 label = gl_label_new ();
1637 template = build_template (dialog);
1638 gl_label_set_template (GL_LABEL(label), template);
1640 print_op = gl_print_op_new (GL_LABEL(label));
1641 gl_print_op_force_outline_flag (print_op);
1642 gtk_print_operation_run (GTK_PRINT_OPERATION (print_op),
1643 GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
1644 GTK_WINDOW (dialog),
1647 gl_template_free (template);
1648 g_object_unref (G_OBJECT(label));
1651 /*--------------------------------------------------------------------------*/
1652 /* Build a template based on current assistant settings. */
1653 /*--------------------------------------------------------------------------*/
1655 build_template (glTemplateDesigner *dialog)
1658 gchar *brand, *part_num, *name, *desc;
1659 gchar *page_size_name;
1661 glTemplateLabelShape shape;
1662 glTemplateLabelType *label_type;
1663 gdouble w, h, r, radius, hole, waste, x_waste, y_waste, margin;
1665 gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1666 gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1667 glTemplate *template;
1669 upp = dialog->priv->units_per_point;
1671 brand = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1);
1672 part_num = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1);
1673 name = g_strdup_printf ("%s %s", brand, part_num);
1674 desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1677 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1678 paper = gl_paper_from_name (page_size_name);
1679 if ( g_strcasecmp (paper->id, "Other") == 0 ) {
1681 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin))
1684 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin))
1688 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1689 shape = GL_TEMPLATE_SHAPE_RECT;
1690 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1691 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1692 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1693 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1694 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1695 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1698 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1699 shape = GL_TEMPLATE_SHAPE_ROUND;
1700 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1701 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1702 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1705 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1706 shape = GL_TEMPLATE_SHAPE_CD;
1707 radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1708 hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1709 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1710 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1711 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1712 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1715 nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1716 nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1717 ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1718 x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1719 y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1720 dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1721 dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1722 nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1723 ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1724 x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1725 y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1726 dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1727 dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1730 template = gl_template_new (name, desc, paper->id, paper->width, paper->height);
1733 case GL_TEMPLATE_SHAPE_RECT:
1735 gl_template_rect_label_type_new ("0",
1736 w/upp, h/upp, r/upp,
1737 x_waste/upp, y_waste/upp);
1739 case GL_TEMPLATE_SHAPE_ROUND:
1741 gl_template_round_label_type_new ("0", r/upp, waste/upp);
1743 case GL_TEMPLATE_SHAPE_CD:
1745 gl_template_cd_label_type_new ("0",
1746 radius/upp, hole/upp,
1751 gl_template_add_label_type (template, label_type);
1753 gl_template_add_markup (label_type,
1754 gl_template_markup_margin_new (margin/upp));
1756 gl_template_add_layout (label_type,
1757 gl_template_layout_new (nx_1, ny_1,
1763 gl_template_add_layout (label_type,
1764 gl_template_layout_new (nx_2, ny_2,
1776 g_free (page_size_name);
1777 gl_paper_free (paper);
1782 /*****************************************************************************/
1783 /* Construct mini preview widget. */
1784 /*****************************************************************************/
1786 gl_template_designer_construct_mini_preview (gchar *name,
1795 return gl_wdgt_mini_preview_new (height, width);