3 * Copyright (C) 2003-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
7 * gLabels is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * gLabels is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with gLabels. If not, see <http://www.gnu.org/licenses/>.
23 #include "template-designer.h"
25 #include <glib/gi18n.h>
30 #include <libglabels.h>
32 #include "mini-preview.h"
33 #include "mini-preview-pixbuf-cache.h"
34 #include "print-op-dialog.h"
35 #include "combo-util.h"
36 #include "builder-util.h"
37 #include "units-util.h"
42 /*========================================================*/
43 /* Private macros and constants. */
44 /*========================================================*/
45 #define DEFAULT_MARGIN 9.0
47 #define DEFAULT_RECT_W 252.0
48 #define DEFAULT_RECT_H 144.0
49 #define DEFAULT_RECT_R 0.0
50 #define DEFAULT_RECT_WASTE 0.0 /* Should never exceed 1/2 the distance between items. */
52 #define DEFAULT_ROUND_R 72.0
53 #define DEFAULT_ROUND_WASTE 0.0 /* Should never exceed 1/2 the distance between items. */
55 #define DEFAULT_CD_RADIUS 166.5
56 #define DEFAULT_CD_HOLE 58.5
57 #define DEFAULT_CD_WASTE 9.0 /* Should never exceed 1/2 the distance between items. */
60 #define MAX_PAGE_DIM_POINTS 5000.0
63 /*========================================================*/
65 /*========================================================*/
67 struct _glTemplateDesignerPrivate
76 GtkWidget *start_page;
78 GtkWidget *pg_size_page;
79 GtkWidget *shape_page;
80 GtkWidget *rect_size_page;
81 GtkWidget *round_size_page;
82 GtkWidget *cd_size_page;
83 GtkWidget *nlayouts_page;
84 GtkWidget *layout_page;
85 GtkWidget *finish_page;
87 /* Name page controls */
88 GtkWidget *brand_entry;
89 GtkWidget *part_num_entry;
90 GtkWidget *name_warning_image;
91 GtkWidget *name_warning_label;
92 GtkWidget *description_entry;
94 /* Page size page controls */
95 GtkWidget *pg_size_combo;
98 GtkWidget *pg_w_units_label;
99 GtkWidget *pg_h_units_label;
101 /* Shape page controls */
102 GtkWidget *shape_rect_radio;
103 GtkWidget *shape_round_radio;
104 GtkWidget *shape_cd_radio;
106 /* Label size (rectangular) page controls */
107 GtkWidget *rect_image;
108 GtkWidget *rect_w_spin;
109 GtkWidget *rect_h_spin;
110 GtkWidget *rect_r_spin;
111 GtkWidget *rect_x_waste_spin;
112 GtkWidget *rect_y_waste_spin;
113 GtkWidget *rect_margin_spin;
114 GtkWidget *rect_w_units_label;
115 GtkWidget *rect_h_units_label;
116 GtkWidget *rect_r_units_label;
117 GtkWidget *rect_x_waste_units_label;
118 GtkWidget *rect_y_waste_units_label;
119 GtkWidget *rect_margin_units_label;
121 /* Label size (round) page controls */
122 GtkWidget *round_image;
123 GtkWidget *round_r_spin;
124 GtkWidget *round_waste_spin;
125 GtkWidget *round_margin_spin;
126 GtkWidget *round_r_units_label;
127 GtkWidget *round_waste_units_label;
128 GtkWidget *round_margin_units_label;
130 /* Label size (cd) page controls */
132 GtkWidget *cd_radius_spin;
133 GtkWidget *cd_hole_spin;
134 GtkWidget *cd_w_spin;
135 GtkWidget *cd_h_spin;
136 GtkWidget *cd_waste_spin;
137 GtkWidget *cd_margin_spin;
138 GtkWidget *cd_radius_units_label;
139 GtkWidget *cd_hole_units_label;
140 GtkWidget *cd_w_units_label;
141 GtkWidget *cd_h_units_label;
142 GtkWidget *cd_waste_units_label;
143 GtkWidget *cd_margin_units_label;
145 /* Number of layouts controls */
146 GtkWidget *nlayouts_image1;
147 GtkWidget *nlayouts_image2;
148 GtkWidget *nlayouts_spin;
150 /* Layout page controls */
151 GtkWidget *layout1_head_label;
152 GtkWidget *layout1_nx_spin;
153 GtkWidget *layout1_ny_spin;
154 GtkWidget *layout1_x0_spin;
155 GtkWidget *layout1_y0_spin;
156 GtkWidget *layout1_dx_spin;
157 GtkWidget *layout1_dy_spin;
158 GtkWidget *layout2_head_label;
159 GtkWidget *layout2_nx_spin;
160 GtkWidget *layout2_ny_spin;
161 GtkWidget *layout2_x0_spin;
162 GtkWidget *layout2_y0_spin;
163 GtkWidget *layout2_dx_spin;
164 GtkWidget *layout2_dy_spin;
165 GtkWidget *layout_x0_units_label;
166 GtkWidget *layout_y0_units_label;
167 GtkWidget *layout_dx_units_label;
168 GtkWidget *layout_dy_units_label;
169 GtkWidget *mini_preview_vbox;
170 GtkWidget *layout_mini_preview;
171 GtkWidget *layout_test_button;
173 /* Units related stuff */
174 const gchar *units_string;
175 gdouble units_per_point;
179 /* Prevent recursion */
180 gboolean stop_signals;
183 /* Page numbers for traversing GtkAssistant */
198 /*========================================================*/
199 /* Private globals. */
200 /*========================================================*/
203 /*========================================================*/
204 /* Private function prototypes. */
205 /*========================================================*/
207 static void gl_template_designer_finalize (GObject *object);
208 static void gl_template_designer_construct (glTemplateDesigner *dialog);
210 static void construct_start_page (glTemplateDesigner *dialog,
213 static void construct_name_page (glTemplateDesigner *dialog,
216 static void construct_pg_size_page (glTemplateDesigner *dialog,
219 static void construct_shape_page (glTemplateDesigner *dialog,
222 static void construct_rect_size_page (glTemplateDesigner *dialog,
225 static void construct_round_size_page (glTemplateDesigner *dialog,
228 static void construct_cd_size_page (glTemplateDesigner *dialog,
231 static void construct_nlayouts_page (glTemplateDesigner *dialog,
234 static void construct_layout_page (glTemplateDesigner *dialog,
237 static void construct_finish_page (glTemplateDesigner *dialog,
240 static void cancel_cb (glTemplateDesigner *dialog);
241 static void apply_cb (glTemplateDesigner *dialog);
242 static void close_cb (glTemplateDesigner *dialog);
243 static void prepare_cb (glTemplateDesigner *dialog,
246 static gint forward_page_function (gint current_page,
249 static void name_page_changed_cb (glTemplateDesigner *dialog);
251 static void pg_size_page_changed_cb (glTemplateDesigner *dialog);
253 static void rect_size_page_prepare_cb (glTemplateDesigner *dialog);
255 static void round_size_page_prepare_cb (glTemplateDesigner *dialog);
257 static void cd_size_page_prepare_cb (glTemplateDesigner *dialog);
259 static void layout_page_prepare_cb (glTemplateDesigner *dialog);
261 static void layout_page_changed_cb (glTemplateDesigner *dialog);
263 static void print_test_cb (glTemplateDesigner *dialog);
265 static lglTemplate *build_template (glTemplateDesigner *dialog);
268 /*****************************************************************************/
269 /* Boilerplate object stuff. */
270 /*****************************************************************************/
271 G_DEFINE_TYPE (glTemplateDesigner, gl_template_designer, GTK_TYPE_ASSISTANT);
275 gl_template_designer_class_init (glTemplateDesignerClass *class)
277 GObjectClass *object_class = G_OBJECT_CLASS (class);
279 gl_template_designer_parent_class = g_type_class_peek_parent (class);
281 object_class->finalize = gl_template_designer_finalize;
286 gl_template_designer_init (glTemplateDesigner *dialog)
288 gchar *builder_filename;
289 static gchar *object_ids[] = { "start_page",
299 "adjustment1", "adjustment2", "adjustment3",
300 "adjustment4", "adjustment5", "adjustment6",
301 "adjustment7", "adjustment8", "adjustment9",
302 "adjustment10", "adjustment11", "adjustment12",
303 "adjustment13", "adjustment14", "adjustment15",
304 "adjustment16", "adjustment17", "adjustment18",
305 "adjustment19", "adjustment20", "adjustment21",
306 "adjustment22", "adjustment23", "adjustment24",
307 "adjustment25", "adjustment26", "adjustment27",
308 "adjustment28", "adjustment29", "adjustment30",
310 GError *error = NULL;
312 gl_debug (DEBUG_TEMPLATE, "START");
314 dialog->priv = g_new0 (glTemplateDesignerPrivate, 1);
316 dialog->priv->builder = gtk_builder_new ();
317 builder_filename = g_build_filename (GLABELS_DATA_DIR, "ui", "template-designer.ui", NULL);
318 gtk_builder_add_objects_from_file (dialog->priv->builder, builder_filename, object_ids, &error);
319 g_free (builder_filename);
321 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
322 g_error_free (error);
326 gl_debug (DEBUG_TEMPLATE, "END");
333 gl_template_designer_finalize (GObject *object)
335 glTemplateDesigner* dialog = GL_TEMPLATE_DESIGNER (object);
337 gl_debug (DEBUG_TEMPLATE, "START");
339 g_return_if_fail (object != NULL);
340 g_return_if_fail (GL_IS_TEMPLATE_DESIGNER (dialog));
341 g_return_if_fail (dialog->priv != NULL);
343 g_free (dialog->priv->edit_brand);
344 g_free (dialog->priv->edit_part);
346 if (dialog->priv->builder)
348 g_object_unref (dialog->priv->builder);
350 g_free (dialog->priv);
352 G_OBJECT_CLASS (gl_template_designer_parent_class)->finalize (object);
354 gl_debug (DEBUG_TEMPLATE, "END");
358 /*****************************************************************************/
359 /* NEW preferences dialog. */
360 /*****************************************************************************/
362 gl_template_designer_new (GtkWindow *parent)
366 gl_debug (DEBUG_TEMPLATE, "START");
368 dialog = GTK_WIDGET (g_object_new (GL_TYPE_TEMPLATE_DESIGNER, NULL));
371 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
373 gl_template_designer_construct (GL_TEMPLATE_DESIGNER(dialog));
376 gl_debug (DEBUG_TEMPLATE, "END");
382 /*---------------------------------------------------------------------------*/
383 /* PRIVATE. Construct composite widget. */
384 /*---------------------------------------------------------------------------*/
386 gl_template_designer_construct (glTemplateDesigner *dialog)
389 gchar *logo_filename;
392 gl_debug (DEBUG_TEMPLATE, "START");
394 g_return_if_fail (dialog && GL_IS_TEMPLATE_DESIGNER (dialog));
395 g_return_if_fail (dialog->priv != NULL);
397 /* Initialize units stuff from prefs */
398 units = gl_prefs_model_get_units (gl_prefs);
399 dialog->priv->units_string = lgl_units_get_name (units);
400 dialog->priv->units_per_point = lgl_units_get_units_per_point (units);
401 dialog->priv->climb_rate = gl_units_util_get_step_size (units);
402 dialog->priv->digits = gl_units_util_get_precision (units);
404 gtk_window_set_title (GTK_WINDOW(dialog), _("New gLabels Template"));
406 logo_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "new-select.png", NULL);
407 logo = gdk_pixbuf_new_from_file (logo_filename, NULL);
408 g_free (logo_filename);
410 /* Construct and append pages (must be same order as PAGE_NUM enums. */
411 construct_start_page (dialog, logo);
412 construct_name_page (dialog, logo);
413 construct_pg_size_page (dialog, logo);
414 construct_shape_page (dialog, logo);
415 construct_rect_size_page (dialog, logo);
416 construct_round_size_page (dialog, logo);
417 construct_cd_size_page (dialog, logo);
418 construct_nlayouts_page (dialog, logo);
419 construct_layout_page (dialog, logo);
420 construct_finish_page (dialog, logo);
422 gtk_assistant_set_forward_page_func (GTK_ASSISTANT (dialog),
423 forward_page_function,
428 g_signal_connect_swapped (G_OBJECT(dialog), "cancel",
429 G_CALLBACK(cancel_cb), dialog);
430 g_signal_connect_swapped (G_OBJECT(dialog), "apply",
431 G_CALLBACK(apply_cb), dialog);
432 g_signal_connect_swapped (G_OBJECT(dialog), "close",
433 G_CALLBACK(close_cb), dialog);
434 g_signal_connect (G_OBJECT(dialog), "prepare",
435 G_CALLBACK(prepare_cb), NULL);
437 gtk_widget_show_all (GTK_WIDGET(dialog));
439 gl_debug (DEBUG_TEMPLATE, "END");
443 /*--------------------------------------------------------------------------*/
444 /* PRIVATE. Construct start page. */
445 /*--------------------------------------------------------------------------*/
447 construct_start_page (glTemplateDesigner *dialog,
450 gl_debug (DEBUG_TEMPLATE, "START");
452 gl_builder_util_get_widgets (dialog->priv->builder,
453 "start_page", &dialog->priv->start_page,
456 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
457 dialog->priv->start_page);
459 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
460 dialog->priv->start_page,
462 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
463 dialog->priv->start_page,
465 gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
466 dialog->priv->start_page,
467 GTK_ASSISTANT_PAGE_INTRO);
468 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
469 dialog->priv->start_page,
472 gl_debug (DEBUG_TEMPLATE, "END");
476 /*--------------------------------------------------------------------------*/
477 /* PRIVATE. Construct name page. */
478 /*--------------------------------------------------------------------------*/
480 construct_name_page (glTemplateDesigner *dialog,
483 gl_debug (DEBUG_TEMPLATE, "START");
485 gl_builder_util_get_widgets (dialog->priv->builder,
486 "name_page", &dialog->priv->name_page,
487 "brand_entry", &dialog->priv->brand_entry,
488 "part_num_entry", &dialog->priv->part_num_entry,
489 "name_warning_image", &dialog->priv->name_warning_image,
490 "name_warning_label", &dialog->priv->name_warning_label,
491 "description_entry", &dialog->priv->description_entry,
495 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
496 dialog->priv->name_page);
498 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
499 dialog->priv->name_page,
500 _("Name and Description"));
501 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
502 dialog->priv->name_page,
505 /* Connect a handler that listens for changes in these widgets */
506 /* This controls whether we can progress to the next page. */
507 g_signal_connect_swapped (G_OBJECT(dialog->priv->brand_entry), "changed",
508 G_CALLBACK(name_page_changed_cb), dialog);
509 g_signal_connect_swapped (G_OBJECT(dialog->priv->part_num_entry), "changed",
510 G_CALLBACK(name_page_changed_cb), dialog);
511 g_signal_connect_swapped (G_OBJECT(dialog->priv->description_entry), "changed",
512 G_CALLBACK(name_page_changed_cb), dialog);
514 gl_debug (DEBUG_TEMPLATE, "END");
518 /*--------------------------------------------------------------------------*/
519 /* PRIVATE. Construct page size page. */
520 /*--------------------------------------------------------------------------*/
522 construct_pg_size_page (glTemplateDesigner *dialog,
526 const gchar *default_page_size_id;
527 gchar *default_page_size_name;
529 gl_debug (DEBUG_TEMPLATE, "START");
531 gl_builder_util_get_widgets (dialog->priv->builder,
532 "pg_size_page", &dialog->priv->pg_size_page,
533 "pg_size_combo", &dialog->priv->pg_size_combo,
534 "pg_w_spin", &dialog->priv->pg_w_spin,
535 "pg_h_spin", &dialog->priv->pg_h_spin,
536 "pg_w_units_label", &dialog->priv->pg_w_units_label,
537 "pg_h_units_label", &dialog->priv->pg_h_units_label,
541 gl_combo_util_add_text_model (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
543 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
544 dialog->priv->pg_size_page);
546 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
547 dialog->priv->pg_size_page,
549 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
550 dialog->priv->pg_size_page,
552 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
553 dialog->priv->pg_size_page,
556 /* Load page size combo */
557 page_sizes = lgl_db_get_paper_name_list ();
558 gl_combo_util_set_strings (GTK_COMBO_BOX (dialog->priv->pg_size_combo), page_sizes);
559 lgl_db_free_paper_name_list (page_sizes);
560 default_page_size_id = gl_prefs_model_get_default_page_size (gl_prefs);
561 default_page_size_name = lgl_db_lookup_paper_name_from_id (default_page_size_id);
562 gl_combo_util_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), default_page_size_name);
563 g_free (default_page_size_name);
565 /* Apply units to spinbuttons and units labels. */
566 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
567 dialog->priv->digits);
568 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
569 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
570 gtk_label_set_text (GTK_LABEL(dialog->priv->pg_w_units_label),
571 dialog->priv->units_string);
572 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_w_spin),
573 0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
574 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
575 dialog->priv->digits);
576 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
577 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
578 gtk_label_set_text (GTK_LABEL(dialog->priv->pg_h_units_label),
579 dialog->priv->units_string);
580 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_h_spin),
581 0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
583 /* Connect a handler that listens for changes in these widgets */
584 /* This controls sensitivity of related widgets. */
585 g_signal_connect_swapped (G_OBJECT(dialog->priv->pg_size_combo), "changed",
586 G_CALLBACK(pg_size_page_changed_cb), dialog);
588 gl_debug (DEBUG_TEMPLATE, "END");
592 /*--------------------------------------------------------------------------*/
593 /* PRIVATE. Construct shape page. */
594 /*--------------------------------------------------------------------------*/
596 construct_shape_page (glTemplateDesigner *dialog,
599 gl_debug (DEBUG_TEMPLATE, "START");
601 gl_builder_util_get_widgets (dialog->priv->builder,
602 "shape_page", &dialog->priv->shape_page,
603 "shape_rect_radio", &dialog->priv->shape_rect_radio,
604 "shape_round_radio", &dialog->priv->shape_round_radio,
605 "shape_cd_radio", &dialog->priv->shape_cd_radio,
609 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
610 dialog->priv->shape_page);
612 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
613 dialog->priv->shape_page,
614 _("Label or Card Shape"));
615 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
616 dialog->priv->shape_page,
618 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
619 dialog->priv->shape_page,
622 gl_debug (DEBUG_TEMPLATE, "END");
626 /*--------------------------------------------------------------------------*/
627 /* PRIVATE. Construct rect size page. */
628 /*--------------------------------------------------------------------------*/
630 construct_rect_size_page (glTemplateDesigner *dialog,
633 gchar *pixbuf_filename;
636 gl_debug (DEBUG_TEMPLATE, "START");
638 gl_builder_util_get_widgets (dialog->priv->builder,
639 "rect_size_page", &dialog->priv->rect_size_page,
640 "rect_image", &dialog->priv->rect_image,
641 "rect_w_spin", &dialog->priv->rect_w_spin,
642 "rect_h_spin", &dialog->priv->rect_h_spin,
643 "rect_r_spin", &dialog->priv->rect_r_spin,
644 "rect_x_waste_spin", &dialog->priv->rect_x_waste_spin,
645 "rect_y_waste_spin", &dialog->priv->rect_y_waste_spin,
646 "rect_margin_spin", &dialog->priv->rect_margin_spin,
647 "rect_w_units_label", &dialog->priv->rect_w_units_label,
648 "rect_h_units_label", &dialog->priv->rect_h_units_label,
649 "rect_r_units_label", &dialog->priv->rect_r_units_label,
650 "rect_x_waste_units_label", &dialog->priv->rect_x_waste_units_label,
651 "rect_y_waste_units_label", &dialog->priv->rect_y_waste_units_label,
652 "rect_margin_units_label", &dialog->priv->rect_margin_units_label,
656 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
657 dialog->priv->rect_size_page);
659 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
660 dialog->priv->rect_size_page,
661 _("Label or Card Size"));
662 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
663 dialog->priv->rect_size_page,
665 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
666 dialog->priv->rect_size_page,
669 /* Initialize illustration. */
670 pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-rect-size.png", NULL);
671 pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
672 g_free (pixbuf_filename);
673 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->rect_image), pixbuf);
675 /* Apply units to spinbuttons and units labels. */
676 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
677 dialog->priv->digits);
678 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
679 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
680 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_w_units_label),
681 dialog->priv->units_string);
682 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
683 dialog->priv->digits);
684 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
685 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
686 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_h_units_label),
687 dialog->priv->units_string);
688 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
689 dialog->priv->digits);
690 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
691 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
692 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_r_units_label),
693 dialog->priv->units_string);
694 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
695 dialog->priv->digits);
696 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
697 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
698 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_x_waste_units_label),
699 dialog->priv->units_string);
700 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
701 dialog->priv->digits);
702 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
703 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
704 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_y_waste_units_label),
705 dialog->priv->units_string);
706 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
707 dialog->priv->digits);
708 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
709 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
710 gtk_label_set_text (GTK_LABEL(dialog->priv->rect_margin_units_label),
711 dialog->priv->units_string);
713 /* Load some realistic defaults. */
714 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
715 DEFAULT_RECT_W * dialog->priv->units_per_point);
716 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
717 DEFAULT_RECT_H * dialog->priv->units_per_point);
718 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
719 DEFAULT_RECT_R * dialog->priv->units_per_point);
720 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
721 DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
722 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
723 DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
724 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
725 DEFAULT_MARGIN * dialog->priv->units_per_point);
727 gl_debug (DEBUG_TEMPLATE, "END");
731 /*--------------------------------------------------------------------------*/
732 /* PRIVATE. Construct round size page. */
733 /*--------------------------------------------------------------------------*/
735 construct_round_size_page (glTemplateDesigner *dialog,
738 gchar *pixbuf_filename;
741 gl_debug (DEBUG_TEMPLATE, "START");
743 gl_builder_util_get_widgets (dialog->priv->builder,
744 "round_size_page", &dialog->priv->round_size_page,
745 "round_image", &dialog->priv->round_image,
746 "round_r_spin", &dialog->priv->round_r_spin,
747 "round_waste_spin", &dialog->priv->round_waste_spin,
748 "round_margin_spin", &dialog->priv->round_margin_spin,
749 "round_r_units_label", &dialog->priv->round_r_units_label,
750 "round_waste_units_label", &dialog->priv->round_waste_units_label,
751 "round_margin_units_label", &dialog->priv->round_margin_units_label,
755 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
756 dialog->priv->round_size_page);
758 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
759 dialog->priv->round_size_page,
760 _("Label Size (round)"));
761 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
762 dialog->priv->round_size_page,
764 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
765 dialog->priv->round_size_page,
768 /* Initialize illustration. */
769 pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-round-size.png", NULL);
770 pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
771 g_free (pixbuf_filename);
772 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->round_image), pixbuf);
774 /* Apply units to spinbuttons and units labels. */
775 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
776 dialog->priv->digits);
777 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
778 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
779 gtk_label_set_text (GTK_LABEL(dialog->priv->round_r_units_label),
780 dialog->priv->units_string);
781 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
782 dialog->priv->digits);
783 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
784 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
785 gtk_label_set_text (GTK_LABEL(dialog->priv->round_waste_units_label),
786 dialog->priv->units_string);
787 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
788 dialog->priv->digits);
789 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
790 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
791 gtk_label_set_text (GTK_LABEL(dialog->priv->round_margin_units_label),
792 dialog->priv->units_string);
794 /* Load some realistic defaults. */
795 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
796 DEFAULT_ROUND_R * dialog->priv->units_per_point);
797 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
798 DEFAULT_ROUND_WASTE * dialog->priv->units_per_point);
799 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
800 DEFAULT_MARGIN * dialog->priv->units_per_point);
802 gl_debug (DEBUG_TEMPLATE, "END");
806 /*--------------------------------------------------------------------------*/
807 /* PRIVATE. Construct CD/DVD size page. */
808 /*--------------------------------------------------------------------------*/
810 construct_cd_size_page (glTemplateDesigner *dialog,
813 gchar *pixbuf_filename;
816 gl_debug (DEBUG_TEMPLATE, "START");
818 gl_builder_util_get_widgets (dialog->priv->builder,
819 "cd_size_page", &dialog->priv->cd_size_page,
820 "cd_image", &dialog->priv->cd_image,
821 "cd_radius_spin", &dialog->priv->cd_radius_spin,
822 "cd_hole_spin", &dialog->priv->cd_hole_spin,
823 "cd_w_spin", &dialog->priv->cd_w_spin,
824 "cd_h_spin", &dialog->priv->cd_h_spin,
825 "cd_waste_spin", &dialog->priv->cd_waste_spin,
826 "cd_margin_spin", &dialog->priv->cd_margin_spin,
827 "cd_radius_units_label", &dialog->priv->cd_radius_units_label,
828 "cd_hole_units_label", &dialog->priv->cd_hole_units_label,
829 "cd_w_units_label", &dialog->priv->cd_w_units_label,
830 "cd_h_units_label", &dialog->priv->cd_h_units_label,
831 "cd_waste_units_label", &dialog->priv->cd_waste_units_label,
832 "cd_margin_units_label", &dialog->priv->cd_margin_units_label,
836 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
837 dialog->priv->cd_size_page);
839 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
840 dialog->priv->cd_size_page,
841 _("Label Size (CD/DVD)"));
842 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
843 dialog->priv->cd_size_page,
845 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
846 dialog->priv->cd_size_page,
849 /* Initialize illustration. */
850 pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-cd-size.png", NULL);
851 pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
852 g_free (pixbuf_filename);
853 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->cd_image), pixbuf);
855 /* Apply units to spinbuttons and units labels. */
856 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
857 dialog->priv->digits);
858 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
859 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
860 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_radius_units_label),
861 dialog->priv->units_string);
862 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
863 dialog->priv->digits);
864 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
865 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
866 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_hole_units_label),
867 dialog->priv->units_string);
868 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
869 dialog->priv->digits);
870 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
871 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
872 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_w_units_label),
873 dialog->priv->units_string);
874 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
875 dialog->priv->digits);
876 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
877 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
878 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_h_units_label),
879 dialog->priv->units_string);
880 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
881 dialog->priv->digits);
882 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
883 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
884 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_waste_units_label),
885 dialog->priv->units_string);
886 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
887 dialog->priv->digits);
888 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
889 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
890 gtk_label_set_text (GTK_LABEL(dialog->priv->cd_margin_units_label),
891 dialog->priv->units_string);
893 /* Load some realistic defaults. */
894 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
895 DEFAULT_CD_RADIUS * dialog->priv->units_per_point);
896 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
897 DEFAULT_CD_HOLE * dialog->priv->units_per_point);
898 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
899 DEFAULT_CD_WASTE * dialog->priv->units_per_point);
900 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
901 DEFAULT_MARGIN * dialog->priv->units_per_point);
903 gl_debug (DEBUG_TEMPLATE, "END");
907 /*--------------------------------------------------------------------------*/
908 /* PRIVATE. Construct number of layouts page. */
909 /*--------------------------------------------------------------------------*/
911 construct_nlayouts_page (glTemplateDesigner *dialog,
914 gchar *pixbuf_filename;
917 gl_debug (DEBUG_TEMPLATE, "START");
919 gl_builder_util_get_widgets (dialog->priv->builder,
920 "nlayouts_page", &dialog->priv->nlayouts_page,
921 "nlayouts_image1", &dialog->priv->nlayouts_image1,
922 "nlayouts_image2", &dialog->priv->nlayouts_image2,
923 "nlayouts_spin", &dialog->priv->nlayouts_spin,
927 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
928 dialog->priv->nlayouts_page);
930 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
931 dialog->priv->nlayouts_page,
932 _("Number of Layouts"));
933 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
934 dialog->priv->nlayouts_page,
936 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
937 dialog->priv->nlayouts_page,
940 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin),
944 /* Initialize illustrations. */
945 pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-1layout.png", NULL);
946 pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
947 g_free (pixbuf_filename);
948 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image1), pixbuf);
949 pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-2layouts.png", NULL);
950 pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
951 g_free (pixbuf_filename);
952 gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image2), pixbuf);
954 gl_debug (DEBUG_TEMPLATE, "END");
958 /*--------------------------------------------------------------------------*/
959 /* PRIVATE. Construct layout page. */
960 /*--------------------------------------------------------------------------*/
962 construct_layout_page (glTemplateDesigner *dialog,
965 gl_debug (DEBUG_TEMPLATE, "START");
967 gl_builder_util_get_widgets (dialog->priv->builder,
968 "layout_page", &dialog->priv->layout_page,
969 "layout1_head_label", &dialog->priv->layout1_head_label,
970 "layout1_nx_spin", &dialog->priv->layout1_nx_spin,
971 "layout1_ny_spin", &dialog->priv->layout1_ny_spin,
972 "layout1_x0_spin", &dialog->priv->layout1_x0_spin,
973 "layout1_y0_spin", &dialog->priv->layout1_y0_spin,
974 "layout1_dx_spin", &dialog->priv->layout1_dx_spin,
975 "layout1_dy_spin", &dialog->priv->layout1_dy_spin,
976 "layout2_head_label", &dialog->priv->layout2_head_label,
977 "layout2_nx_spin", &dialog->priv->layout2_nx_spin,
978 "layout2_ny_spin", &dialog->priv->layout2_ny_spin,
979 "layout2_x0_spin", &dialog->priv->layout2_x0_spin,
980 "layout2_y0_spin", &dialog->priv->layout2_y0_spin,
981 "layout2_dx_spin", &dialog->priv->layout2_dx_spin,
982 "layout2_dy_spin", &dialog->priv->layout2_dy_spin,
983 "layout_x0_units_label", &dialog->priv->layout_x0_units_label,
984 "layout_y0_units_label", &dialog->priv->layout_y0_units_label,
985 "layout_dx_units_label", &dialog->priv->layout_dx_units_label,
986 "layout_dy_units_label", &dialog->priv->layout_dy_units_label,
987 "mini_preview_vbox", &dialog->priv->mini_preview_vbox,
988 "layout_test_button", &dialog->priv->layout_test_button,
991 dialog->priv->layout_mini_preview = gl_mini_preview_new (175, 200);
992 gtk_container_add (GTK_CONTAINER (dialog->priv->mini_preview_vbox),
993 dialog->priv->layout_mini_preview);
995 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
996 dialog->priv->layout_page);
998 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
999 dialog->priv->layout_page,
1001 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
1002 dialog->priv->layout_page,
1004 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1005 dialog->priv->layout_page,
1008 /* Apply units to spinbuttons and units labels. */
1009 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
1010 dialog->priv->digits);
1011 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
1012 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1013 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
1014 dialog->priv->digits);
1015 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
1016 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1017 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_x0_units_label),
1018 dialog->priv->units_string);
1019 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
1020 dialog->priv->digits);
1021 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
1022 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1023 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1024 dialog->priv->digits);
1025 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1026 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1027 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_y0_units_label),
1028 dialog->priv->units_string);
1029 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1030 dialog->priv->digits);
1031 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1032 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1033 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1034 dialog->priv->digits);
1035 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1036 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1037 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dx_units_label),
1038 dialog->priv->units_string);
1039 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1040 dialog->priv->digits);
1041 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1042 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1043 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1044 dialog->priv->digits);
1045 gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1046 dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1047 gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dy_units_label),
1048 dialog->priv->units_string);
1050 /* Connect a handler that listens for changes in these widgets */
1051 /* This controls sensitivity of related widgets. */
1052 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_nx_spin), "changed",
1053 G_CALLBACK(layout_page_changed_cb), dialog);
1054 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_ny_spin), "changed",
1055 G_CALLBACK(layout_page_changed_cb), dialog);
1056 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_x0_spin), "changed",
1057 G_CALLBACK(layout_page_changed_cb), dialog);
1058 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_y0_spin), "changed",
1059 G_CALLBACK(layout_page_changed_cb), dialog);
1060 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dx_spin), "changed",
1061 G_CALLBACK(layout_page_changed_cb), dialog);
1062 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dy_spin), "changed",
1063 G_CALLBACK(layout_page_changed_cb), dialog);
1064 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_nx_spin), "changed",
1065 G_CALLBACK(layout_page_changed_cb), dialog);
1066 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_ny_spin), "changed",
1067 G_CALLBACK(layout_page_changed_cb), dialog);
1068 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_x0_spin), "changed",
1069 G_CALLBACK(layout_page_changed_cb), dialog);
1070 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_y0_spin), "changed",
1071 G_CALLBACK(layout_page_changed_cb), dialog);
1072 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dx_spin), "changed",
1073 G_CALLBACK(layout_page_changed_cb), dialog);
1074 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dy_spin), "changed",
1075 G_CALLBACK(layout_page_changed_cb), dialog);
1079 g_signal_connect_swapped (G_OBJECT(dialog->priv->layout_test_button), "clicked",
1080 G_CALLBACK(print_test_cb), dialog);
1082 gl_debug (DEBUG_TEMPLATE, "END");
1086 /*--------------------------------------------------------------------------*/
1087 /* PRIVATE. Construct finish page. */
1088 /*--------------------------------------------------------------------------*/
1090 construct_finish_page (glTemplateDesigner *dialog,
1093 gl_debug (DEBUG_TEMPLATE, "START");
1095 gl_builder_util_get_widgets (dialog->priv->builder,
1096 "finish_page", &dialog->priv->finish_page,
1100 gtk_assistant_append_page (GTK_ASSISTANT (dialog),
1101 dialog->priv->finish_page);
1103 gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
1104 dialog->priv->finish_page,
1105 _("Design Completed"));
1106 gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
1107 dialog->priv->finish_page,
1109 gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
1110 dialog->priv->finish_page,
1111 GTK_ASSISTANT_PAGE_CONFIRM);
1112 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1113 dialog->priv->finish_page,
1116 gl_debug (DEBUG_TEMPLATE, "END");
1120 /*****************************************************************************/
1121 /* Initialize dialog from existing template. */
1122 /*****************************************************************************/
1124 gl_template_designer_set_from_name (glTemplateDesigner *dialog,
1127 lglTemplate *template;
1129 lglTemplateFrame *frame;
1131 GList *p, *p_layout1, *p_layout2;
1133 gtk_window_set_title (GTK_WINDOW(dialog), _("Edit gLabels Template"));
1135 template = lgl_db_lookup_template_from_name (name);
1136 if ( lgl_template_does_category_match (template, "user-defined") )
1139 dialog->priv->stop_signals = TRUE;
1141 dialog->priv->edit_flag = TRUE;
1142 dialog->priv->edit_brand = g_strdup (template->brand);
1143 dialog->priv->edit_part = g_strdup (template->part);
1145 upp = dialog->priv->units_per_point;
1147 gtk_entry_set_text (GTK_ENTRY (dialog->priv->brand_entry), template->brand);
1148 gtk_entry_set_text (GTK_ENTRY (dialog->priv->part_num_entry), template->part);
1149 gtk_entry_set_text (GTK_ENTRY (dialog->priv->description_entry), template->description);
1152 paper_name = lgl_db_lookup_paper_name_from_id (template->paper_id);
1153 gl_combo_util_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), paper_name);
1154 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin), template->page_width*upp);
1155 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin), template->page_height*upp);
1156 g_free (paper_name);
1159 frame = (lglTemplateFrame *)template->frames->data;
1160 switch (frame->shape)
1162 case LGL_TEMPLATE_FRAME_SHAPE_RECT:
1164 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_rect_radio), TRUE);
1165 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), frame->rect.w*upp);
1166 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), frame->rect.h*upp);
1167 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), frame->rect.r*upp);
1168 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), frame->rect.x_waste*upp);
1169 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), frame->rect.y_waste*upp);
1172 case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
1175 case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
1176 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_round_radio), TRUE);
1177 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), frame->round.r*upp);
1178 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), frame->round.waste*upp);
1181 case LGL_TEMPLATE_FRAME_SHAPE_CD:
1182 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_cd_radio), TRUE);
1183 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), frame->cd.r1*upp);
1184 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), frame->cd.r2*upp);
1185 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), frame->cd.w*upp);
1186 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), frame->cd.h*upp);
1187 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), frame->round.waste*upp);
1191 for ( p = frame->all.markups; p != NULL; p=p->next )
1193 lglTemplateMarkup *markup = (lglTemplateMarkup *)p->data;
1195 if ( markup->type == LGL_TEMPLATE_MARKUP_MARGIN )
1197 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), markup->margin.size*upp);
1198 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), markup->margin.size*upp);
1199 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), markup->margin.size*upp);
1204 p_layout1 = g_list_nth (frame->all.layouts, 0);
1205 p_layout2 = g_list_nth (frame->all.layouts, 1);
1206 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->nlayouts_spin), p_layout2 ? 2 : 1 );
1209 lglTemplateLayout *layout1 = (lglTemplateLayout *)p_layout1->data;
1211 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), layout1->nx);
1212 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), layout1->ny);
1213 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), layout1->x0*upp);
1214 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), layout1->y0*upp);
1215 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), layout1->dx*upp);
1216 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), layout1->dy*upp);
1220 lglTemplateLayout *layout2 = (lglTemplateLayout *)p_layout2->data;
1222 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), layout2->nx);
1223 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), layout2->ny);
1224 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), layout2->x0*upp);
1225 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), layout2->y0*upp);
1226 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), layout2->dx*upp);
1227 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), layout2->dy*upp);
1231 dialog->priv->stop_signals = FALSE;
1237 /*--------------------------------------------------------------------------*/
1238 /* PRIVATE. cancel callback. */
1239 /*--------------------------------------------------------------------------*/
1241 cancel_cb (glTemplateDesigner *dialog)
1244 gtk_widget_destroy (GTK_WIDGET(dialog));
1249 /*--------------------------------------------------------------------------*/
1250 /* PRIVATE. apply callback */
1251 /*--------------------------------------------------------------------------*/
1253 apply_cb (glTemplateDesigner *dialog)
1256 lglTemplate *template;
1259 units = gl_prefs_model_get_units (gl_prefs);
1260 lgl_xml_set_default_units (units);
1262 if (dialog->priv->edit_flag)
1264 lgl_db_delete_template_by_brand_part (dialog->priv->edit_brand, dialog->priv->edit_part);
1266 name = g_strdup_printf ("%s %s", dialog->priv->edit_brand, dialog->priv->edit_part);
1267 gl_mini_preview_pixbuf_cache_delete_by_name (name);
1271 template = build_template (dialog);
1272 lgl_db_register_template (template);
1273 name = lgl_template_get_name (template);
1274 gl_mini_preview_pixbuf_cache_add_by_name (name);
1279 /*--------------------------------------------------------------------------*/
1280 /* PRIVATE. close callback */
1281 /*--------------------------------------------------------------------------*/
1283 close_cb (glTemplateDesigner *dialog)
1286 gtk_widget_destroy (GTK_WIDGET(dialog));
1291 /*--------------------------------------------------------------------------*/
1292 /* PRIVATE. prepare page callback */
1293 /*--------------------------------------------------------------------------*/
1295 prepare_cb (glTemplateDesigner *dialog,
1300 page_num = gtk_assistant_get_current_page (GTK_ASSISTANT (dialog));
1306 name_page_changed_cb (dialog); /* Use to prepare */
1309 case PG_SIZE_PAGE_NUM:
1310 pg_size_page_changed_cb (dialog); /* Use to prepare */
1313 case RECT_SIZE_PAGE_NUM:
1314 rect_size_page_prepare_cb (dialog);
1317 case ROUND_SIZE_PAGE_NUM:
1318 round_size_page_prepare_cb (dialog);
1321 case CD_SIZE_PAGE_NUM:
1322 cd_size_page_prepare_cb (dialog);
1325 case LAYOUT_PAGE_NUM:
1326 layout_page_prepare_cb (dialog);
1330 /* No preparation needed */
1337 /*--------------------------------------------------------------------------*/
1338 /* PRIVATE. Handle non-linear forward traversal. */
1339 /*--------------------------------------------------------------------------*/
1341 forward_page_function (gint current_page,
1344 glTemplateDesigner *dialog = GL_TEMPLATE_DESIGNER (data);
1346 switch (current_page)
1348 case START_PAGE_NUM:
1349 return NAME_PAGE_NUM;
1352 return PG_SIZE_PAGE_NUM;
1354 case PG_SIZE_PAGE_NUM:
1355 return SHAPE_PAGE_NUM;
1357 case SHAPE_PAGE_NUM:
1358 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1359 return RECT_SIZE_PAGE_NUM;
1361 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1362 return ROUND_SIZE_PAGE_NUM;
1364 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1365 return CD_SIZE_PAGE_NUM;
1369 case RECT_SIZE_PAGE_NUM:
1370 case ROUND_SIZE_PAGE_NUM:
1371 case CD_SIZE_PAGE_NUM:
1372 return NLAYOUTS_PAGE_NUM;
1374 case NLAYOUTS_PAGE_NUM:
1375 return LAYOUT_PAGE_NUM;
1377 case LAYOUT_PAGE_NUM:
1378 return FINISH_PAGE_NUM;
1380 case FINISH_PAGE_NUM:
1389 /*--------------------------------------------------------------------------*/
1390 /* PRIVATE. Widget on name page "changed" callback. */
1391 /*--------------------------------------------------------------------------*/
1393 name_page_changed_cb (glTemplateDesigner *dialog)
1395 gchar *brand, *part_num, *desc;
1398 brand = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1));
1399 part_num = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1));
1400 desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1402 gtk_image_clear (GTK_IMAGE (dialog->priv->name_warning_image));
1403 gtk_label_set_text (GTK_LABEL (dialog->priv->name_warning_label), "");
1405 if (brand && brand[0] && part_num && part_num[0])
1408 if (lgl_db_does_template_exist (brand, part_num))
1410 /* Make exception for currently edited template. */
1411 if ( dialog->priv->edit_brand && !lgl_str_utf8_casecmp (brand, dialog->priv->edit_brand) &&
1412 dialog->priv->edit_part && !lgl_str_utf8_casecmp (part_num, dialog->priv->edit_part) )
1414 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, TRUE);
1418 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, FALSE);
1420 gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->name_warning_image),
1421 GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON);
1422 string = g_strdup_printf ("<span foreground='red' weight='bold'>%s</span>",
1423 _("Brand and part# match an existing template!"));
1424 gtk_label_set_markup (GTK_LABEL (dialog->priv->name_warning_label), string);
1431 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, TRUE);
1437 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, FALSE);
1446 /*--------------------------------------------------------------------------*/
1447 /* PRIVATE. Widget on page size page "changed" callback. */
1448 /*--------------------------------------------------------------------------*/
1450 pg_size_page_changed_cb (glTemplateDesigner *dialog)
1452 gchar *page_size_name;
1457 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1459 if (page_size_name && strlen(page_size_name)) {
1461 paper = lgl_db_lookup_paper_from_name (page_size_name);
1464 if ( g_ascii_strcasecmp (paper->id, "Other") == 0 ) {
1465 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), TRUE);
1466 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), TRUE);
1467 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1469 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1473 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), FALSE);
1474 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), FALSE);
1475 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1477 gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1480 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
1481 paper->width * dialog->priv->units_per_point);
1482 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
1483 paper->height * dialog->priv->units_per_point);
1486 lgl_paper_free (paper);
1489 g_free (page_size_name);
1494 /*--------------------------------------------------------------------------*/
1495 /* PRIVATE. Prepare rectangular size page. */
1496 /*--------------------------------------------------------------------------*/
1498 rect_size_page_prepare_cb (glTemplateDesigner *dialog)
1500 gdouble max_w, max_h;
1501 gdouble w, h, r, x_waste, y_waste, margin;
1503 /* Limit label size based on already chosen page size. */
1504 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1505 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1507 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1508 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1509 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1510 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1511 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1512 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1514 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_w_spin),
1515 dialog->priv->climb_rate, max_w);
1516 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_h_spin),
1517 dialog->priv->climb_rate, max_h);
1518 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_r_spin),
1519 0.0, MIN(max_w, max_h)/2.0);
1520 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_x_waste_spin),
1521 0.0, MIN(max_w, max_h)/4.0);
1522 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_y_waste_spin),
1523 0.0, MIN(max_w, max_h)/4.0);
1524 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_margin_spin),
1525 0.0, MIN(max_w, max_h)/4.0);
1527 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), w);
1528 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), h);
1529 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), r);
1530 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), x_waste);
1531 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), y_waste);
1532 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), margin);
1537 /*--------------------------------------------------------------------------*/
1538 /* PRIVATE. Prepare round size page. */
1539 /*--------------------------------------------------------------------------*/
1541 round_size_page_prepare_cb (glTemplateDesigner *dialog)
1543 gdouble max_w, max_h;
1544 gdouble r, waste, margin;
1546 /* Limit label size based on already chosen page size. */
1547 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1548 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1550 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1551 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1552 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1554 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_r_spin),
1555 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1556 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_waste_spin),
1557 0.0, MIN(max_w, max_h)/4.0);
1558 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_margin_spin),
1559 0.0, MIN(max_w, max_h)/4.0);
1561 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), r);
1562 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), waste);
1563 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), margin);
1568 /*--------------------------------------------------------------------------*/
1569 /* PRIVATE. Prepare cd/dvd size page. */
1570 /*--------------------------------------------------------------------------*/
1572 cd_size_page_prepare_cb (glTemplateDesigner *dialog)
1574 gdouble max_w, max_h;
1575 gdouble radius, hole, w, h, waste, margin;
1577 /* Limit label size based on already chosen page size. */
1578 max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1579 max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1581 radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1582 hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1583 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1584 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1585 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1586 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1588 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_radius_spin),
1589 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1590 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_hole_spin),
1591 dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1592 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_w_spin),
1594 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_h_spin),
1596 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_waste_spin),
1597 0.0, MIN(max_w, max_h)/4.0);
1598 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_margin_spin),
1599 0.0, MIN(max_w, max_h)/4.0);
1601 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), radius);
1602 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), hole);
1603 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), w);
1604 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), h);
1605 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), waste);
1606 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), margin);
1611 /*--------------------------------------------------------------------------*/
1612 /* PRIVATE. Prepare Layout page cb. */
1613 /*--------------------------------------------------------------------------*/
1615 layout_page_prepare_cb (glTemplateDesigner *dialog)
1617 gdouble page_w, page_h;
1618 gdouble w=0, h=0, x_waste=0, y_waste=0;
1619 gint max_nx, max_ny;
1621 gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1622 gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1623 lglTemplate *template;
1625 if (dialog->priv->stop_signals) return;
1626 dialog->priv->stop_signals = TRUE;
1629 /* Limit ranges based on already chosen page and label sizes. */
1630 page_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1631 page_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1632 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1633 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1634 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1635 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1636 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1638 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1639 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1641 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1644 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1645 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1647 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1650 max_nx = MAX (floor (page_w/(w + 2*x_waste) + DELTA), 1.0);
1651 max_ny = MAX (floor (page_h/(h + 2*y_waste) + DELTA), 1.0);
1653 nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1654 ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1655 x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1656 y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1657 dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1658 dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1659 nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1660 ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1661 x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1662 y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1663 dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1664 dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1666 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_nx_spin),
1668 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_ny_spin),
1670 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_x0_spin),
1671 x_waste, page_w - w - x_waste);
1672 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_y0_spin),
1673 y_waste, page_h - h - y_waste);
1674 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dx_spin),
1675 w + 2*x_waste, page_w - w - 2*x_waste);
1676 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dy_spin),
1677 h + 2*y_waste, page_h - h - 2*y_waste);
1678 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_nx_spin),
1680 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_ny_spin),
1682 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_x0_spin),
1683 x_waste, page_w - w - x_waste);
1684 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_y0_spin),
1685 y_waste, page_h - h - y_waste);
1686 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dx_spin),
1687 w + 2*x_waste, page_w - w - 2*x_waste);
1688 gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dy_spin),
1689 h + 2*y_waste, page_h - h - 2*y_waste);
1691 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), nx_1);
1692 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), ny_1);
1693 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), x0_1);
1694 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), y0_1);
1695 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), dx_1);
1696 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), dy_1);
1697 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), nx_2);
1698 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), ny_2);
1699 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), x0_2);
1700 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), y0_2);
1701 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), dx_2);
1702 gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), dy_2);
1704 /* Set visibility of layout2 widgets as appropriate. */
1705 nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1706 if ( nlayouts == 1 )
1708 gtk_widget_hide (dialog->priv->layout1_head_label);
1709 gtk_widget_hide (dialog->priv->layout2_head_label);
1710 gtk_widget_hide (dialog->priv->layout2_nx_spin);
1711 gtk_widget_hide (dialog->priv->layout2_ny_spin);
1712 gtk_widget_hide (dialog->priv->layout2_x0_spin);
1713 gtk_widget_hide (dialog->priv->layout2_y0_spin);
1714 gtk_widget_hide (dialog->priv->layout2_dx_spin);
1715 gtk_widget_hide (dialog->priv->layout2_dy_spin);
1719 gtk_widget_show (dialog->priv->layout1_head_label);
1720 gtk_widget_show (dialog->priv->layout2_head_label);
1721 gtk_widget_show (dialog->priv->layout2_nx_spin);
1722 gtk_widget_show (dialog->priv->layout2_ny_spin);
1723 gtk_widget_show (dialog->priv->layout2_x0_spin);
1724 gtk_widget_show (dialog->priv->layout2_y0_spin);
1725 gtk_widget_show (dialog->priv->layout2_dx_spin);
1726 gtk_widget_show (dialog->priv->layout2_dy_spin);
1729 template = build_template (dialog);
1730 gl_mini_preview_set_template (GL_MINI_PREVIEW(dialog->priv->layout_mini_preview),
1732 lgl_template_free (template);
1735 dialog->priv->stop_signals = FALSE;
1739 /*--------------------------------------------------------------------------*/
1740 /* PRIVATE. Layout page widget changed cb. */
1741 /*--------------------------------------------------------------------------*/
1743 layout_page_changed_cb (glTemplateDesigner *dialog)
1745 lglTemplate *template;
1747 if (dialog->priv->stop_signals) return;
1748 dialog->priv->stop_signals = TRUE;
1750 template = build_template (dialog);
1752 gl_mini_preview_set_template (GL_MINI_PREVIEW(dialog->priv->layout_mini_preview),
1755 lgl_template_free (template);
1757 dialog->priv->stop_signals = FALSE;
1761 /*--------------------------------------------------------------------------*/
1762 /* PRIVATE. Print test sheet callback. */
1763 /*--------------------------------------------------------------------------*/
1765 print_test_cb (glTemplateDesigner *dialog)
1768 lglTemplate *template;
1769 glPrintOpDialog *print_op;
1771 label = gl_label_new ();
1773 template = build_template (dialog);
1774 gl_label_set_template (GL_LABEL(label), template, FALSE);
1776 print_op = gl_print_op_dialog_new (GL_LABEL(label));
1777 gl_print_op_force_outline (GL_PRINT_OP (print_op));
1778 gtk_print_operation_run (GTK_PRINT_OPERATION (print_op),
1779 GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
1780 GTK_WINDOW (dialog),
1783 lgl_template_free (template);
1784 g_object_unref (G_OBJECT(label));
1788 /*--------------------------------------------------------------------------*/
1789 /* Build a template based on current assistant settings. */
1790 /*--------------------------------------------------------------------------*/
1791 static lglTemplate *
1792 build_template (glTemplateDesigner *dialog)
1795 gchar *brand, *part_num, *desc;
1796 gchar *page_size_name;
1798 lglTemplateFrameShape shape;
1799 lglTemplateFrame *frame=NULL;
1800 gdouble w=0, h=0, r=0, radius=0, hole=0, waste=0, x_waste=0, y_waste=0, margin=0;
1802 gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1803 gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1804 lglTemplate *template;
1806 upp = dialog->priv->units_per_point;
1808 brand = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1));
1809 part_num = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1));
1810 desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1813 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1814 paper = lgl_db_lookup_paper_from_name (page_size_name);
1815 if ( g_ascii_strcasecmp (paper->id, "Other") == 0 ) {
1817 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin))
1820 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin))
1824 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1825 shape = LGL_TEMPLATE_FRAME_SHAPE_RECT;
1826 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1827 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1828 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1829 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1830 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1831 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1834 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1835 shape = LGL_TEMPLATE_FRAME_SHAPE_ROUND;
1836 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1837 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1838 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1841 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1842 shape = LGL_TEMPLATE_FRAME_SHAPE_CD;
1843 radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1844 hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1845 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1846 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1847 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1848 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1851 nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1852 nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1853 ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1854 x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1855 y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1856 dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1857 dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1858 nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1859 ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1860 x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1861 y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1862 dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1863 dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1866 template = lgl_template_new (brand, part_num, desc, paper->id, paper->width, paper->height);
1869 case LGL_TEMPLATE_FRAME_SHAPE_RECT:
1870 frame = lgl_template_frame_rect_new ("0",
1871 w/upp, h/upp, r/upp,
1872 x_waste/upp, y_waste/upp);
1874 case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
1875 frame = lgl_template_frame_round_new ("0", r/upp, waste/upp);
1877 case LGL_TEMPLATE_FRAME_SHAPE_CD:
1878 frame = lgl_template_frame_cd_new ("0",
1879 radius/upp, hole/upp,
1884 g_assert_not_reached ();
1887 lgl_template_add_frame (template, frame);
1889 lgl_template_frame_add_markup (frame,
1890 lgl_template_markup_margin_new (margin/upp));
1892 lgl_template_frame_add_layout (frame,
1893 lgl_template_layout_new (nx_1, ny_1,
1899 lgl_template_frame_add_layout (frame,
1900 lgl_template_layout_new (nx_2, ny_2,
1911 g_free (page_size_name);
1912 lgl_paper_free (paper);
1920 * Local Variables: -- emacs
1922 * c-basic-offset: 8 -- emacs
1923 * tab-width: 8 -- emacs
1924 * indent-tabs-mode: nil -- emacs