1 /* Needed for localization support */
2 #include <adg/adg-internal.h>
4 /* Force the reinclusion of adg.h */
13 #define SQRT3 1.732050808
17 typedef struct _DemoPart DemoPart
;
51 /* User interface widgets */
60 AdgPath
*hatch_contour
;
62 /* Special entities */
63 AdgTitleBlock
*title_block
;
71 g_print("adg-demo " PACKAGE_VERSION
"\n");
76 _adg_parse_args(gint
*p_argc
, gchar
**p_argv
[], gboolean
*show_extents
)
79 GOptionEntry entries
[] = {
80 {"version", 'V', G_OPTION_FLAG_NO_ARG
, G_OPTION_ARG_CALLBACK
,
81 (gpointer
) _adg_version
, _("Display version information"), NULL
},
82 {"show-extents", 'E', 0, G_OPTION_ARG_NONE
,
83 NULL
, _("Show the boundary boxes of every entity"), NULL
},
87 entries
[1].arg_data
= show_extents
;
88 *show_extents
= FALSE
;
89 gtk_init_with_args(p_argc
, p_argv
, _("- ADG demonstration program"),
90 entries
, GETTEXT_PACKAGE
, &error
);
93 gint error_code
= error
->code
;
95 g_printerr("%s\n", error
->message
);
105 * @message: a custom error message
106 * @parent_window: the parent window or %NULL
108 * Convenient function that presents an error dialog and waits the user
109 * to close this modal dialog.
112 _adg_error(const gchar
*message
, GtkWindow
*parent_window
)
114 GtkWidget
*dialog
= gtk_message_dialog_new(parent_window
,
115 GTK_DIALOG_DESTROY_WITH_PARENT
,
119 gtk_window_set_title(GTK_WINDOW(dialog
), _("Error from adg-demo"));
120 gtk_dialog_run(GTK_DIALOG(dialog
));
121 gtk_widget_destroy(dialog
);
125 _adg_path_add_hole(AdgPath
*path
, const DemoPart
*part
)
130 model
= ADG_MODEL(path
);
131 pair
.x
= part
->LHOLE
;
134 adg_path_move_to(path
, &pair
);
135 adg_model_set_named_pair(model
, "LHOLE", &pair
);
137 pair
.y
= part
->DHOLE
/ 2;
138 pair
.x
-= pair
.y
/ SQRT3
;
139 adg_path_line_to(path
, &pair
);
142 adg_path_line_to(path
, &pair
);
143 adg_model_set_named_pair(model
, "DHOLE", &pair
);
147 _adg_path_add_rail(AdgPath
*path
, const DemoPart
*part
, gdouble to_x
)
152 model
= ADG_MODEL(path
);
154 pair
.y
= part
->D1
/ 2;
156 adg_path_line_to(path
, &pair
);
157 adg_model_set_named_pair(model
, "D1I", &pair
);
159 if (part
->GROOVE
&& to_x
> part
->ZGROOVE
) {
160 pair
.x
= part
->ZGROOVE
;
161 adg_path_line_to(path
, &pair
);
162 adg_model_set_named_pair(model
, "DGROOVEI_X", &pair
);
164 pair
.y
= part
->D3
/ 2;
165 adg_model_set_named_pair(model
, "DGROOVEY_POS", &pair
);
167 pair
.y
= part
->DGROOVE
/ 2;
168 adg_path_line_to(path
, &pair
);
169 adg_model_set_named_pair(model
, "DGROOVEI_Y", &pair
);
171 pair
.x
+= part
->LGROOVE
;
172 adg_path_line_to(path
, &pair
);
174 pair
.y
= part
->D3
/ 2;
175 adg_model_set_named_pair(model
, "DGROOVEX_POS", &pair
);
177 pair
.y
= part
->D1
/ 2;
178 adg_path_line_to(path
, &pair
);
179 adg_model_set_named_pair(model
, "DGROOVEF_X", &pair
);
183 adg_path_line_to(path
, &pair
);
184 adg_model_set_named_pair(model
, "D1F", &pair
);
189 _adg_part_define_title_block(DemoPart
*part
)
191 g_object_set(part
->title_block
,
192 "title", part
->TITLE
,
193 "author", part
->AUTHOR
,
195 "drawing", part
->DRAWING
,
196 "logo", adg_logo_new(),
197 "projection", adg_projection_new(ADG_PROJECTION_FIRST_ANGLE
),
204 _adg_part_define_hatch(DemoPart
*part
)
211 pair
.y
= (part
->D1
+ part
->DHOLE
) / 4;
213 _adg_path_add_hole(path
, part
);
214 adg_path_line_to(path
, &pair
);
215 adg_path_curve_to_explicit(path
,
216 part
->LHOLE
/ 2, part
->DHOLE
/ 2,
217 part
->LHOLE
+ 2, part
->D1
/ 2,
219 adg_path_reflect(path
, NULL
);
220 adg_path_close(path
);
222 path
= part
->hatch_contour
;
223 adg_path_move_to(path
, &pair
);
224 adg_path_curve_to_explicit(path
,
225 part
->LHOLE
/ 2, part
->DHOLE
/ 2,
226 part
->LHOLE
+ 2, part
->D1
/ 2,
228 adg_path_reflect(path
, NULL
);
232 _adg_part_define_shape(DemoPart
*part
)
237 const AdgPrimitive
*primitive
;
240 model
= ADG_MODEL(path
);
241 pair
.x
= part
->A
- part
->B
- part
->LD2
;
242 pair
.y
= part
->D3
/ 2;
243 adg_model_set_named_pair(model
, "D2_POS", &pair
);
245 _adg_path_add_hole(path
, part
);
246 _adg_path_add_rail(path
, part
, pair
.x
);
248 pair
.x
+= (part
->D1
- part
->D2
) / 2;
249 pair
.y
= part
->D2
/ 2;
250 adg_path_line_to(path
, &pair
);
251 adg_model_set_named_pair(model
, "D2I", &pair
);
253 pair
.x
= part
->A
- part
->B
;
254 adg_path_line_to(path
, &pair
);
255 adg_path_fillet(path
, 0.4);
257 pair
.x
= part
->A
- part
->B
;
258 pair
.y
= part
->D3
/ 2;
259 adg_path_line_to(path
, &pair
);
260 adg_model_set_named_pair(model
, "D3I", &pair
);
263 adg_model_set_named_pair(model
, "East", &pair
);
266 adg_model_set_named_pair(model
, "West", &pair
);
268 adg_path_chamfer(path
, CHAMFER
, CHAMFER
);
270 pair
.x
= part
->A
- part
->B
+ part
->LD3
;
271 pair
.y
= part
->D3
/ 2;
272 adg_path_line_to(path
, &pair
);
274 primitive
= adg_path_over_primitive(path
);
275 cpml_primitive_put_point(primitive
, 0, &tmp
);
276 adg_model_set_named_pair(model
, "D3I_X", &tmp
);
278 cpml_primitive_put_point(primitive
, -1, &tmp
);
279 adg_model_set_named_pair(model
, "D3I_Y", &tmp
);
281 adg_path_chamfer(path
, CHAMFER
, CHAMFER
);
283 pair
.y
= part
->D4
/ 2;
284 adg_path_line_to(path
, &pair
);
286 primitive
= adg_path_over_primitive(path
);
287 cpml_primitive_put_point(primitive
, 0, &tmp
);
288 adg_model_set_named_pair(model
, "D3F_Y", &tmp
);
289 cpml_primitive_put_point(primitive
, -1, &tmp
);
290 adg_model_set_named_pair(model
, "D3F_X", &tmp
);
292 adg_path_fillet(path
, part
->RD34
);
294 pair
.x
+= part
->RD34
;
295 adg_model_set_named_pair(model
, "D4I", &pair
);
297 pair
.x
= part
->A
- part
->C
- part
->LD5
;
298 adg_path_line_to(path
, &pair
);
299 adg_model_set_named_pair(model
, "D4F", &pair
);
301 pair
.y
= part
->D3
/ 2;
302 adg_model_set_named_pair(model
, "D4_POS", &pair
);
304 primitive
= adg_path_over_primitive(path
);
305 cpml_primitive_put_point(primitive
, 0, &tmp
);
307 adg_model_set_named_pair(model
, "RD34", &tmp
);
309 tmp
.x
-= cos(G_PI_4
) * part
->RD34
,
310 tmp
.y
-= sin(G_PI_4
) * part
->RD34
,
311 adg_model_set_named_pair(model
, "RD34_R", &tmp
);
315 adg_model_set_named_pair(model
, "RD34_XY", &tmp
);
317 pair
.x
+= (part
->D4
- part
->D5
) / 2;
318 pair
.y
= part
->D5
/ 2;
319 adg_path_line_to(path
, &pair
);
320 adg_model_set_named_pair(model
, "D5I", &pair
);
322 pair
.x
= part
->A
- part
->C
;
323 adg_path_line_to(path
, &pair
);
325 adg_path_fillet(path
, 0.2);
327 pair
.y
= part
->D6
/ 2;
328 adg_path_line_to(path
, &pair
);
330 primitive
= adg_path_over_primitive(path
);
331 cpml_primitive_put_point(primitive
, 0, &tmp
);
332 adg_model_set_named_pair(model
, "D5F", &tmp
);
334 adg_path_fillet(path
, 0.1);
337 adg_path_line_to(path
, &pair
);
338 adg_model_set_named_pair(model
, "D6F", &pair
);
340 primitive
= adg_path_over_primitive(path
);
341 cpml_primitive_put_point(primitive
, 0, &tmp
);
342 adg_model_set_named_pair(model
, "D6I_X", &tmp
);
344 primitive
= adg_path_over_primitive(path
);
345 cpml_primitive_put_point(primitive
, -1, &tmp
);
346 adg_model_set_named_pair(model
, "D6I_Y", &tmp
);
348 pair
.x
= part
->A
- part
->LD7
;
349 pair
.y
-= (part
->C
- part
->LD7
- part
->LD6
) / SQRT3
;
350 adg_path_line_to(path
, &pair
);
351 adg_model_set_named_pair(model
, "D67", &pair
);
353 pair
.y
= part
->D7
/ 2;
354 adg_path_line_to(path
, &pair
);
357 adg_path_line_to(path
, &pair
);
358 adg_model_set_named_pair(model
, "D7F", &pair
);
360 adg_path_reflect(path
, NULL
);
361 adg_path_close(path
);
365 _adg_part_lock(DemoPart
*part
)
367 gtk_widget_set_sensitive(GTK_WIDGET(part
->apply
), FALSE
);
368 gtk_widget_set_sensitive(GTK_WIDGET(part
->reset
), FALSE
);
372 _adg_part_unlock(DemoPart
*part
)
374 gtk_widget_set_sensitive(GTK_WIDGET(part
->apply
), TRUE
);
375 gtk_widget_set_sensitive(GTK_WIDGET(part
->reset
), TRUE
);
379 _adg_part_link(DemoPart
*part
, gpointer data
, GObject
*widget
)
381 const gchar
*edit_signal
;
383 g_assert(GTK_IS_WIDGET(widget
));
384 g_object_ref(widget
);
385 g_hash_table_insert(part
->widgets
, data
, widget
);
387 if (GTK_IS_SPIN_BUTTON(widget
)) {
388 GtkSpinButton
*spin_button
= GTK_SPIN_BUTTON(widget
);
389 gtk_adjustment_value_changed(gtk_spin_button_get_adjustment(spin_button
));
392 edit_signal
= GTK_IS_TOGGLE_BUTTON(widget
) ? "toggled" : "changed";
393 g_signal_connect_swapped(widget
, edit_signal
,
394 G_CALLBACK(_adg_part_unlock
), part
);
398 _adg_part_ui_to_boolean(DemoPart
*part
, gboolean
*data
)
400 GtkWidget
*widget
= g_hash_table_lookup(part
->widgets
, data
);
402 g_assert(GTK_IS_TOGGLE_BUTTON(widget
));
404 *data
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
));
408 _adg_part_ui_to_double(DemoPart
*part
, gdouble
*data
)
411 GtkSpinButton
*spin_button
;
413 widget
= g_hash_table_lookup(part
->widgets
, data
);
414 g_assert(GTK_IS_SPIN_BUTTON(widget
));
416 spin_button
= GTK_SPIN_BUTTON(widget
);
417 gtk_spin_button_update(spin_button
);
418 *data
= gtk_spin_button_get_value(spin_button
);
422 _adg_part_ui_to_string(DemoPart
*part
, gchar
**data
)
424 GtkWidget
*widget
= g_hash_table_lookup(part
->widgets
, data
);
426 g_assert(GTK_IS_ENTRY(widget
));
429 *data
= g_strdup(gtk_entry_get_text(GTK_ENTRY(widget
)));
433 _adg_part_boolean_to_ui(DemoPart
*part
, gboolean
*data
)
435 GtkWidget
*widget
= g_hash_table_lookup(part
->widgets
, data
);
437 g_assert(GTK_IS_TOGGLE_BUTTON(widget
));
439 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), *data
);
443 _adg_part_double_to_ui(DemoPart
*part
, gdouble
*data
)
445 GtkWidget
*widget
= g_hash_table_lookup(part
->widgets
, data
);
447 g_assert(GTK_IS_SPIN_BUTTON(widget
));
449 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget
), *data
);
453 _adg_part_string_to_ui(DemoPart
*part
, gchar
**data
)
455 GtkWidget
*widget
= g_hash_table_lookup(part
->widgets
, data
);
457 g_assert(GTK_IS_ENTRY(widget
));
459 gtk_entry_set_text(GTK_ENTRY(widget
), *data
);
463 _adg_demo_canvas_add_dimensions(AdgCanvas
*canvas
, AdgModel
*model
)
470 ldim
= adg_ldim_new_full_from_model(model
, "-D3I_X", "-D3F_X", "-D3F_Y",
472 adg_dim_set_outside(ADG_DIM(ldim
), ADG_THREE_STATE_OFF
);
473 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
475 ldim
= adg_ldim_new_full_from_model(model
, "-D6I_X", "-D67", "-East",
477 adg_dim_set_level(ADG_DIM(ldim
), 0);
478 adg_ldim_switch_extension1(ldim
, FALSE
);
479 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
481 ldim
= adg_ldim_new_full_from_model(model
, "-D6I_X", "-D7F", "-East",
483 adg_dim_set_limits(ADG_DIM(ldim
), "-0.06", NULL
);
484 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
486 adim
= adg_adim_new_full_from_model(model
, "-D6I_Y", "-D6F",
487 "-D6F", "-D67", "-D6F");
488 adg_dim_set_level(ADG_DIM(adim
), 2);
489 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(adim
));
491 rdim
= adg_rdim_new_full_from_model(model
, "-RD34", "-RD34_R", "-RD34_XY");
492 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(rdim
));
494 ldim
= adg_ldim_new_full_from_model(model
, "-DGROOVEI_X", "-DGROOVEF_X",
495 "-DGROOVEX_POS", ADG_DIR_UP
);
496 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
498 ldim
= adg_ldim_new_full_from_model(model
, "D2I", "-D2I", "-D2_POS",
500 adg_dim_set_limits(ADG_DIM(ldim
), "-0.1", NULL
);
501 adg_dim_set_outside(ADG_DIM(ldim
), ADG_THREE_STATE_OFF
);
502 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
503 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
505 ldim
= adg_ldim_new_full_from_model(model
, "DGROOVEI_Y", "-DGROOVEI_Y",
506 "-DGROOVEY_POS", ADG_DIR_LEFT
);
507 adg_dim_set_limits(ADG_DIM(ldim
), "-0.1", NULL
);
508 adg_dim_set_outside(ADG_DIM(ldim
), ADG_THREE_STATE_OFF
);
509 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
510 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
513 adim
= adg_adim_new_full_from_model(model
, "D1F", "D1I", "D2I", "D1F", "D1F");
514 adg_dim_set_level(ADG_DIM(adim
), 2);
515 adg_adim_switch_extension2(adim
, FALSE
);
516 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(adim
));
518 ldim
= adg_ldim_new_full_from_model(model
, "D1I", "LHOLE", "West",
520 adg_ldim_switch_extension1(ldim
, FALSE
);
521 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
523 ldim
= adg_ldim_new_full_from_model(model
, "D1I", "DGROOVEI_X", "West",
525 adg_ldim_switch_extension1(ldim
, FALSE
);
526 adg_dim_set_level(ADG_DIM(ldim
), 2);
527 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
529 ldim
= adg_ldim_new_full_from_model(model
, "D4F", "D6I_X", "D4_POS",
531 adg_dim_set_limits(ADG_DIM(ldim
), NULL
, "+0.2");
532 adg_dim_set_outside(ADG_DIM(ldim
), ADG_THREE_STATE_OFF
);
533 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
535 ldim
= adg_ldim_new_full_from_model(model
, "D1F", "D3I_X", "D2_POS",
537 adg_dim_set_level(ADG_DIM(ldim
), 2);
538 adg_ldim_switch_extension2(ldim
, FALSE
);
539 adg_dim_set_outside(ADG_DIM(ldim
), ADG_THREE_STATE_OFF
);
540 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
542 ldim
= adg_ldim_new_full_from_model(model
, "D3I_X", "D7F", "East",
544 adg_dim_set_limits(ADG_DIM(ldim
), NULL
, "+0.1");
545 adg_dim_set_level(ADG_DIM(ldim
), 2);
546 adg_dim_set_outside(ADG_DIM(ldim
), ADG_THREE_STATE_OFF
);
547 adg_ldim_switch_extension2(ldim
, FALSE
);
548 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
550 ldim
= adg_ldim_new_full_from_model(model
, "D1I", "D7F", "D3F_Y",
552 adg_dim_set_limits(ADG_DIM(ldim
), "-0.05", "+0.05");
553 adg_dim_set_level(ADG_DIM(ldim
), 3);
554 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
556 adim
= adg_adim_new_full_from_model(model
, "D4F", "D4I",
557 "D5I", "D4F", "D4F");
558 adg_dim_set_level(ADG_DIM(adim
), 1.5);
559 adg_adim_switch_extension2(adim
, FALSE
);
560 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(adim
));
563 ldim
= adg_ldim_new_full_from_model(model
, "D6F", "-D6F", "East",
565 adg_dim_set_limits(ADG_DIM(ldim
), "-0.1", NULL
);
566 adg_dim_set_level(ADG_DIM(ldim
), 4);
567 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
568 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
570 ldim
= adg_ldim_new_full_from_model(model
, "D4F", "-D4F", "East",
572 adg_dim_set_level(ADG_DIM(ldim
), 3);
573 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
574 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
576 ldim
= adg_ldim_new_full_from_model(model
, "D5F", "-D5F", "East",
578 adg_dim_set_limits(ADG_DIM(ldim
), "-0.1", NULL
);
579 adg_dim_set_level(ADG_DIM(ldim
), 2);
580 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
581 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
583 ldim
= adg_ldim_new_full_from_model(model
, "D7F", "-D7F", "East",
585 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
586 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
589 ldim
= adg_ldim_new_full_from_model(model
, "DHOLE", "-DHOLE", "-West",
591 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
592 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
594 ldim
= adg_ldim_new_full_from_model(model
, "D1I", "-D1I", "-West",
596 adg_dim_set_limits(ADG_DIM(ldim
), "-0.05", "+0.05");
597 adg_dim_set_level(ADG_DIM(ldim
), 2);
598 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
599 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
601 ldim
= adg_ldim_new_full_from_model(model
, "D3I_Y", "-D3I_Y", "-West",
603 adg_dim_set_limits(ADG_DIM(ldim
), "-0.25", NULL
);
604 adg_dim_set_level(ADG_DIM(ldim
), 3);
605 adg_dim_set_value(ADG_DIM(ldim
), ADG_UTF8_DIAMETER
"<>");
606 adg_container_add(ADG_CONTAINER(canvas
), ADG_ENTITY(ldim
));
610 _adg_canvas_init(AdgCanvas
*canvas
, DemoPart
*part
)
612 AdgContainer
*container
;
616 container
= (AdgContainer
*) canvas
;
618 adg_canvas_set_paper(canvas
, GTK_PAPER_NAME_A4
,
619 GTK_PAGE_ORIENTATION_LANDSCAPE
);
620 adg_canvas_set_title_block(canvas
, part
->title_block
);
622 entity
= ADG_ENTITY(adg_stroke_new(ADG_TRAIL(part
->shape
)));
623 adg_container_add(container
, entity
);
625 entity
= ADG_ENTITY(adg_hatch_new(ADG_TRAIL(part
->hatch
)));
626 adg_container_add(container
, entity
);
628 entity
= ADG_ENTITY(adg_stroke_new(ADG_TRAIL(part
->hatch_contour
)));
629 adg_container_add(container
, entity
);
631 entity
= ADG_ENTITY(adg_stroke_new(ADG_TRAIL(part
->edges
)));
632 adg_container_add(container
, entity
);
634 _adg_demo_canvas_add_dimensions(canvas
, ADG_MODEL(part
->shape
));
636 cairo_matrix_init_translate(&map
, 140, 180);
637 cairo_matrix_scale(&map
, 8, 8);
638 adg_entity_set_local_map(ADG_ENTITY(container
), &map
);
643 static GtkRadioButton
*
644 _adg_group_get_active(GtkRadioButton
*radio_group
)
646 GSList
*list
= gtk_radio_button_get_group(radio_group
);
649 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list
->data
)))
659 _adg_do_edit(DemoPart
*part
)
661 _adg_part_ui_to_double(part
, &part
->A
);
662 _adg_part_ui_to_double(part
, &part
->B
);
663 _adg_part_ui_to_double(part
, &part
->C
);
664 _adg_part_ui_to_double(part
, &part
->DHOLE
);
665 _adg_part_ui_to_double(part
, &part
->LHOLE
);
666 _adg_part_ui_to_double(part
, &part
->D1
);
667 _adg_part_ui_to_double(part
, &part
->D2
);
668 _adg_part_ui_to_double(part
, &part
->LD2
);
669 _adg_part_ui_to_double(part
, &part
->D3
);
670 _adg_part_ui_to_double(part
, &part
->LD3
);
671 _adg_part_ui_to_double(part
, &part
->D4
);
672 //_adg_part_ui_to_double(part, &part->D5);
673 _adg_part_ui_to_double(part
, &part
->D6
);
674 //_adg_part_ui_to_double(part, &part->LD6);
675 _adg_part_ui_to_double(part
, &part
->D7
);
676 //_adg_part_ui_to_double(part, &part->LD7);
678 _adg_part_ui_to_boolean(part
, &part
->GROOVE
);
679 _adg_part_ui_to_double(part
, &part
->ZGROOVE
);
680 _adg_part_ui_to_double(part
, &part
->DGROOVE
);
681 _adg_part_ui_to_double(part
, &part
->LGROOVE
);
683 _adg_part_ui_to_string(part
, &part
->TITLE
);
684 _adg_part_ui_to_string(part
, &part
->DRAWING
);
685 _adg_part_ui_to_string(part
, &part
->AUTHOR
);
686 _adg_part_ui_to_string(part
, &part
->DATE
);
688 _adg_part_lock(part
);
690 adg_model_reset(ADG_MODEL(part
->shape
));
691 adg_model_reset(ADG_MODEL(part
->hatch
));
692 adg_model_reset(ADG_MODEL(part
->hatch_contour
));
693 adg_model_reset(ADG_MODEL(part
->edges
));
695 _adg_part_define_title_block(part
);
696 _adg_part_define_shape(part
);
697 _adg_part_define_hatch(part
);
699 adg_model_changed(ADG_MODEL(part
->shape
));
700 adg_model_changed(ADG_MODEL(part
->hatch
));
701 adg_model_changed(ADG_MODEL(part
->hatch_contour
));
702 adg_model_changed(ADG_MODEL(part
->edges
));
704 gtk_widget_queue_draw(GTK_WIDGET(part
->area
));
708 _adg_do_reset(DemoPart
*part
)
710 _adg_part_double_to_ui(part
, &part
->A
);
711 _adg_part_double_to_ui(part
, &part
->B
);
712 _adg_part_double_to_ui(part
, &part
->C
);
713 _adg_part_double_to_ui(part
, &part
->DHOLE
);
714 _adg_part_double_to_ui(part
, &part
->LHOLE
);
715 _adg_part_double_to_ui(part
, &part
->D1
);
716 _adg_part_double_to_ui(part
, &part
->D2
);
717 _adg_part_double_to_ui(part
, &part
->LD2
);
718 _adg_part_double_to_ui(part
, &part
->D3
);
719 _adg_part_double_to_ui(part
, &part
->LD3
);
720 _adg_part_double_to_ui(part
, &part
->D4
);
721 //_adg_part_double_to_ui(part, &part->D5);
722 _adg_part_double_to_ui(part
, &part
->D6
);
723 //_adg_part_double_to_ui(part, &part->LD6);
724 _adg_part_double_to_ui(part
, &part
->D7
);
725 //_adg_part_double_to_ui(part, &part->LD7);
727 _adg_part_boolean_to_ui(part
, &part
->GROOVE
);
728 _adg_part_double_to_ui(part
, &part
->ZGROOVE
);
729 _adg_part_double_to_ui(part
, &part
->DGROOVE
);
730 _adg_part_double_to_ui(part
, &part
->LGROOVE
);
732 _adg_part_string_to_ui(part
, &part
->TITLE
);
733 _adg_part_string_to_ui(part
, &part
->DRAWING
);
734 _adg_part_string_to_ui(part
, &part
->AUTHOR
);
735 _adg_part_string_to_ui(part
, &part
->DATE
);
737 _adg_part_lock(part
);
741 _adg_do_save_as(GtkWindow
*window
, GtkResponseType response
, AdgCanvas
*canvas
)
743 GtkRadioButton
*type_radio
;
744 gchar
*file
, *suffix
;
745 cairo_surface_t
*surface
;
747 if (response
!= GTK_RESPONSE_OK
) {
748 gtk_widget_hide(GTK_WIDGET(window
));
752 file
= gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(window
));
756 type_radio
= _adg_group_get_active(g_object_get_data(G_OBJECT(window
),
758 g_assert(GTK_IS_RADIO_BUTTON(type_radio
));
759 suffix
= gtk_widget_get_tooltip_markup(GTK_WIDGET(type_radio
));
760 g_assert(suffix
!= NULL
);
762 if (!g_str_has_suffix(file
, suffix
)) {
764 file
= g_strconcat(file
, suffix
, NULL
);
768 #ifdef CAIRO_HAS_PNG_FUNCTIONS
769 if (strcmp(suffix
, ".png") == 0) {
770 surface
= cairo_image_surface_create(CAIRO_FORMAT_RGB24
, 800, 600);
773 #ifdef CAIRO_HAS_SVG_SURFACE
774 if (strcmp(suffix
, ".svg") == 0) {
775 #include <cairo-svg.h>
776 surface
= cairo_svg_surface_create(file
, 841, 595);
779 #ifdef CAIRO_HAS_PDF_SURFACE
780 if (strcmp(suffix
, ".pdf") == 0) {
781 #include <cairo-pdf.h>
782 surface
= cairo_pdf_surface_create(file
, 841, 595);
785 #ifdef CAIRO_HAS_PS_SURFACE
786 if (strcmp(suffix
, ".ps") == 0) {
787 #include <cairo-ps.h>
788 surface
= cairo_ps_surface_create(file
, 841, 595);
789 cairo_ps_surface_dsc_comment(surface
, "%%Title: " PACKAGE_STRING
);
790 cairo_ps_surface_dsc_comment(surface
, "%%Copyright: Copyleft (C) 2006-2010 Fontana Nicola");
791 cairo_ps_surface_dsc_comment(surface
, "%%Orientation: Landscape");
792 cairo_ps_surface_dsc_begin_setup(surface
);
793 cairo_ps_surface_dsc_begin_page_setup(surface
);
794 cairo_ps_surface_dsc_comment(surface
, "%%IncludeFeature: *PageSize A4");
798 _adg_error(_("Requested format not supported"), window
);
804 cairo_status_t status
;
806 cr
= cairo_create(surface
);
807 cairo_surface_destroy(surface
);
808 adg_entity_render(ADG_ENTITY(canvas
), cr
);
810 if (cairo_surface_get_type(surface
) == CAIRO_SURFACE_TYPE_IMAGE
) {
811 status
= cairo_surface_write_to_png(surface
, file
);
814 status
= cairo_status(cr
);
819 if (status
!= CAIRO_STATUS_SUCCESS
)
820 _adg_error(cairo_status_to_string(status
), window
);
825 gtk_widget_hide(GTK_WIDGET(window
));
829 _adg_print_prepare(GtkPrintOperation
*operation
, GtkPrintContext
*context
)
831 gtk_print_operation_set_n_pages(operation
, 1);
835 _adg_print_page(GtkPrintOperation
*operation
, GtkPrintContext
*context
,
836 gint page_nr
, AdgEntity
*canvas
)
838 cairo_t
*cr
= gtk_print_context_get_cairo_context(context
);
841 adg_matrix_copy(&old_map
, adg_entity_get_global_map(canvas
));;
843 adg_entity_set_global_map(canvas
, adg_matrix_identity());
844 adg_entity_render(canvas
, cr
);
846 adg_entity_set_global_map(canvas
, &old_map
);
850 _adg_do_print(GtkWidget
*button
, AdgCanvas
*canvas
)
852 static GtkPrintSettings
*settings
= NULL
;
854 GtkPrintOperation
*operation
;
855 GtkPageSetup
*page_setup
;
858 window
= (GtkWindow
*) gtk_widget_get_toplevel(button
);
859 operation
= gtk_print_operation_new();
860 page_setup
= g_object_get_data(G_OBJECT(canvas
), "_adg_page_setup");
864 gtk_print_operation_set_print_settings(operation
, settings
);
866 gtk_print_operation_set_default_page_setup(operation
, page_setup
);
868 g_signal_connect(operation
, "begin-print",
869 G_CALLBACK(_adg_print_prepare
), NULL
);
870 g_signal_connect(operation
, "draw-page",
871 G_CALLBACK(_adg_print_page
), canvas
);
873 gtk_print_operation_set_use_full_page(operation
, FALSE
);
874 gtk_print_operation_set_unit(operation
, GTK_UNIT_POINTS
);
875 #if GTK_CHECK_VERSION(2, 18, 0)
876 gtk_print_operation_set_embed_page_setup(operation
, TRUE
);
879 switch (gtk_print_operation_run(operation
,
880 GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG
,
883 case GTK_PRINT_OPERATION_RESULT_APPLY
:
885 g_object_unref(settings
);
886 settings
= gtk_print_operation_get_print_settings(operation
);
888 g_object_ref(settings
);
895 g_object_unref(operation
);
898 _adg_error(error
->message
, window
);
902 _adg_part_new(GtkBuilder
*builder
)
905 GObject
*object
, *toggle_object
;
907 part
= g_new0(DemoPart
, 1);
908 part
->widgets
= g_hash_table_new_full(g_direct_hash
, g_direct_equal
,
909 NULL
, g_object_unref
);
910 part
->area
= (AdgGtkArea
*) gtk_builder_get_object(builder
, "mainCanvas");
911 part
->apply
= (GtkButton
*) gtk_builder_get_object(builder
, "btnApply");
912 part
->reset
= (GtkButton
*) gtk_builder_get_object(builder
, "btnReset");
913 part
->shape
= adg_path_new();
914 part
->hatch
= adg_path_new();
915 part
->hatch_contour
= adg_path_new();
916 part
->title_block
= adg_title_block_new();
917 part
->edges
= adg_edges_new_with_source(ADG_TRAIL(part
->shape
));
919 g_assert(ADG_GTK_IS_AREA(part
->area
));
920 g_assert(GTK_IS_BUTTON(part
->apply
));
921 g_assert(GTK_IS_BUTTON(part
->reset
));
923 _adg_part_link(part
, &part
->A
, gtk_builder_get_object(builder
, "editA"));
924 _adg_part_link(part
, &part
->B
, gtk_builder_get_object(builder
, "editB"));
925 _adg_part_link(part
, &part
->C
, gtk_builder_get_object(builder
, "editC"));
926 _adg_part_link(part
, &part
->D1
, gtk_builder_get_object(builder
, "editD1"));
927 _adg_part_link(part
, &part
->D2
, gtk_builder_get_object(builder
, "editD2"));
928 _adg_part_link(part
, &part
->LD2
, gtk_builder_get_object(builder
, "editLD2"));
929 _adg_part_link(part
, &part
->D3
, gtk_builder_get_object(builder
, "editD3"));
930 _adg_part_link(part
, &part
->LD3
, gtk_builder_get_object(builder
, "editLD3"));
931 _adg_part_link(part
, &part
->D4
, gtk_builder_get_object(builder
, "editD4"));
932 //_adg_part_link(part, &part->D5, gtk_builder_get_object(builder, "editD5"));
933 _adg_part_link(part
, &part
->D6
, gtk_builder_get_object(builder
, "editD6"));
934 //_adg_part_link(part, &part->LD6, gtk_builder_get_object(builder, "editLD6"));
935 _adg_part_link(part
, &part
->D7
, gtk_builder_get_object(builder
, "editD7"));
936 //_adg_part_link(part, &part->LD7, gtk_builder_get_object(builder, "editLD7"));
937 _adg_part_link(part
, &part
->DHOLE
, gtk_builder_get_object(builder
, "editDHOLE"));
938 _adg_part_link(part
, &part
->LHOLE
, gtk_builder_get_object(builder
, "editLHOLE"));
940 toggle_object
= gtk_builder_get_object(builder
, "GROOVE");
941 _adg_part_link(part
, &part
->GROOVE
, toggle_object
);
943 object
= gtk_builder_get_object(builder
, "editZGROOVE");
944 _adg_part_link(part
, &part
->ZGROOVE
, object
);
945 g_signal_connect(toggle_object
, "toggled",
946 G_CALLBACK(adg_gtk_toggle_button_sensitivize
), object
);
947 object
= gtk_builder_get_object(builder
, "editZGROOVELabel");
948 g_signal_connect(toggle_object
, "toggled",
949 G_CALLBACK(adg_gtk_toggle_button_sensitivize
), object
);
951 object
= gtk_builder_get_object(builder
, "editDGROOVE");
952 _adg_part_link(part
, &part
->DGROOVE
, object
);
953 g_signal_connect(toggle_object
, "toggled",
954 G_CALLBACK(adg_gtk_toggle_button_sensitivize
), object
);
955 object
= gtk_builder_get_object(builder
, "editDGROOVELabel");
956 g_signal_connect(toggle_object
, "toggled",
957 G_CALLBACK(adg_gtk_toggle_button_sensitivize
), object
);
959 object
= gtk_builder_get_object(builder
, "editLGROOVE");
960 _adg_part_link(part
, &part
->LGROOVE
, object
);
961 g_signal_connect(toggle_object
, "toggled",
962 G_CALLBACK(adg_gtk_toggle_button_sensitivize
), object
);
963 object
= gtk_builder_get_object(builder
, "editLGROOVELabel");
964 g_signal_connect(toggle_object
, "toggled",
965 G_CALLBACK(adg_gtk_toggle_button_sensitivize
), object
);
967 _adg_part_link(part
, &part
->TITLE
, gtk_builder_get_object(builder
, "txtTitle"));
968 _adg_part_link(part
, &part
->DRAWING
, gtk_builder_get_object(builder
, "txtDrawing"));
969 _adg_part_link(part
, &part
->AUTHOR
, gtk_builder_get_object(builder
, "txtAuthor"));
970 _adg_part_link(part
, &part
->DATE
, gtk_builder_get_object(builder
, "txtDate"));
984 _adg_part_destroy(DemoPart
*part
)
986 g_hash_table_destroy(part
->widgets
);
991 _adg_about_window(GtkBuilder
*builder
)
995 window
= (GtkWidget
*) gtk_builder_get_object(builder
, "wndAbout");
996 g_assert(GTK_IS_ABOUT_DIALOG(window
));
998 g_signal_connect(window
, "response", G_CALLBACK(gtk_widget_hide
), NULL
);
1004 _adg_edit_window(GtkBuilder
*builder
, DemoPart
*part
)
1008 window
= (GtkWidget
*) gtk_builder_get_object(builder
, "wndEdit");
1009 g_assert(GTK_IS_DIALOG(window
));
1011 gtk_window_set_position(GTK_WINDOW(window
), GTK_WIN_POS_MOUSE
);
1013 g_signal_connect_swapped(part
->apply
, "clicked",
1014 G_CALLBACK(_adg_do_edit
), part
);
1015 g_signal_connect_swapped(part
->reset
, "clicked",
1016 G_CALLBACK(_adg_do_reset
), part
);
1017 g_signal_connect(window
, "response",
1018 G_CALLBACK(adg_gtk_window_hide_here
), NULL
);
1024 _adg_save_as_window(GtkBuilder
*builder
, AdgCanvas
*canvas
)
1027 GtkWidget
*type_group
;
1029 window
= (GtkWidget
*) gtk_builder_get_object(builder
, "wndSaveAs");
1030 g_assert(GTK_IS_WINDOW(window
));
1031 type_group
= (GtkWidget
*) gtk_builder_get_object(builder
, "saveAsPng");
1032 g_assert(GTK_IS_RADIO_BUTTON(type_group
));
1034 g_object_set_data(G_OBJECT(window
), "type-group", type_group
);
1036 /* Set the default destination file */
1037 if (GTK_IS_FILE_CHOOSER(window
)) {
1038 GtkFileChooser
*file_chooser
;
1041 file_chooser
= (GtkFileChooser
*) window
;
1043 #if GLIB_CHECK_VERSION(2, 14, 0)
1044 dir
= g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS
);
1050 dir
= g_get_home_dir();
1052 gtk_file_chooser_set_current_folder(file_chooser
, dir
);
1053 gtk_file_chooser_set_current_name(file_chooser
, "adg-demo");
1056 g_signal_connect(window
, "response", G_CALLBACK(_adg_do_save_as
), canvas
);
1062 _adg_main_window(GtkBuilder
*builder
)
1067 GtkWidget
*button_edit
, *button_save_as
, *button_print
;
1068 GtkWidget
*button_about
, *button_quit
;
1070 window
= (GtkWidget
*) gtk_builder_get_object(builder
, "wndMain");
1071 part
= _adg_part_new(builder
);
1072 canvas
= adg_canvas_new();
1074 _adg_canvas_init(canvas
, part
);
1075 adg_gtk_area_set_canvas(part
->area
, canvas
);
1077 g_assert(GTK_IS_WINDOW(window
));
1078 button_edit
= (GtkWidget
*) gtk_builder_get_object(builder
, "mainEdit");
1079 g_assert(GTK_IS_BUTTON(button_edit
));
1080 button_save_as
= (GtkWidget
*) gtk_builder_get_object(builder
, "mainSaveAs");
1081 g_assert(GTK_IS_BUTTON(button_save_as
));
1082 button_print
= (GtkWidget
*) gtk_builder_get_object(builder
, "mainPrint");
1083 g_assert(GTK_IS_BUTTON(button_print
));
1084 button_about
= (GtkWidget
*) gtk_builder_get_object(builder
, "mainAbout");
1085 g_assert(GTK_IS_BUTTON(button_about
));
1086 button_quit
= (GtkWidget
*) gtk_builder_get_object(builder
, "mainQuit");
1087 g_assert(GTK_IS_BUTTON(button_quit
));
1089 g_signal_connect_swapped(button_about
, "clicked",
1090 G_CALLBACK(gtk_dialog_run
),
1091 _adg_about_window(builder
));
1092 g_signal_connect_swapped(button_edit
, "clicked",
1093 G_CALLBACK(gtk_dialog_run
),
1094 _adg_edit_window(builder
, part
));
1095 g_signal_connect_swapped(button_save_as
, "clicked",
1096 G_CALLBACK(gtk_dialog_run
),
1097 _adg_save_as_window(builder
, canvas
));
1098 g_signal_connect(button_print
, "clicked",
1099 G_CALLBACK(_adg_do_print
), canvas
);
1100 g_signal_connect(button_quit
, "clicked", G_CALLBACK(gtk_main_quit
), NULL
);
1101 g_signal_connect(window
, "delete-event", G_CALLBACK(gtk_main_quit
), NULL
);
1102 g_signal_connect_swapped(window
, "destroy",
1103 G_CALLBACK(_adg_part_destroy
), part
);
1110 main(gint argc
, gchar
**argv
)
1112 gboolean show_extents
;
1114 GtkBuilder
*builder
;
1116 GtkWidget
*main_window
;
1118 _adg_parse_args(&argc
, &argv
, &show_extents
);
1119 adg_switch_extents(show_extents
);
1121 path
= demo_find_data_file("adg-demo.ui", argv
[0]);
1123 g_print(_("adg-demo.ui not found!\n"));
1127 builder
= gtk_builder_new();
1130 gtk_builder_set_translation_domain(builder
, GETTEXT_PACKAGE
);
1131 gtk_builder_add_from_file(builder
, path
, &error
);
1133 if (error
!= NULL
) {
1134 g_critical("%s", error
->message
);
1135 g_error_free(error
);
1139 main_window
= _adg_main_window(builder
);
1140 g_object_unref(builder
);
1142 gtk_widget_show_all(main_window
);