]> git.sur5r.net Git - glabels/blob - glabels2/src/template-designer.c
2009-08-23 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / template-designer.c
1 /*
2  *  template-designer.c
3  *  Copyright (C) 2003-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "template-designer.h"
24
25 #include <glib/gi18n.h>
26 #include <gtk/gtkbuilder.h>
27 #include <gtk/gtktogglebutton.h>
28 #include <gtk/gtkcombobox.h>
29 #include <gtk/gtkspinbutton.h>
30 #include <gtk/gtklabel.h>
31 #include <string.h>
32 #include <math.h>
33
34 #include "prefs.h"
35 #include <libglabels/db.h>
36 #include "wdgt-mini-preview.h"
37 #include "mini-preview-pixbuf-cache.h"
38 #include "print-op.h"
39 #include "util.h"
40
41 #include "debug.h"
42
43
44 /*========================================================*/
45 /* Private macros and constants.                          */
46 /*========================================================*/
47 #define ICON_PIXMAP        (GLABELS_ICON_DIR "glabels.png")
48
49 #define EX_RECT_IMAGE      (GLABELS_PIXMAP_DIR "ex-rect-size.png")
50 #define EX_ROUND_IMAGE     (GLABELS_PIXMAP_DIR "ex-round-size.png")
51 #define EX_CD_IMAGE        (GLABELS_PIXMAP_DIR "ex-cd-size.png")
52 #define EX_NLAYOUTS_IMAGE1 (GLABELS_PIXMAP_DIR "ex-1layout.png")
53 #define EX_NLAYOUTS_IMAGE2 (GLABELS_PIXMAP_DIR "ex-2layouts.png")
54
55 #define DEFAULT_MARGIN 9.0
56
57 #define DEFAULT_RECT_W      252.0
58 #define DEFAULT_RECT_H      144.0
59 #define DEFAULT_RECT_R        0.0
60 #define DEFAULT_RECT_WASTE    0.0 /* Should never exceed 1/2 the distance between items. */
61
62 #define DEFAULT_ROUND_R      72.0
63 #define DEFAULT_ROUND_WASTE   0.0 /* Should never exceed 1/2 the distance between items. */
64
65 #define DEFAULT_CD_RADIUS   166.5
66 #define DEFAULT_CD_HOLE      58.5
67 #define DEFAULT_CD_WASTE      9.0 /* Should never exceed 1/2 the distance between items. */
68
69 #define DELTA 0.01
70 #define MAX_PAGE_DIM_POINTS 5000.0
71
72
73 /*========================================================*/
74 /* Private types.                                         */
75 /*========================================================*/
76
77 struct _glTemplateDesignerPrivate
78 {
79         GtkBuilder      *builder;
80
81         /* Assistant pages */
82         GtkWidget       *start_page;
83         GtkWidget       *name_page;
84         GtkWidget       *pg_size_page;
85         GtkWidget       *shape_page;
86         GtkWidget       *rect_size_page;
87         GtkWidget       *round_size_page;
88         GtkWidget       *cd_size_page;
89         GtkWidget       *nlayouts_page;
90         GtkWidget       *layout_page;
91         GtkWidget       *finish_page;
92
93         /* Name page controls */
94         GtkWidget       *brand_entry;
95         GtkWidget       *part_num_entry;
96         GtkWidget       *name_warning_image;
97         GtkWidget       *name_warning_label;
98         GtkWidget       *description_entry;
99
100         /* Page size page controls */
101         GtkWidget       *pg_size_combo;
102         GtkWidget       *pg_w_spin;
103         GtkWidget       *pg_h_spin;
104         GtkWidget       *pg_w_units_label;
105         GtkWidget       *pg_h_units_label;
106
107         /* Shape page controls */
108         GtkWidget       *shape_rect_radio;
109         GtkWidget       *shape_round_radio;
110         GtkWidget       *shape_cd_radio;
111
112         /* Label size (rectangular) page controls */
113         GtkWidget       *rect_image;
114         GtkWidget       *rect_w_spin;
115         GtkWidget       *rect_h_spin;
116         GtkWidget       *rect_r_spin;
117         GtkWidget       *rect_x_waste_spin;
118         GtkWidget       *rect_y_waste_spin;
119         GtkWidget       *rect_margin_spin;
120         GtkWidget       *rect_w_units_label;
121         GtkWidget       *rect_h_units_label;
122         GtkWidget       *rect_r_units_label;
123         GtkWidget       *rect_x_waste_units_label;
124         GtkWidget       *rect_y_waste_units_label;
125         GtkWidget       *rect_margin_units_label;
126
127         /* Label size (round) page controls */
128         GtkWidget       *round_image;
129         GtkWidget       *round_r_spin;
130         GtkWidget       *round_waste_spin;
131         GtkWidget       *round_margin_spin;
132         GtkWidget       *round_r_units_label;
133         GtkWidget       *round_waste_units_label;
134         GtkWidget       *round_margin_units_label;
135
136         /* Label size (cd) page controls */
137         GtkWidget       *cd_image;
138         GtkWidget       *cd_radius_spin;
139         GtkWidget       *cd_hole_spin;
140         GtkWidget       *cd_w_spin;
141         GtkWidget       *cd_h_spin;
142         GtkWidget       *cd_waste_spin;
143         GtkWidget       *cd_margin_spin;
144         GtkWidget       *cd_radius_units_label;
145         GtkWidget       *cd_hole_units_label;
146         GtkWidget       *cd_w_units_label;
147         GtkWidget       *cd_h_units_label;
148         GtkWidget       *cd_waste_units_label;
149         GtkWidget       *cd_margin_units_label;
150
151         /* Number of layouts controls */
152         GtkWidget       *nlayouts_image1;
153         GtkWidget       *nlayouts_image2;
154         GtkWidget       *nlayouts_spin;
155
156         /* Layout page controls */
157         GtkWidget       *layout1_head_label;
158         GtkWidget       *layout1_nx_spin;
159         GtkWidget       *layout1_ny_spin;
160         GtkWidget       *layout1_x0_spin;
161         GtkWidget       *layout1_y0_spin;
162         GtkWidget       *layout1_dx_spin;
163         GtkWidget       *layout1_dy_spin;
164         GtkWidget       *layout2_head_label;
165         GtkWidget       *layout2_nx_spin;
166         GtkWidget       *layout2_ny_spin;
167         GtkWidget       *layout2_x0_spin;
168         GtkWidget       *layout2_y0_spin;
169         GtkWidget       *layout2_dx_spin;
170         GtkWidget       *layout2_dy_spin;
171         GtkWidget       *layout_x0_units_label;
172         GtkWidget       *layout_y0_units_label;
173         GtkWidget       *layout_dx_units_label;
174         GtkWidget       *layout_dy_units_label;
175         GtkWidget       *mini_preview_vbox;
176         GtkWidget       *layout_mini_preview;
177         GtkWidget       *layout_test_button;
178
179         /* Units related stuff */
180         const gchar     *units_string;
181         gdouble          units_per_point;
182         gdouble          climb_rate;
183         gint             digits;
184
185         /* Prevent recursion */
186         gboolean    stop_signals;
187 };
188
189 /* Page numbers for traversing GtkAssistant */
190 enum {
191         START_PAGE_NUM = 0,
192         NAME_PAGE_NUM,
193         PG_SIZE_PAGE_NUM,
194         SHAPE_PAGE_NUM,
195         RECT_SIZE_PAGE_NUM,
196         ROUND_SIZE_PAGE_NUM,
197         CD_SIZE_PAGE_NUM,
198         NLAYOUTS_PAGE_NUM,
199         LAYOUT_PAGE_NUM,
200         FINISH_PAGE_NUM
201 };
202
203
204 /*========================================================*/
205 /* Private globals.                                       */
206 /*========================================================*/
207
208
209 /*========================================================*/
210 /* Private function prototypes.                           */
211 /*========================================================*/
212
213 static void gl_template_designer_finalize         (GObject                 *object);
214 static void gl_template_designer_construct        (glTemplateDesigner      *dialog);
215
216 static void     construct_start_page              (glTemplateDesigner      *dialog,
217                                                    GdkPixbuf               *logo);
218
219 static void     construct_name_page               (glTemplateDesigner      *dialog,
220                                                    GdkPixbuf               *logo);
221
222 static void     construct_pg_size_page            (glTemplateDesigner      *dialog,
223                                                    GdkPixbuf               *logo);
224
225 static void     construct_shape_page              (glTemplateDesigner      *dialog,
226                                                    GdkPixbuf               *logo);
227
228 static void     construct_rect_size_page          (glTemplateDesigner      *dialog,
229                                                    GdkPixbuf               *logo);
230
231 static void     construct_round_size_page         (glTemplateDesigner      *dialog,
232                                                    GdkPixbuf               *logo);
233
234 static void     construct_cd_size_page            (glTemplateDesigner      *dialog,
235                                                    GdkPixbuf               *logo);
236
237 static void     construct_nlayouts_page           (glTemplateDesigner      *dialog,
238                                                    GdkPixbuf               *logo);
239
240 static void     construct_layout_page             (glTemplateDesigner      *dialog,
241                                                    GdkPixbuf               *logo);
242
243 static void     construct_finish_page             (glTemplateDesigner      *dialog,
244                                                    GdkPixbuf               *logo);
245
246 static void     cancel_cb                         (glTemplateDesigner      *dialog);
247 static void     apply_cb                          (glTemplateDesigner      *dialog);
248 static void     close_cb                          (glTemplateDesigner      *dialog);
249 static void     prepare_cb                        (glTemplateDesigner      *dialog,
250                                                    GtkWidget               *page);
251
252 static gint     forward_page_function             (gint                     current_page,
253                                                    gpointer                 data);
254
255 static void     name_page_changed_cb              (glTemplateDesigner      *dialog);
256
257 static void     pg_size_page_changed_cb           (glTemplateDesigner      *dialog);
258
259 static void     rect_size_page_prepare_cb         (glTemplateDesigner      *dialog);
260
261 static void     round_size_page_prepare_cb        (glTemplateDesigner      *dialog);
262
263 static void     cd_size_page_prepare_cb           (glTemplateDesigner      *dialog);
264
265 static void     layout_page_prepare_cb            (glTemplateDesigner      *dialog);
266
267 static void     layout_page_changed_cb            (glTemplateDesigner      *dialog);
268
269 static void     print_test_cb                     (glTemplateDesigner      *dialog);
270
271 static lglTemplate *build_template                (glTemplateDesigner      *dialog);
272
273
274 /*****************************************************************************/
275 /* Boilerplate object stuff.                                                 */
276 /*****************************************************************************/
277 G_DEFINE_TYPE (glTemplateDesigner, gl_template_designer, GTK_TYPE_ASSISTANT);
278
279
280 static void
281 gl_template_designer_class_init (glTemplateDesignerClass *class)
282 {
283         GObjectClass *object_class = G_OBJECT_CLASS (class);
284
285         gl_template_designer_parent_class = g_type_class_peek_parent (class);
286
287         object_class->finalize = gl_template_designer_finalize;         
288 }
289
290
291 static void
292 gl_template_designer_init (glTemplateDesigner *dialog)
293 {
294         GtkBuilder        *gui;
295         static gchar      *object_ids[] = { "start_page",
296                                             "name_page",
297                                             "pg_size_page",
298                                             "shape_page",
299                                             "rect_size_page",
300                                             "round_size_page",
301                                             "cd_size_page",
302                                             "nlayouts_page",
303                                             "layout_page",
304                                             "finish_page",
305                                             "adjustment1",  "adjustment2",  "adjustment3",
306                                             "adjustment4",  "adjustment5",  "adjustment6",
307                                             "adjustment7",  "adjustment8",  "adjustment9",
308                                             "adjustment10", "adjustment11", "adjustment12",
309                                             "adjustment13", "adjustment14", "adjustment15",
310                                             "adjustment16", "adjustment17", "adjustment18",
311                                             "adjustment19", "adjustment20", "adjustment21",
312                                             "adjustment22", "adjustment23", "adjustment24",
313                                             "adjustment25", "adjustment26", "adjustment27",
314                                             "adjustment28", "adjustment29", "adjustment30",
315                                             NULL };
316         GError            *error = NULL;
317
318         gl_debug (DEBUG_TEMPLATE, "START");
319
320         dialog->priv = g_new0 (glTemplateDesignerPrivate, 1);
321
322         dialog->priv->builder = gtk_builder_new ();
323         gtk_builder_add_objects_from_file (dialog->priv->builder,
324                                            GLABELS_BUILDER_DIR "template-designer.builder",
325                                            object_ids,
326                                            &error);
327         if (error) {
328                 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
329                 g_error_free (error);
330                 return;
331         }
332
333         gl_debug (DEBUG_TEMPLATE, "END");
334
335         return;
336 }
337
338
339 static void 
340 gl_template_designer_finalize (GObject *object)
341 {
342         glTemplateDesigner* dialog = GL_TEMPLATE_DESIGNER (object);
343         
344         gl_debug (DEBUG_TEMPLATE, "START");
345
346         g_return_if_fail (object != NULL);
347         g_return_if_fail (GL_IS_TEMPLATE_DESIGNER (dialog));
348         g_return_if_fail (dialog->priv != NULL);
349
350         if (dialog->priv->builder)
351         {
352                 g_object_unref (dialog->priv->builder);
353         }
354         g_free (dialog->priv);
355
356         G_OBJECT_CLASS (gl_template_designer_parent_class)->finalize (object);
357
358         gl_debug (DEBUG_TEMPLATE, "END");
359 }
360
361
362 /*****************************************************************************/
363 /* NEW preferences dialog.                                                   */
364 /*****************************************************************************/
365 GtkWidget*
366 gl_template_designer_new (GtkWindow *parent)
367 {
368         GtkWidget *dialog;
369
370         gl_debug (DEBUG_TEMPLATE, "START");
371
372         dialog = GTK_WIDGET (g_object_new (GL_TYPE_TEMPLATE_DESIGNER, NULL));
373
374         if (parent)
375                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
376         
377         gl_template_designer_construct (GL_TEMPLATE_DESIGNER(dialog));
378
379
380         gl_debug (DEBUG_TEMPLATE, "END");
381
382         return dialog;
383 }
384
385
386 /*---------------------------------------------------------------------------*/
387 /* PRIVATE.  Construct composite widget.                                     */
388 /*---------------------------------------------------------------------------*/
389 static void
390 gl_template_designer_construct (glTemplateDesigner *dialog)
391 {
392         GdkPixbuf  *logo;
393
394         gl_debug (DEBUG_TEMPLATE, "START");
395
396         g_return_if_fail (dialog && GL_IS_TEMPLATE_DESIGNER (dialog));
397         g_return_if_fail (dialog->priv != NULL);
398
399         /* Initialize units stuff from prefs */
400         dialog->priv->units_string    = gl_prefs_get_units_string ();
401         dialog->priv->units_per_point = gl_prefs_get_units_per_point ();
402         dialog->priv->climb_rate      = gl_prefs_get_units_step_size ();
403         dialog->priv->digits          = gl_prefs_get_units_precision ();
404
405         gtk_window_set_title (GTK_WINDOW(dialog), _("gLabels Template Designer"));
406
407         logo = gdk_pixbuf_new_from_file (ICON_PIXMAP, NULL);
408
409         /* Costruct and append pages (must be same order as PAGE_NUM enums. */
410         construct_start_page (dialog, logo);
411         construct_name_page (dialog, logo);
412         construct_pg_size_page (dialog, logo);
413         construct_shape_page (dialog, logo);
414         construct_rect_size_page (dialog, logo);
415         construct_round_size_page (dialog, logo);
416         construct_cd_size_page (dialog, logo);
417         construct_nlayouts_page (dialog, logo);
418         construct_layout_page (dialog, logo);
419         construct_finish_page (dialog, logo);
420
421         gtk_assistant_set_forward_page_func (GTK_ASSISTANT (dialog),
422                                              forward_page_function,
423                                              dialog,
424                                              NULL);
425
426         /* signals */
427         g_signal_connect_swapped (G_OBJECT(dialog), "cancel",
428                                   G_CALLBACK(cancel_cb), dialog);
429         g_signal_connect_swapped (G_OBJECT(dialog), "apply",
430                                   G_CALLBACK(apply_cb), dialog);
431         g_signal_connect_swapped (G_OBJECT(dialog), "close",
432                                   G_CALLBACK(close_cb), dialog);
433         g_signal_connect (G_OBJECT(dialog), "prepare",
434                           G_CALLBACK(prepare_cb), NULL);
435
436         gtk_widget_show_all (GTK_WIDGET(dialog));   
437
438         gl_debug (DEBUG_TEMPLATE, "END");
439 }
440
441
442 /*--------------------------------------------------------------------------*/
443 /* PRIVATE.  Construct start page.                                          */
444 /*--------------------------------------------------------------------------*/
445 static void
446 construct_start_page (glTemplateDesigner      *dialog,
447                       GdkPixbuf               *logo)
448 {
449         gl_debug (DEBUG_TEMPLATE, "START");
450
451         gl_util_get_builder_widgets (dialog->priv->builder,
452                                      "start_page", &dialog->priv->start_page,
453                                      NULL);
454
455         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
456                                    dialog->priv->start_page);
457
458         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
459                                       dialog->priv->start_page,
460                                       _("Welcome"));
461         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
462                                              dialog->priv->start_page,
463                                              logo);
464         gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
465                                      dialog->priv->start_page,
466                                      GTK_ASSISTANT_PAGE_INTRO);
467         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
468                                          dialog->priv->start_page,
469                                          TRUE);
470
471         gl_debug (DEBUG_TEMPLATE, "END");
472 }
473
474
475 /*--------------------------------------------------------------------------*/
476 /* PRIVATE.  Construct name page.                                           */
477 /*--------------------------------------------------------------------------*/
478 static void
479 construct_name_page (glTemplateDesigner      *dialog,
480                      GdkPixbuf               *logo)
481 {
482         gl_debug (DEBUG_TEMPLATE, "START");
483
484         gl_util_get_builder_widgets (dialog->priv->builder,
485                                      "name_page",          &dialog->priv->name_page,
486                                      "brand_entry",        &dialog->priv->brand_entry,
487                                      "part_num_entry",     &dialog->priv->part_num_entry,
488                                      "name_warning_image", &dialog->priv->name_warning_image,
489                                      "name_warning_label", &dialog->priv->name_warning_label,
490                                      "description_entry",  &dialog->priv->description_entry,
491                                      NULL);
492
493
494         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
495                                    dialog->priv->name_page);
496
497         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
498                                       dialog->priv->name_page,
499                                       _("Name and Description"));
500         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
501                                              dialog->priv->name_page,
502                                              logo);
503
504         /* Connect a handler that listens for changes in these widgets */
505         /* This controls whether we can progress to the next page. */
506         g_signal_connect_swapped (G_OBJECT(dialog->priv->brand_entry), "changed",
507                                   G_CALLBACK(name_page_changed_cb), dialog);
508         g_signal_connect_swapped (G_OBJECT(dialog->priv->part_num_entry), "changed",
509                                   G_CALLBACK(name_page_changed_cb), dialog);
510         g_signal_connect_swapped (G_OBJECT(dialog->priv->description_entry), "changed",
511                                   G_CALLBACK(name_page_changed_cb), dialog);
512
513         gl_debug (DEBUG_TEMPLATE, "END");
514 }
515
516
517 /*--------------------------------------------------------------------------*/
518 /* PRIVATE. Construct page size page.                                       */
519 /*--------------------------------------------------------------------------*/
520 static void
521 construct_pg_size_page (glTemplateDesigner      *dialog,
522                         GdkPixbuf               *logo)
523 {
524         GList           *page_sizes;
525         const gchar     *default_page_size_id;
526         gchar           *default_page_size_name;
527
528         gl_debug (DEBUG_TEMPLATE, "START");
529
530         gl_util_get_builder_widgets (dialog->priv->builder,
531                                      "pg_size_page",     &dialog->priv->pg_size_page,
532                                      "pg_size_combo",    &dialog->priv->pg_size_combo,
533                                      "pg_w_spin",        &dialog->priv->pg_w_spin,
534                                      "pg_h_spin",        &dialog->priv->pg_h_spin,
535                                      "pg_w_units_label", &dialog->priv->pg_w_units_label,
536                                      "pg_h_units_label", &dialog->priv->pg_h_units_label,
537                                      NULL);
538
539
540         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
541
542         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
543                                    dialog->priv->pg_size_page);
544
545         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
546                                       dialog->priv->pg_size_page,
547                                       _("Page Size"));
548         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
549                                              dialog->priv->pg_size_page,
550                                              logo);
551         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
552                                          dialog->priv->pg_size_page,
553                                          TRUE);
554
555         /* Load page size combo */
556         page_sizes = lgl_db_get_paper_name_list ();
557         gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->pg_size_combo), page_sizes);
558         lgl_db_free_paper_name_list (page_sizes);
559         default_page_size_id = gl_prefs_get_page_size ();
560         default_page_size_name = lgl_db_lookup_paper_name_from_id (default_page_size_id);
561         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), default_page_size_name);
562         g_free (default_page_size_name);
563
564         /* Apply units to spinbuttons and units labels. */
565         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
566                                     dialog->priv->digits);
567         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
568                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
569         gtk_label_set_text (GTK_LABEL(dialog->priv->pg_w_units_label),
570                             dialog->priv->units_string);
571         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_w_spin),
572                                    0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
573         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
574                                     dialog->priv->digits);
575         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
576                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
577         gtk_label_set_text (GTK_LABEL(dialog->priv->pg_h_units_label),
578                             dialog->priv->units_string);
579         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_h_spin),
580                                    0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
581
582         /* Connect a handler that listens for changes in these widgets */
583         /* This controls sensitivity of related widgets. */
584         g_signal_connect_swapped (G_OBJECT(dialog->priv->pg_size_combo), "changed",
585                                   G_CALLBACK(pg_size_page_changed_cb), dialog);
586
587         gl_debug (DEBUG_TEMPLATE, "END");
588 }
589
590
591 /*--------------------------------------------------------------------------*/
592 /* PRIVATE.  Construct shape page.                                          */
593 /*--------------------------------------------------------------------------*/
594 static void
595 construct_shape_page (glTemplateDesigner      *dialog,
596                       GdkPixbuf               *logo)
597 {
598         gl_debug (DEBUG_TEMPLATE, "START");
599
600         gl_util_get_builder_widgets (dialog->priv->builder,
601                                      "shape_page",        &dialog->priv->shape_page,
602                                      "shape_rect_radio",  &dialog->priv->shape_rect_radio,
603                                      "shape_round_radio", &dialog->priv->shape_round_radio,
604                                      "shape_cd_radio",    &dialog->priv->shape_cd_radio,
605                                      NULL);
606
607
608         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
609                                    dialog->priv->shape_page);
610
611         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
612                                       dialog->priv->shape_page,
613                                       _("Label or Card Shape"));
614         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
615                                              dialog->priv->shape_page,
616                                              logo);
617         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
618                                          dialog->priv->shape_page,
619                                          TRUE);
620
621         gl_debug (DEBUG_TEMPLATE, "END");
622 }
623
624
625 /*--------------------------------------------------------------------------*/
626 /* PRIVATE.  Construct rect size page.                                      */
627 /*--------------------------------------------------------------------------*/
628 static void
629 construct_rect_size_page (glTemplateDesigner      *dialog,
630                           GdkPixbuf               *logo)
631 {
632         GdkPixbuf       *pixbuf;
633
634         gl_debug (DEBUG_TEMPLATE, "START");
635
636         gl_util_get_builder_widgets (dialog->priv->builder,
637                                      "rect_size_page",           &dialog->priv->rect_size_page,
638                                      "rect_image",               &dialog->priv->rect_image,
639                                      "rect_w_spin",              &dialog->priv->rect_w_spin,
640                                      "rect_h_spin",              &dialog->priv->rect_h_spin,
641                                      "rect_r_spin",              &dialog->priv->rect_r_spin,
642                                      "rect_x_waste_spin",        &dialog->priv->rect_x_waste_spin,
643                                      "rect_y_waste_spin",        &dialog->priv->rect_y_waste_spin,
644                                      "rect_margin_spin",         &dialog->priv->rect_margin_spin,
645                                      "rect_w_units_label",       &dialog->priv->rect_w_units_label,
646                                      "rect_h_units_label",       &dialog->priv->rect_h_units_label,
647                                      "rect_r_units_label",       &dialog->priv->rect_r_units_label,
648                                      "rect_x_waste_units_label", &dialog->priv->rect_x_waste_units_label,
649                                      "rect_y_waste_units_label", &dialog->priv->rect_y_waste_units_label,
650                                      "rect_margin_units_label",  &dialog->priv->rect_margin_units_label,
651                                      NULL);
652
653
654         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
655                                    dialog->priv->rect_size_page);
656
657         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
658                                       dialog->priv->rect_size_page,
659                                       _("Label or Card Size"));
660         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
661                                              dialog->priv->rect_size_page,
662                                              logo);
663         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
664                                          dialog->priv->rect_size_page,
665                                          TRUE);
666
667         /* Initialize illustration. */
668         pixbuf = gdk_pixbuf_new_from_file (EX_RECT_IMAGE, NULL);
669         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->rect_image), pixbuf);
670
671         /* Apply units to spinbuttons and units labels. */
672         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
673                                     dialog->priv->digits);
674         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
675                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
676         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_w_units_label),
677                             dialog->priv->units_string);
678         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
679                                     dialog->priv->digits);
680         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
681                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
682         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_h_units_label),
683                             dialog->priv->units_string);
684         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
685                                     dialog->priv->digits);
686         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
687                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
688         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_r_units_label),
689                             dialog->priv->units_string);
690         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
691                                     dialog->priv->digits);
692         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
693                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
694         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_x_waste_units_label),
695                             dialog->priv->units_string);
696         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
697                                     dialog->priv->digits);
698         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
699                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
700         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_y_waste_units_label),
701                             dialog->priv->units_string);
702         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
703                                     dialog->priv->digits);
704         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
705                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
706         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_margin_units_label),
707                             dialog->priv->units_string);
708
709         /* Load some realistic defaults. */
710         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
711                                    DEFAULT_RECT_W * dialog->priv->units_per_point);
712         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
713                                    DEFAULT_RECT_H * dialog->priv->units_per_point);
714         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
715                                    DEFAULT_RECT_R * dialog->priv->units_per_point);
716         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
717                                    DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
718         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
719                                    DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
720         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
721                                    DEFAULT_MARGIN * dialog->priv->units_per_point);
722
723         gl_debug (DEBUG_TEMPLATE, "END");
724 }
725
726
727 /*--------------------------------------------------------------------------*/
728 /* PRIVATE.  Construct round size page.                                     */
729 /*--------------------------------------------------------------------------*/
730 static void
731 construct_round_size_page (glTemplateDesigner      *dialog,
732                            GdkPixbuf               *logo)
733 {
734         GdkPixbuf       *pixbuf;
735
736         gl_debug (DEBUG_TEMPLATE, "START");
737
738         gl_util_get_builder_widgets (dialog->priv->builder,
739                                      "round_size_page",          &dialog->priv->round_size_page,
740                                      "round_image",              &dialog->priv->round_image,
741                                      "round_r_spin",             &dialog->priv->round_r_spin,
742                                      "round_waste_spin",         &dialog->priv->round_waste_spin,
743                                      "round_margin_spin",        &dialog->priv->round_margin_spin,
744                                      "round_r_units_label",      &dialog->priv->round_r_units_label,
745                                      "round_waste_units_label",  &dialog->priv->round_waste_units_label,
746                                      "round_margin_units_label", &dialog->priv->round_margin_units_label,
747                                      NULL);
748
749
750         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
751                                    dialog->priv->round_size_page);
752
753         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
754                                       dialog->priv->round_size_page,
755                                       _("Label Size (round)"));
756         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
757                                              dialog->priv->round_size_page,
758                                              logo);
759         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
760                                          dialog->priv->round_size_page,
761                                          TRUE);
762
763         /* Initialize illustration. */
764         pixbuf = gdk_pixbuf_new_from_file (EX_ROUND_IMAGE, NULL);
765         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->round_image), pixbuf);
766
767         /* Apply units to spinbuttons and units labels. */
768         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
769                                     dialog->priv->digits);
770         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
771                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
772         gtk_label_set_text (GTK_LABEL(dialog->priv->round_r_units_label),
773                             dialog->priv->units_string);
774         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
775                                     dialog->priv->digits);
776         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
777                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
778         gtk_label_set_text (GTK_LABEL(dialog->priv->round_waste_units_label),
779                             dialog->priv->units_string);
780         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
781                                     dialog->priv->digits);
782         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
783                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
784         gtk_label_set_text (GTK_LABEL(dialog->priv->round_margin_units_label),
785                             dialog->priv->units_string);
786
787         /* Load some realistic defaults. */
788         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
789                                    DEFAULT_ROUND_R * dialog->priv->units_per_point);
790         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
791                                    DEFAULT_ROUND_WASTE * dialog->priv->units_per_point);
792         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
793                                    DEFAULT_MARGIN * dialog->priv->units_per_point);
794
795         gl_debug (DEBUG_TEMPLATE, "END");
796 }
797
798
799 /*--------------------------------------------------------------------------*/
800 /* PRIVATE.  Construct CD/DVD size page.                                    */
801 /*--------------------------------------------------------------------------*/
802 static void
803 construct_cd_size_page (glTemplateDesigner      *dialog,
804                         GdkPixbuf               *logo)
805 {
806         GdkPixbuf       *pixbuf;
807
808         gl_debug (DEBUG_TEMPLATE, "START");
809
810         gl_util_get_builder_widgets (dialog->priv->builder,
811                                      "cd_size_page",          &dialog->priv->cd_size_page,
812                                      "cd_image",              &dialog->priv->cd_image,
813                                      "cd_radius_spin",        &dialog->priv->cd_radius_spin,
814                                      "cd_hole_spin",          &dialog->priv->cd_hole_spin,
815                                      "cd_w_spin",             &dialog->priv->cd_w_spin,
816                                      "cd_h_spin",             &dialog->priv->cd_h_spin,
817                                      "cd_waste_spin",         &dialog->priv->cd_waste_spin,
818                                      "cd_margin_spin",        &dialog->priv->cd_margin_spin,
819                                      "cd_radius_units_label", &dialog->priv->cd_radius_units_label,
820                                      "cd_hole_units_label",   &dialog->priv->cd_hole_units_label,
821                                      "cd_w_units_label",      &dialog->priv->cd_w_units_label,
822                                      "cd_h_units_label",      &dialog->priv->cd_h_units_label,
823                                      "cd_waste_units_label",  &dialog->priv->cd_waste_units_label,
824                                      "cd_margin_units_label", &dialog->priv->cd_margin_units_label,
825                                      NULL);
826
827
828         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
829                                    dialog->priv->cd_size_page);
830
831         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
832                                       dialog->priv->cd_size_page,
833                                       _("Label Size (CD/DVD)"));
834         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
835                                              dialog->priv->cd_size_page,
836                                              logo);
837         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
838                                          dialog->priv->cd_size_page,
839                                          TRUE);
840
841         /* Initialize illustration. */
842         pixbuf = gdk_pixbuf_new_from_file (EX_CD_IMAGE, NULL);
843         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->cd_image), pixbuf);
844
845         /* Apply units to spinbuttons and units labels. */
846         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
847                                     dialog->priv->digits);
848         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
849                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
850         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_radius_units_label),
851                             dialog->priv->units_string);
852         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
853                                     dialog->priv->digits);
854         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
855                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
856         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_hole_units_label),
857                             dialog->priv->units_string);
858         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
859                                     dialog->priv->digits);
860         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
861                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
862         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_w_units_label),
863                             dialog->priv->units_string);
864         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
865                                     dialog->priv->digits);
866         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
867                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
868         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_h_units_label),
869                             dialog->priv->units_string);
870         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
871                                     dialog->priv->digits);
872         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
873                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
874         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_waste_units_label),
875                             dialog->priv->units_string);
876         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
877                                     dialog->priv->digits);
878         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
879                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
880         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_margin_units_label),
881                             dialog->priv->units_string);
882
883         /* Load some realistic defaults. */
884         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
885                                    DEFAULT_CD_RADIUS * dialog->priv->units_per_point);
886         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
887                                    DEFAULT_CD_HOLE * dialog->priv->units_per_point);
888         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
889                                    DEFAULT_CD_WASTE * dialog->priv->units_per_point);
890         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
891                                    DEFAULT_MARGIN * dialog->priv->units_per_point);
892
893         gl_debug (DEBUG_TEMPLATE, "END");
894 }
895
896
897 /*--------------------------------------------------------------------------*/
898 /* PRIVATE.  Construct number of layouts page.                              */
899 /*--------------------------------------------------------------------------*/
900 static void
901 construct_nlayouts_page (glTemplateDesigner      *dialog,
902                          GdkPixbuf               *logo)
903 {
904         GdkPixbuf       *pixbuf;
905
906         gl_debug (DEBUG_TEMPLATE, "START");
907
908         gl_util_get_builder_widgets (dialog->priv->builder,
909                                      "nlayouts_page",   &dialog->priv->nlayouts_page,
910                                      "nlayouts_image1", &dialog->priv->nlayouts_image1,
911                                      "nlayouts_image2", &dialog->priv->nlayouts_image2,
912                                      "nlayouts_spin",   &dialog->priv->nlayouts_spin,
913                                      NULL);
914
915
916         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
917                                    dialog->priv->nlayouts_page);
918
919         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
920                                       dialog->priv->nlayouts_page,
921                                       _("Number of Layouts"));
922         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
923                                              dialog->priv->nlayouts_page,
924                                              logo);
925         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
926                                          dialog->priv->nlayouts_page,
927                                          TRUE);
928
929         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin),
930                                    1, 2);
931
932
933         /* Initialize illustrations. */
934         pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE1, NULL);
935         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image1), pixbuf);
936         pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE2, NULL);
937         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image2), pixbuf);
938
939         gl_debug (DEBUG_TEMPLATE, "END");
940 }
941
942
943 /*--------------------------------------------------------------------------*/
944 /* PRIVATE.  Construct layout page.                                         */
945 /*--------------------------------------------------------------------------*/
946 static void
947 construct_layout_page (glTemplateDesigner      *dialog,
948                        GdkPixbuf               *logo)
949 {
950         gl_debug (DEBUG_TEMPLATE, "START");
951
952         gl_util_get_builder_widgets (dialog->priv->builder,
953                                      "layout_page",           &dialog->priv->layout_page,
954                                      "layout1_head_label",    &dialog->priv->layout1_head_label,
955                                      "layout1_nx_spin",       &dialog->priv->layout1_nx_spin,
956                                      "layout1_ny_spin",       &dialog->priv->layout1_ny_spin,
957                                      "layout1_x0_spin",       &dialog->priv->layout1_x0_spin,
958                                      "layout1_y0_spin",       &dialog->priv->layout1_y0_spin,
959                                      "layout1_dx_spin",       &dialog->priv->layout1_dx_spin,
960                                      "layout1_dy_spin",       &dialog->priv->layout1_dy_spin,
961                                      "layout2_head_label",    &dialog->priv->layout2_head_label,
962                                      "layout2_nx_spin",       &dialog->priv->layout2_nx_spin,
963                                      "layout2_ny_spin",       &dialog->priv->layout2_ny_spin,
964                                      "layout2_x0_spin",       &dialog->priv->layout2_x0_spin,
965                                      "layout2_y0_spin",       &dialog->priv->layout2_y0_spin,
966                                      "layout2_dx_spin",       &dialog->priv->layout2_dx_spin,
967                                      "layout2_dy_spin",       &dialog->priv->layout2_dy_spin,
968                                      "layout_x0_units_label", &dialog->priv->layout_x0_units_label,
969                                      "layout_y0_units_label", &dialog->priv->layout_y0_units_label,
970                                      "layout_dx_units_label", &dialog->priv->layout_dx_units_label,
971                                      "layout_dy_units_label", &dialog->priv->layout_dy_units_label,
972                                      "mini_preview_vbox",     &dialog->priv->mini_preview_vbox,
973                                      "layout_test_button",    &dialog->priv->layout_test_button,
974                                      NULL);
975
976         dialog->priv->layout_mini_preview = gl_wdgt_mini_preview_new (175, 200);
977         gtk_container_add (GTK_CONTAINER (dialog->priv->mini_preview_vbox),
978                            dialog->priv->layout_mini_preview);
979
980         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
981                                    dialog->priv->layout_page);
982
983         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
984                                       dialog->priv->layout_page,
985                                       _("Layout(s)"));
986         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
987                                              dialog->priv->layout_page,
988                                              logo);
989         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
990                                          dialog->priv->layout_page,
991                                          TRUE);
992
993         /* Apply units to spinbuttons and units labels. */
994         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
995                                     dialog->priv->digits);
996         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
997                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
998         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
999                                     dialog->priv->digits);
1000         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
1001                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1002         gtk_label_set_text (GTK_LABEL(dialog->priv->layout_x0_units_label),
1003                             dialog->priv->units_string);
1004         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
1005                                     dialog->priv->digits);
1006         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
1007                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1008         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1009                                     dialog->priv->digits);
1010         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1011                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1012         gtk_label_set_text (GTK_LABEL(dialog->priv->layout_y0_units_label),
1013                             dialog->priv->units_string);
1014         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1015                                     dialog->priv->digits);
1016         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1017                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1018         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1019                                     dialog->priv->digits);
1020         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1021                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1022         gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dx_units_label),
1023                             dialog->priv->units_string);
1024         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1025                                     dialog->priv->digits);
1026         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1027                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1028         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1029                                     dialog->priv->digits);
1030         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1031                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1032         gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dy_units_label),
1033                             dialog->priv->units_string);
1034
1035         /* Connect a handler that listens for changes in these widgets */
1036         /* This controls sensitivity of related widgets. */
1037         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_nx_spin), "changed",
1038                                   G_CALLBACK(layout_page_changed_cb), dialog);
1039         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_ny_spin), "changed",
1040                                   G_CALLBACK(layout_page_changed_cb), dialog);
1041         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_x0_spin), "changed",
1042                                   G_CALLBACK(layout_page_changed_cb), dialog);
1043         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_y0_spin), "changed",
1044                                   G_CALLBACK(layout_page_changed_cb), dialog);
1045         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dx_spin), "changed",
1046                                   G_CALLBACK(layout_page_changed_cb), dialog);
1047         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dy_spin), "changed",
1048                                   G_CALLBACK(layout_page_changed_cb), dialog);
1049         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_nx_spin), "changed",
1050                                   G_CALLBACK(layout_page_changed_cb), dialog);
1051         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_ny_spin), "changed",
1052                                   G_CALLBACK(layout_page_changed_cb), dialog);
1053         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_x0_spin), "changed",
1054                                   G_CALLBACK(layout_page_changed_cb), dialog);
1055         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_y0_spin), "changed",
1056                                   G_CALLBACK(layout_page_changed_cb), dialog);
1057         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dx_spin), "changed",
1058                                   G_CALLBACK(layout_page_changed_cb), dialog);
1059         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dy_spin), "changed",
1060                                   G_CALLBACK(layout_page_changed_cb), dialog);
1061
1062
1063         /* Print button */
1064         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout_test_button), "clicked",
1065                                   G_CALLBACK(print_test_cb), dialog);
1066
1067         gl_debug (DEBUG_TEMPLATE, "END");
1068 }
1069
1070
1071 /*--------------------------------------------------------------------------*/
1072 /* PRIVATE.  Construct finish page.                                         */
1073 /*--------------------------------------------------------------------------*/
1074 static void
1075 construct_finish_page (glTemplateDesigner      *dialog,
1076                        GdkPixbuf               *logo)
1077 {
1078         gl_debug (DEBUG_TEMPLATE, "START");
1079
1080         gl_util_get_builder_widgets (dialog->priv->builder,
1081                                      "finish_page", &dialog->priv->finish_page,
1082                                      NULL);
1083
1084
1085         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
1086                                    dialog->priv->finish_page);
1087
1088         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
1089                                       dialog->priv->finish_page,
1090                                       _("Design Completed"));
1091         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
1092                                              dialog->priv->finish_page,
1093                                              logo);
1094         gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
1095                                      dialog->priv->finish_page,
1096                                      GTK_ASSISTANT_PAGE_CONFIRM);
1097         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1098                                          dialog->priv->finish_page,
1099                                          TRUE);
1100
1101         gl_debug (DEBUG_TEMPLATE, "END");
1102 }
1103
1104
1105 /*--------------------------------------------------------------------------*/
1106 /* PRIVATE.  cancel callback.                                               */
1107 /*--------------------------------------------------------------------------*/
1108 static void
1109 cancel_cb (glTemplateDesigner *dialog)
1110 {
1111                                                                                
1112         gtk_widget_destroy (GTK_WIDGET(dialog));
1113
1114 }
1115
1116
1117 /*--------------------------------------------------------------------------*/
1118 /* PRIVATE.  apply callback                                                 */
1119 /*--------------------------------------------------------------------------*/
1120 static void
1121 apply_cb (glTemplateDesigner *dialog)
1122 {
1123         lglTemplate *template;
1124         gchar       *name;
1125         
1126         template = build_template (dialog);
1127         lgl_db_register_template (template);
1128         name = lgl_template_get_name (template);
1129         gl_mini_preview_pixbuf_cache_add_by_name (name);
1130         g_free (name);
1131 }
1132
1133                          
1134 /*--------------------------------------------------------------------------*/
1135 /* PRIVATE.  close callback                                                 */
1136 /*--------------------------------------------------------------------------*/
1137 static void
1138 close_cb (glTemplateDesigner *dialog)
1139 {
1140                                                                                
1141         gtk_widget_destroy (GTK_WIDGET(dialog));
1142
1143 }
1144
1145                          
1146 /*--------------------------------------------------------------------------*/
1147 /* PRIVATE.  prepare page callback                                          */
1148 /*--------------------------------------------------------------------------*/
1149 static void
1150 prepare_cb (glTemplateDesigner      *dialog,
1151             GtkWidget               *page)
1152 {
1153         gint page_num;
1154
1155         page_num = gtk_assistant_get_current_page (GTK_ASSISTANT (dialog));
1156
1157         switch (page_num)
1158         {
1159
1160         case NAME_PAGE_NUM:
1161                 name_page_changed_cb (dialog); /* Use to prepare */
1162                 break;
1163
1164         case PG_SIZE_PAGE_NUM:
1165                 pg_size_page_changed_cb (dialog); /* Use to prepare */
1166                 break;
1167
1168         case RECT_SIZE_PAGE_NUM:
1169                 rect_size_page_prepare_cb (dialog);
1170                 break;
1171
1172         case ROUND_SIZE_PAGE_NUM:
1173                 round_size_page_prepare_cb (dialog);
1174                 break;
1175
1176         case CD_SIZE_PAGE_NUM:
1177                 cd_size_page_prepare_cb (dialog);
1178                 break;
1179
1180         case LAYOUT_PAGE_NUM:
1181                 layout_page_prepare_cb (dialog);
1182                 break;
1183
1184         default:
1185                 /* No preparation needed */
1186                 break;
1187
1188         }
1189 }
1190
1191
1192 /*--------------------------------------------------------------------------*/
1193 /* PRIVATE.  Handle non-linear forward traversal.                           */
1194 /*--------------------------------------------------------------------------*/
1195 static gint
1196 forward_page_function (gint     current_page,
1197                        gpointer data)
1198 {
1199         glTemplateDesigner *dialog = GL_TEMPLATE_DESIGNER (data);
1200
1201         switch (current_page)
1202         {
1203         case START_PAGE_NUM:
1204                 return NAME_PAGE_NUM;
1205
1206         case NAME_PAGE_NUM:
1207                 return PG_SIZE_PAGE_NUM;
1208
1209         case PG_SIZE_PAGE_NUM:
1210                 return SHAPE_PAGE_NUM;
1211
1212         case SHAPE_PAGE_NUM:
1213                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1214                         return RECT_SIZE_PAGE_NUM;
1215                 }
1216                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1217                         return ROUND_SIZE_PAGE_NUM;
1218                 }
1219                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1220                         return CD_SIZE_PAGE_NUM;
1221                 }
1222                 break;
1223
1224         case RECT_SIZE_PAGE_NUM:
1225         case ROUND_SIZE_PAGE_NUM:
1226         case CD_SIZE_PAGE_NUM:
1227                 return NLAYOUTS_PAGE_NUM;
1228
1229         case NLAYOUTS_PAGE_NUM:
1230                 return LAYOUT_PAGE_NUM;
1231
1232         case LAYOUT_PAGE_NUM:
1233                 return FINISH_PAGE_NUM;
1234
1235         case FINISH_PAGE_NUM:
1236         default:
1237                 return -1;
1238         }
1239
1240         return -1;
1241 }
1242
1243
1244 /*--------------------------------------------------------------------------*/
1245 /* PRIVATE.  Widget on name page "changed" callback.                        */
1246 /*--------------------------------------------------------------------------*/
1247 static void
1248 name_page_changed_cb (glTemplateDesigner *dialog)
1249 {
1250         gchar *brand, *part_num, *desc;
1251
1252         brand    = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1));
1253         part_num = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1));
1254         desc     = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1255
1256
1257         if (brand && brand[0] && part_num && part_num[0] &&
1258             lgl_db_does_template_exist (brand, part_num))
1259         {
1260                 gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->name_warning_image),
1261                                           GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON);
1262                 gtk_label_set_markup (GTK_LABEL (dialog->priv->name_warning_label),
1263                                     _("<span foreground='red' weight='bold'>Brand and part# match an existing template!</span>"));
1264         }
1265         else
1266         {
1267                 gtk_image_clear (GTK_IMAGE (dialog->priv->name_warning_image));
1268                 gtk_label_set_text (GTK_LABEL (dialog->priv->name_warning_label), "");
1269         }
1270
1271         if (brand && brand[0] && part_num && part_num[0] && desc && desc[0] &&
1272             !lgl_db_does_template_exist (brand, part_num))
1273         {
1274
1275                 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1276                                                  dialog->priv->name_page,
1277                                                  TRUE);
1278         }
1279         else
1280         {
1281
1282                 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1283                                                  dialog->priv->name_page,
1284                                                  FALSE);
1285         }
1286
1287         g_free (brand);
1288         g_free (part_num);
1289         g_free (desc);
1290 }
1291                                                                                
1292
1293 /*--------------------------------------------------------------------------*/
1294 /* PRIVATE.  Widget on page size page "changed" callback.                   */
1295 /*--------------------------------------------------------------------------*/
1296 static void
1297 pg_size_page_changed_cb (glTemplateDesigner *dialog)
1298 {
1299         gchar    *page_size_name;
1300         lglPaper *paper;
1301         
1302
1303         page_size_name =
1304                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1305
1306         if (page_size_name && strlen(page_size_name)) {
1307
1308                 paper = lgl_db_lookup_paper_from_name (page_size_name);
1309         
1310
1311                 if ( g_strcasecmp (paper->id, "Other") == 0 ) {
1312                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), TRUE);
1313                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), TRUE);
1314                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1315                                                   TRUE);
1316                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1317                                                   TRUE);
1318
1319                 } else {
1320                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), FALSE);
1321                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), FALSE);
1322                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1323                                                   FALSE);
1324                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1325                                                   FALSE);
1326
1327                         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
1328                                                    paper->width * dialog->priv->units_per_point);
1329                         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
1330                                                    paper->height * dialog->priv->units_per_point);
1331                 }
1332
1333                 lgl_paper_free (paper);
1334         }
1335
1336         g_free (page_size_name);
1337
1338 }
1339                                                                                
1340
1341 /*--------------------------------------------------------------------------*/
1342 /* PRIVATE.  Prepare rectangular size page.                                 */
1343 /*--------------------------------------------------------------------------*/
1344 static void
1345 rect_size_page_prepare_cb (glTemplateDesigner *dialog)
1346 {
1347         gdouble max_w, max_h;
1348         gdouble w, h, r, x_waste, y_waste, margin;
1349
1350         /* Limit label size based on already chosen page size. */
1351         max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1352         max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1353
1354         w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1355         h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1356         r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1357         x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1358         y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1359         margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1360
1361         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_w_spin),
1362                                    dialog->priv->climb_rate, max_w);
1363         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_h_spin),
1364                                    dialog->priv->climb_rate, max_h);
1365         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_r_spin),
1366                                    0.0, MIN(max_w, max_h)/2.0);
1367         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_x_waste_spin),
1368                                    0.0, MIN(max_w, max_h)/4.0);
1369         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_y_waste_spin),
1370                                    0.0, MIN(max_w, max_h)/4.0);
1371         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_margin_spin),
1372                                    0.0, MIN(max_w, max_h)/4.0);
1373
1374         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), w);
1375         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), h);
1376         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), r);
1377         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), x_waste);
1378         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), y_waste);
1379         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), margin);
1380
1381 }
1382
1383
1384 /*--------------------------------------------------------------------------*/
1385 /* PRIVATE.  Prepare round size page.                                       */
1386 /*--------------------------------------------------------------------------*/
1387 static void
1388 round_size_page_prepare_cb (glTemplateDesigner *dialog)
1389 {
1390         gdouble max_w, max_h;
1391         gdouble r, waste, margin;
1392
1393         /* Limit label size based on already chosen page size. */
1394         max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1395         max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1396
1397         r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1398         waste  = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1399         margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1400
1401         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_r_spin),
1402                                    dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1403         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_waste_spin),
1404                                    0.0, MIN(max_w, max_h)/4.0);
1405         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_margin_spin),
1406                                    0.0, MIN(max_w, max_h)/4.0);
1407
1408         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), r);
1409         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), waste);
1410         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), margin);
1411
1412 }
1413
1414
1415 /*--------------------------------------------------------------------------*/
1416 /* PRIVATE.  Prepare cd/dvd size page.                                      */
1417 /*--------------------------------------------------------------------------*/
1418 static void
1419 cd_size_page_prepare_cb (glTemplateDesigner *dialog)
1420 {
1421         gdouble max_w, max_h;
1422         gdouble radius, hole, w, h, waste, margin;
1423
1424         /* Limit label size based on already chosen page size. */
1425         max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1426         max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1427
1428         radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1429         hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1430         w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1431         h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1432         waste  = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1433         margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1434
1435         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_radius_spin),
1436                                    dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1437         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_hole_spin),
1438                                    dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1439         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_w_spin),
1440                                    0.0, max_w);
1441         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_h_spin),
1442                                    0.0, max_h);
1443         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_waste_spin),
1444                                    0.0, MIN(max_w, max_h)/4.0);
1445         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_margin_spin),
1446                                    0.0, MIN(max_w, max_h)/4.0);
1447
1448         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), radius);
1449         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), hole);
1450         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), w);
1451         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), h);
1452         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), waste);
1453         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), margin);
1454
1455 }
1456
1457
1458 /*--------------------------------------------------------------------------*/
1459 /* PRIVATE.  Prepare Layout page cb.                                        */
1460 /*--------------------------------------------------------------------------*/
1461 static void
1462 layout_page_prepare_cb (glTemplateDesigner *dialog)
1463 {
1464         gdouble page_w, page_h;
1465         gdouble w=0, h=0, x_waste=0, y_waste=0;
1466         gint    max_nx, max_ny;
1467         gint    nlayouts;
1468         gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1469         gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1470         lglTemplate *template;
1471
1472         if (dialog->priv->stop_signals) return;
1473         dialog->priv->stop_signals = TRUE;
1474
1475
1476         /* Limit ranges based on already chosen page and label sizes. */
1477         page_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1478         page_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1479         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1480                 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1481                 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1482                 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1483                 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1484         }
1485         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1486                 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1487                 h = w;
1488                 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1489                 y_waste = x_waste;
1490         }
1491         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1492                 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1493                 h = w;
1494                 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1495                 y_waste = x_waste;
1496         }
1497         max_nx = MAX (floor (page_w/(w + 2*x_waste) + DELTA), 1.0);
1498         max_ny = MAX (floor (page_h/(h + 2*y_waste) + DELTA), 1.0);
1499
1500         nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1501         ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1502         x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1503         y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1504         dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1505         dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1506         nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1507         ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1508         x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1509         y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1510         dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1511         dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1512
1513         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_nx_spin),
1514                                    1, max_nx);
1515         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_ny_spin),
1516                                    1, max_ny);
1517         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_x0_spin),
1518                                    x_waste, page_w - w - x_waste);
1519         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_y0_spin),
1520                                    y_waste, page_h - h - y_waste);
1521         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dx_spin),
1522                                    w + 2*x_waste, page_w - w - 2*x_waste);
1523         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dy_spin),
1524                                    h + 2*y_waste, page_h - h - 2*y_waste);
1525         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_nx_spin),
1526                                    1, max_nx);
1527         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_ny_spin),
1528                                    1, max_ny);
1529         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_x0_spin),
1530                                    x_waste, page_w - w - x_waste);
1531         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_y0_spin),
1532                                    y_waste, page_h - h - y_waste);
1533         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dx_spin),
1534                                    w + 2*x_waste, page_w - w - 2*x_waste);
1535         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dy_spin),
1536                                    h + 2*y_waste, page_h - h - 2*y_waste);
1537
1538         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), nx_1);
1539         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), ny_1);
1540         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), x0_1);
1541         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), y0_1);
1542         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), dx_1);
1543         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), dy_1);
1544         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), nx_2);
1545         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), ny_2);
1546         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), x0_2);
1547         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), y0_2);
1548         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), dx_2);
1549         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), dy_2);
1550
1551         /* Set visibility of layout2 widgets as appropriate. */
1552         nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1553         if ( nlayouts == 1 )
1554         {
1555                 gtk_widget_hide (dialog->priv->layout1_head_label);
1556                 gtk_widget_hide (dialog->priv->layout2_head_label);
1557                 gtk_widget_hide (dialog->priv->layout2_nx_spin);
1558                 gtk_widget_hide (dialog->priv->layout2_ny_spin);
1559                 gtk_widget_hide (dialog->priv->layout2_x0_spin);
1560                 gtk_widget_hide (dialog->priv->layout2_y0_spin);
1561                 gtk_widget_hide (dialog->priv->layout2_dx_spin);
1562                 gtk_widget_hide (dialog->priv->layout2_dy_spin);
1563         }
1564         else
1565         {
1566                 gtk_widget_show (dialog->priv->layout1_head_label);
1567                 gtk_widget_show (dialog->priv->layout2_head_label);
1568                 gtk_widget_show (dialog->priv->layout2_nx_spin);
1569                 gtk_widget_show (dialog->priv->layout2_ny_spin);
1570                 gtk_widget_show (dialog->priv->layout2_x0_spin);
1571                 gtk_widget_show (dialog->priv->layout2_y0_spin);
1572                 gtk_widget_show (dialog->priv->layout2_dx_spin);
1573                 gtk_widget_show (dialog->priv->layout2_dy_spin);
1574         }
1575
1576         template = build_template (dialog);
1577         gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview),
1578                                            template);
1579         lgl_template_free (template);
1580
1581
1582         dialog->priv->stop_signals = FALSE;
1583 }
1584
1585
1586 /*--------------------------------------------------------------------------*/
1587 /* PRIVATE.  Layout page widget changed cb.                                 */
1588 /*--------------------------------------------------------------------------*/
1589 static void
1590 layout_page_changed_cb (glTemplateDesigner *dialog)
1591 {
1592         lglTemplate *template;
1593
1594         if (dialog->priv->stop_signals) return;
1595         dialog->priv->stop_signals = TRUE;
1596
1597         template = build_template (dialog);
1598
1599         gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview),
1600                                            template);
1601
1602         lgl_template_free (template);
1603
1604         dialog->priv->stop_signals = FALSE;
1605 }
1606
1607
1608 /*--------------------------------------------------------------------------*/
1609 /* PRIVATE.  Print test sheet callback.                                     */
1610 /*--------------------------------------------------------------------------*/
1611 static void
1612 print_test_cb (glTemplateDesigner      *dialog)
1613 {
1614         GObject     *label;
1615         lglTemplate *template;
1616         glPrintOp   *print_op;
1617
1618         label = gl_label_new ();
1619
1620         template = build_template (dialog);
1621         gl_label_set_template (GL_LABEL(label), template);
1622
1623         print_op = gl_print_op_new (GL_LABEL(label));
1624         gl_print_op_force_outline_flag (print_op);
1625         gtk_print_operation_run (GTK_PRINT_OPERATION (print_op),
1626                                  GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
1627                                  GTK_WINDOW (dialog),
1628                                  NULL);
1629
1630         lgl_template_free (template);
1631         g_object_unref (G_OBJECT(label));
1632 }
1633
1634
1635 /*--------------------------------------------------------------------------*/
1636 /* Build a template based on current assistant settings.                    */
1637 /*--------------------------------------------------------------------------*/
1638 static lglTemplate *
1639 build_template (glTemplateDesigner      *dialog)
1640 {
1641         gdouble               upp;
1642         gchar                *brand, *part_num, *desc;
1643         gchar                *page_size_name;
1644         lglPaper             *paper;
1645         lglTemplateFrameShape shape;
1646         lglTemplateFrame     *frame=NULL;
1647         gdouble               w=0, h=0, r=0, radius=0, hole=0, waste=0, x_waste=0, y_waste=0, margin=0;
1648         gint                  nlayouts;
1649         gdouble               nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1650         gdouble               nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1651         lglTemplate          *template;
1652
1653         upp = dialog->priv->units_per_point;
1654
1655         brand    = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1));
1656         part_num = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1));
1657         desc     = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1658
1659         page_size_name =
1660                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1661         paper = lgl_db_lookup_paper_from_name (page_size_name);
1662         if ( g_strcasecmp (paper->id, "Other") == 0 ) {
1663                 paper->width =
1664                         gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin))
1665                         / upp;
1666                 paper->height =
1667                         gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin))
1668                          / upp;
1669         }
1670
1671         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1672                 shape = LGL_TEMPLATE_FRAME_SHAPE_RECT;
1673                 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1674                 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1675                 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1676                 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1677                 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1678                 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1679         }
1680
1681         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1682                 shape = LGL_TEMPLATE_FRAME_SHAPE_ROUND;
1683                 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1684                 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1685                 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1686         }
1687
1688         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1689                 shape = LGL_TEMPLATE_FRAME_SHAPE_CD;
1690                 radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1691                 hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1692                 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1693                 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1694                 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1695                 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1696         }
1697
1698         nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1699         nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1700         ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1701         x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1702         y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1703         dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1704         dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1705         nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1706         ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1707         x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1708         y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1709         dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1710         dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1711
1712
1713         template = lgl_template_new (brand, part_num, desc, paper->id, paper->width, paper->height);
1714
1715         switch (shape) {
1716         case LGL_TEMPLATE_FRAME_SHAPE_RECT:
1717                 frame = lgl_template_frame_rect_new ("0",
1718                                                     w/upp, h/upp, r/upp,
1719                                                     x_waste/upp, y_waste/upp);
1720                 break;
1721         case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
1722                 frame = lgl_template_frame_round_new ("0", r/upp, waste/upp);
1723                 break;
1724         case LGL_TEMPLATE_FRAME_SHAPE_CD:
1725                 frame = lgl_template_frame_cd_new ("0",
1726                                                   radius/upp, hole/upp,
1727                                                   w/upp, h/upp,
1728                                                   waste/upp);
1729                 break;
1730         }
1731         lgl_template_add_frame (template, frame);
1732
1733         lgl_template_frame_add_markup (frame,
1734                                        lgl_template_markup_margin_new (margin/upp));
1735
1736         lgl_template_frame_add_layout (frame,
1737                                        lgl_template_layout_new (nx_1, ny_1,
1738                                                                 x0_1/upp,
1739                                                                 y0_1/upp,
1740                                                                 dx_1/upp,
1741                                                                 dy_1/upp));
1742         if (nlayouts > 1) {
1743                 lgl_template_frame_add_layout (frame,
1744                                                lgl_template_layout_new (nx_2, ny_2,
1745                                                                         x0_2/upp,
1746                                                                         y0_2/upp,
1747                                                                         dx_2/upp,
1748                                                                         dy_2/upp));
1749         }
1750
1751         g_free (brand);
1752         g_free (part_num);
1753         g_free (desc);
1754
1755         g_free (page_size_name);
1756         lgl_paper_free (paper);
1757
1758         return template;
1759 }
1760
1761
1762
1763 /*
1764  * Local Variables:       -- emacs
1765  * mode: C                -- emacs
1766  * c-basic-offset: 8      -- emacs
1767  * tab-width: 8           -- emacs
1768  * indent-tabs-mode: nil  -- emacs
1769  * End:                   -- emacs
1770  */