[demo] Improved adg-demo user experience
[adg.git] / demo / adg-demo.c
blob4d990be64b412ca2dae5d8ae60058b78f7b705ec
1 #include <adg-gtk.h>
2 #include <math.h>
4 #include "demo.h"
7 #define SQRT3 1.732050808
8 #define CHAMFER 0.3
11 typedef struct _AdgPart AdgPart;
13 struct _AdgPart {
14 gdouble A, B, C;
15 gdouble DHOLE, LHOLE;
16 gdouble D1, D2, D3, D4, D5, D6, D7;
17 gdouble RD34, RD56;
18 gdouble LD2, LD3, LD5, LD6, LD7;
22 static void
23 _adg_version(void)
25 g_print("adg-demo " PACKAGE_VERSION "\n");
26 exit(0);
29 static void
30 _adg_parse_args(gint *p_argc, gchar **p_argv[], gboolean *show_extents)
32 GError *error = NULL;
33 GOptionEntry entries[] = {
34 {"version", 'V', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
35 _adg_version, "Display version information", NULL},
36 {"show-extents", 'E', 0, G_OPTION_ARG_NONE,
37 NULL, "Show the boundary boxes of every entity", NULL},
38 {NULL}
41 entries[1].arg_data = show_extents;
42 *show_extents = FALSE;
43 gtk_init_with_args(p_argc, p_argv, "- ADG demonstration program",
44 entries, GETTEXT_PACKAGE, &error);
46 if (error != NULL) {
47 gint error_code = error->code;
49 g_printerr("%s\n", error->message);
51 g_error_free(error);
52 exit(error_code);
56 static void
57 _adg_part_init(AdgPart *part)
59 part->A = 52.3;
60 part->B = 20.6;
61 part->C = 2;
62 part->DHOLE = 2;
63 part->LHOLE = 3;
64 part->D1 = 9.3;
65 part->D2 = 6.5;
66 part->D3 = 11.9;
67 part->D4 = 6.5;
68 part->D5 = 4.5;
69 part->D6 = 7.2;
70 part->D7 = 3;
71 part->RD34 = 1;
72 part->LD2 = 7;
73 part->LD3 = 3.5;
74 part->LD5 = 5;
75 part->LD6 = 1;
76 part->LD7 = 0.5;
79 static AdgPath *
80 _adg_part_hole(const AdgPart *part, gdouble height)
82 AdgPath *path;
83 AdgModel *model;
84 AdgPair pair;
86 path = adg_path_new();
87 model = ADG_MODEL(path);
89 pair.x = part->LHOLE;
90 pair.y = 0;
91 adg_path_move_to(path, &pair);
92 adg_model_set_named_pair(model, "LHOLE", &pair);
94 pair.y = part->DHOLE / 2;
95 pair.x -= pair.y / SQRT3;
96 adg_path_line_to(path, &pair);
98 pair.x = 0;
99 adg_path_line_to(path, &pair);
100 adg_model_set_named_pair(model, "DHOLE", &pair);
102 pair.y = part->D1 / 2;
103 adg_path_line_to(path, &pair);
104 adg_model_set_named_pair(model, "D1I", &pair);
106 pair.x = height;
107 adg_path_line_to(path, &pair);
108 adg_model_set_named_pair(model, "D1F", &pair);
110 return path;
113 static AdgPath *
114 _adg_part_shape(const AdgPart *part)
116 AdgPath *path;
117 AdgModel *model;
118 AdgPair pair, tmp;
119 const AdgPrimitive *primitive;
121 pair.x = part->A - part->B - part->LD2;
122 path = _adg_part_hole(part, pair.x);
123 model = ADG_MODEL(path);
125 pair.x += (part->D1 - part->D2) / 2;
126 pair.y = part->D2 / 2;
127 adg_path_line_to(path, &pair);
128 adg_model_set_named_pair(model, "D2I", &pair);
130 pair.x = part->A - part->B;
131 adg_path_line_to(path, &pair);
132 adg_path_fillet(path, 0.4);
134 pair.x = part->A - part->B;
135 pair.y = part->D3 / 2;
136 adg_path_line_to(path, &pair);
137 adg_model_set_named_pair(model, "D3I", &pair);
139 pair.x = part->A;
140 adg_model_set_named_pair(model, "East", &pair);
142 pair.x = 0;
143 adg_model_set_named_pair(model, "West", &pair);
145 adg_path_chamfer(path, CHAMFER, CHAMFER);
147 pair.x = part->A - part->B + part->LD3;
148 pair.y = part->D3 / 2;
149 adg_path_line_to(path, &pair);
151 primitive = adg_path_over_primitive(path);
152 cpml_pair_from_cairo(&tmp, cpml_primitive_get_point(primitive, 0));
153 adg_model_set_named_pair(model, "D3I_X", &tmp);
155 cpml_pair_from_cairo(&tmp, cpml_primitive_get_point(primitive, -1));
156 adg_model_set_named_pair(model, "D3I_Y", &tmp);
158 adg_path_chamfer(path, CHAMFER, CHAMFER);
160 pair.y = part->D4 / 2;
161 adg_path_line_to(path, &pair);
163 primitive = adg_path_over_primitive(path);
164 cpml_pair_from_cairo(&tmp, cpml_primitive_get_point(primitive, 0));
165 adg_model_set_named_pair(model, "D3F_Y", &tmp);
166 cpml_pair_from_cairo(&tmp, cpml_primitive_get_point(primitive, -1));
167 adg_model_set_named_pair(model, "D3F_X", &tmp);
169 adg_path_fillet(path, part->RD34);
171 pair.x += part->RD34;
172 adg_model_set_named_pair(model, "D4I", &pair);
174 pair.x = part->A - part->C - part->LD5;
175 adg_path_line_to(path, &pair);
176 adg_model_set_named_pair(model, "D4F", &pair);
178 pair.y = part->D3 / 2;
179 adg_model_set_named_pair(model, "D4_POS", &pair);
181 primitive = adg_path_over_primitive(path);
182 cpml_pair_from_cairo(&tmp, cpml_primitive_get_point(primitive, 0));
183 tmp.x += part->RD34;
184 adg_model_set_named_pair(model, "RD34", &tmp);
186 tmp.x -= cos(G_PI_4) * part->RD34,
187 tmp.y -= sin(G_PI_4) * part->RD34,
188 adg_model_set_named_pair(model, "RD34_R", &tmp);
190 tmp.x += part->RD34,
191 tmp.y += part->RD34,
192 adg_model_set_named_pair(model, "RD34_XY", &tmp);
194 pair.x += (part->D4 - part->D5) / 2;
195 pair.y = part->D5 / 2;
196 adg_path_line_to(path, &pair);
197 adg_model_set_named_pair(model, "D5I", &pair);
199 pair.x = part->A - part->C;
200 adg_path_line_to(path, &pair);
202 adg_path_fillet(path, 0.2);
204 pair.y = part->D6 / 2;
205 adg_path_line_to(path, &pair);
207 primitive = adg_path_over_primitive(path);
208 cpml_pair_from_cairo(&tmp, cpml_primitive_get_point(primitive, 0));
209 adg_model_set_named_pair(model, "D5F", &tmp);
211 adg_path_fillet(path, 0.1);
213 pair.x += part->LD6;
214 adg_path_line_to(path, &pair);
215 adg_model_set_named_pair(model, "D6F", &pair);
217 primitive = adg_path_over_primitive(path);
218 cpml_pair_from_cairo(&tmp, cpml_primitive_get_point(primitive, 0));
219 adg_model_set_named_pair(model, "D6I_X", &tmp);
221 primitive = adg_path_over_primitive(path);
222 cpml_pair_from_cairo(&tmp, cpml_primitive_get_point(primitive, -1));
223 adg_model_set_named_pair(model, "D6I_Y", &tmp);
225 pair.x = part->A - part->LD7;
226 pair.y -= (part->C - part->LD7 - part->LD6) / SQRT3;
227 adg_path_line_to(path, &pair);
228 adg_model_set_named_pair(model, "D67", &pair);
230 pair.y = part->D7 / 2;
231 adg_path_line_to(path, &pair);
233 pair.x = part->A;
234 adg_path_line_to(path, &pair);
235 adg_model_set_named_pair(model, "D7F", &pair);
237 return path;
240 static void
241 _adg_demo_canvas_add_sheet(AdgCanvas *canvas)
243 AdgTitleBlock *title_block;
244 AdgLogo *logo;
245 AdgMatrix map;
247 title_block = adg_title_block_new();
249 logo = adg_logo_new();
250 cairo_matrix_init_scale(&map, 2, 2);
251 adg_entity_set_global_map(ADG_ENTITY(logo), &map);
253 g_object_set(title_block,
254 "title", "SAMPLE DRAWING",
255 "author", "NtD",
256 "date", "",
257 "drawing", "TEST123",
258 "logo", logo,
259 "projection", adg_projection_new(ADG_PROJECTION_FIRST_ANGLE),
260 "scale", "NONE",
261 "size", "A4",
262 NULL);
264 cairo_matrix_init_translate(&map, 300, 150);
265 adg_entity_set_global_map(ADG_ENTITY(title_block), &map);
267 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(title_block));
270 static void
271 _adg_demo_canvas_add_dimensions(AdgCanvas *canvas, AdgModel *model)
273 AdgLDim *ldim;
274 AdgADim *adim;
275 AdgRDim *rdim;
277 /* NORTH */
278 adim = adg_adim_new_full_from_model(model, "-D1I", "-D1F",
279 "-D1F", "-D2I", "-D1F");
280 adg_dim_set_level(ADG_DIM(adim), 2);
281 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(adim));
283 ldim = adg_ldim_new_full_from_model(model, "-D1F", "-D3I_X", "-D3F_Y",
284 ADG_DIR_UP);
285 adg_dim_set_outside(ADG_DIM(ldim), ADG_THREE_STATE_OFF);
286 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
288 ldim = adg_ldim_new_full_from_model(model, "-D3I_X", "-D3F_X", "-D3F_Y",
289 ADG_DIR_UP);
290 adg_ldim_switch_extension1(ldim, FALSE);
291 adg_dim_set_outside(ADG_DIM(ldim), ADG_THREE_STATE_OFF);
292 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
294 ldim = adg_ldim_new_full_from_model(model, "-D6I_X", "-D67", "-East",
295 ADG_DIR_UP);
296 adg_dim_set_level(ADG_DIM(ldim), 0);
297 adg_ldim_switch_extension1(ldim, FALSE);
298 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
300 ldim = adg_ldim_new_full_from_model(model, "-D6I_X", "-D7F", "-East",
301 ADG_DIR_UP);
302 adg_dim_set_limits(ADG_DIM(ldim), "-0.06", NULL);
303 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
305 adim = adg_adim_new_full_from_model(model, "-D6I_Y", "-D6F",
306 "-D6F", "-D67", "-D6F");
307 adg_dim_set_level(ADG_DIM(adim), 2);
308 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(adim));
310 rdim = adg_rdim_new_full_from_model(model, "-RD34", "-RD34_R", "-RD34_XY");
311 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(rdim));
314 /* SOUTH */
315 ldim = adg_ldim_new_full_from_model(model, "D1I", "LHOLE", "D3F_Y",
316 ADG_DIR_DOWN);
317 adg_ldim_switch_extension1(ldim, FALSE);
318 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
320 ldim = adg_ldim_new_full_from_model(model, "D4F", "D6I_X", "D4_POS",
321 ADG_DIR_DOWN);
322 adg_dim_set_limits(ADG_DIM(ldim), NULL, "+0.2");
323 adg_dim_set_outside(ADG_DIM(ldim), ADG_THREE_STATE_OFF);
324 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
326 ldim = adg_ldim_new_full_from_model(model, "D3I_X", "D7F", "D3F_Y",
327 ADG_DIR_DOWN);
328 adg_dim_set_limits(ADG_DIM(ldim), NULL, "+0.1");
329 adg_dim_set_level(ADG_DIM(ldim), 2);
330 adg_ldim_switch_extension2(ldim, FALSE);
331 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
333 ldim = adg_ldim_new_full_from_model(model, "D1I", "D7F", "D3F_Y",
334 ADG_DIR_DOWN);
335 adg_dim_set_limits(ADG_DIM(ldim), "-0.05", "+0.05");
336 adg_dim_set_level(ADG_DIM(ldim), 3);
337 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
339 adim = adg_adim_new_full_from_model(model, "D4F", "D4I",
340 "D5I", "D4F", "D4F");
341 adg_dim_set_level(ADG_DIM(adim), 1.5);
342 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(adim));
345 /* EAST */
346 ldim = adg_ldim_new_full_from_model(model, "D6F", "-D6F", "East",
347 ADG_DIR_RIGHT);
348 adg_dim_set_limits(ADG_DIM(ldim), "-0.1", NULL);
349 adg_dim_set_level(ADG_DIM(ldim), 4);
350 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
352 ldim = adg_ldim_new_full_from_model(model, "D4F", "-D4F", "East",
353 ADG_DIR_RIGHT);
354 adg_dim_set_level(ADG_DIM(ldim), 3);
355 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
357 ldim = adg_ldim_new_full_from_model(model, "D5F", "-D5F", "East",
358 ADG_DIR_RIGHT);
359 adg_dim_set_limits(ADG_DIM(ldim), "-0.1", NULL);
360 adg_dim_set_level(ADG_DIM(ldim), 2);
361 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
363 ldim = adg_ldim_new_full_from_model(model, "D7F", "-D7F", "East",
364 ADG_DIR_RIGHT);
365 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
368 /* WEST */
369 ldim = adg_ldim_new_full_from_model(model, "D3I_Y", "-D3I_Y", "-West",
370 ADG_DIR_LEFT);
371 adg_dim_set_limits(ADG_DIM(ldim), "-0.25", NULL);
372 adg_dim_set_level(ADG_DIM(ldim), 4);
373 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
375 ldim = adg_ldim_new_full_from_model(model, "D1I", "-D1I", "-West",
376 ADG_DIR_LEFT);
377 adg_dim_set_limits(ADG_DIM(ldim), "+0.05", "-0.05");
378 adg_dim_set_level(ADG_DIM(ldim), 3);
379 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
381 ldim = adg_ldim_new_full_from_model(model, "D2I", "-D2I", "-West",
382 ADG_DIR_LEFT);
383 adg_dim_set_limits(ADG_DIM(ldim), "-0.1", NULL);
384 adg_dim_set_level(ADG_DIM(ldim), 2);
385 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
387 ldim = adg_ldim_new_full_from_model(model, "DHOLE", "-DHOLE", "-West",
388 ADG_DIR_LEFT);
389 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(ldim));
392 static void
393 _adg_demo_canvas_add_stuff(AdgCanvas *canvas, AdgModel *model)
395 AdgToyText *toy_text;
396 AdgMatrix map;
398 toy_text = adg_toy_text_new("Rotate the mouse wheel to zoom in and out");
399 adg_entity_set_local_method(ADG_ENTITY(toy_text), ADG_MIX_DISABLED);
400 cairo_matrix_init_translate(&map, -100, 200);
401 adg_entity_set_global_map(ADG_ENTITY(toy_text), &map);
402 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(toy_text));
404 toy_text = adg_toy_text_new("Drag with the wheel pressed to pan");
405 adg_entity_set_local_method(ADG_ENTITY(toy_text), ADG_MIX_DISABLED);
406 cairo_matrix_init_translate(&map, -100, 215);
407 adg_entity_set_global_map(ADG_ENTITY(toy_text), &map);
408 adg_container_add(ADG_CONTAINER(canvas), ADG_ENTITY(toy_text));
411 static AdgCanvas *
412 _adg_canvas_init(AdgCanvas *canvas, const AdgPart *part)
414 AdgContainer *container;
415 AdgPath *bottom, *shape;
416 AdgEdges *edges;
417 AdgEntity *entity;
418 AdgMatrix map;
420 container = (AdgContainer *) canvas;
422 bottom = _adg_part_hole(part, part->LHOLE + 2);
423 adg_path_reflect(bottom, NULL);
424 adg_path_close(bottom);
426 shape = _adg_part_shape(part);
427 adg_path_reflect(shape, NULL);
428 adg_path_close(shape);
429 adg_path_move_to_explicit(shape, part->LHOLE + 2, part->D1 / 2);
430 adg_path_line_to_explicit(shape, part->LHOLE + 2, -part->D1 / 2);
432 edges = adg_edges_new_with_source(ADG_TRAIL(shape));
434 entity = ADG_ENTITY(adg_stroke_new(ADG_TRAIL(shape)));
435 adg_container_add(container, entity);
437 entity = ADG_ENTITY(adg_hatch_new(ADG_TRAIL(bottom)));
438 adg_container_add(container, entity);
440 entity = ADG_ENTITY(adg_stroke_new(ADG_TRAIL(edges)));
441 adg_container_add(container, entity);
443 _adg_demo_canvas_add_sheet(canvas);
444 _adg_demo_canvas_add_dimensions(canvas, ADG_MODEL(shape));
445 _adg_demo_canvas_add_stuff(canvas, ADG_MODEL(shape));
447 cairo_matrix_init_scale(&map, 7, 7);
448 adg_entity_set_local_map(ADG_ENTITY(container), &map);
450 return canvas;
453 static GtkRadioButton *
454 _adg_group_get_active(GtkRadioButton *radio_group)
456 GSList *list = gtk_radio_button_get_group(radio_group);
458 while (list) {
459 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list->data)))
460 return list->data;
462 list = list->next;
465 return NULL;
468 static void
469 _adg_save_as_response(GtkWidget *window, GtkResponseType response,
470 AdgCanvas *canvas)
472 gchar *file, *suffix;
473 GtkRadioButton *type_radio;
474 cairo_surface_t *surface = NULL;
475 void (*callback)(cairo_surface_t *, gchar *) = NULL;
477 if (response != GTK_RESPONSE_OK) {
478 gtk_widget_hide(window);
479 return;
482 file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(window));
483 if (file == NULL)
484 return;
486 type_radio = _adg_group_get_active(g_object_get_data(G_OBJECT(window),
487 "type-group"));
488 g_assert(GTK_IS_RADIO_BUTTON(type_radio));
490 suffix = gtk_widget_get_tooltip_markup(GTK_WIDGET(type_radio));
491 g_assert(suffix != NULL);
493 if (!g_str_has_suffix(file, suffix)) {
494 gchar *tmp = file;
495 file = g_strconcat(file, suffix, NULL);
496 g_free(tmp);
499 if (strcmp(suffix, ".png") == 0) {
500 #ifdef CAIRO_HAS_PNG_FUNCTIONS
501 surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 800, 600);
502 callback = (gpointer) cairo_surface_write_to_png;
503 #endif
504 } else if (strcmp(suffix, ".pdf") == 0) {
505 #ifdef CAIRO_HAS_PDF_SURFACE
506 #include <cairo-pdf.h>
507 surface = cairo_pdf_surface_create(file, 841, 595);
508 #endif
509 } else if (strcmp(suffix, ".ps") == 0) {
510 #ifdef CAIRO_HAS_PS_SURFACE
511 #include <cairo-ps.h>
512 surface = cairo_ps_surface_create(file, 841, 595);
513 cairo_ps_surface_dsc_comment(surface, "%%Title: " PACKAGE_STRING);
514 cairo_ps_surface_dsc_comment(surface, "%%Copyright: Copyright (C) 2006-2010 Fontana Nicola");
515 cairo_ps_surface_dsc_comment(surface, "%%Orientation: Portrait");
516 cairo_ps_surface_dsc_begin_setup(surface);
517 cairo_ps_surface_dsc_begin_page_setup(surface);
518 cairo_ps_surface_dsc_comment(surface, "%%IncludeFeature: *PageSize A4");
519 #endif
522 if (surface) {
523 cairo_t *cr = cairo_create(surface);
524 cairo_surface_destroy(surface);
525 adg_entity_render(ADG_ENTITY(canvas), cr);
526 cairo_show_page(cr);
527 if (callback)
528 callback(surface, file);
529 cairo_destroy(cr);
532 g_free(file);
533 g_free(suffix);
534 gtk_widget_hide(window);
537 static GtkWidget *
538 _adg_about_window(GtkBuilder *builder)
540 GtkWidget *window;
542 window = (GtkWidget *) gtk_builder_get_object(builder, "wndAbout");
543 g_assert(GTK_IS_ABOUT_DIALOG(window));
545 g_signal_connect(window, "response", G_CALLBACK(gtk_widget_hide), NULL);
547 return window;
550 /* A one-time signal that set the USER_POS and USER_SIZE flags, so the
551 * last window position is retained */
552 static void
553 _adg_keep_upos(GtkWindow *window)
555 gtk_window_set_geometry_hints(window, GTK_WIDGET(window), NULL,
556 GDK_HINT_USER_POS | GDK_HINT_USER_SIZE);
557 g_signal_handlers_disconnect_by_func(window, _adg_keep_upos, NULL);
560 static GtkWidget *
561 _adg_edit_window(GtkBuilder *builder, AdgPart *part)
563 GtkWidget *window;
564 GtkWidget *button_close;
566 window = (GtkWidget *) gtk_builder_get_object(builder, "wndEdit");
567 g_assert(GTK_IS_DIALOG(window));
568 button_close = (GtkWidget *) gtk_builder_get_object(builder, "editClose");
569 g_assert(GTK_IS_BUTTON(button_close));
571 g_signal_connect(window, "show", G_CALLBACK(_adg_keep_upos), NULL);
572 g_signal_connect(window, "response", G_CALLBACK(gtk_widget_hide), NULL);
574 return window;
577 static GtkWidget *
578 _adg_save_as_window(GtkBuilder *builder, AdgCanvas *canvas)
580 GtkWidget *window;
581 GtkWidget *type_group, *button_save;
583 window = (GtkWidget *) gtk_builder_get_object(builder, "wndSaveAs");
584 g_assert(GTK_IS_WINDOW(window));
585 type_group = (GtkWidget *) gtk_builder_get_object(builder, "saveAsPng");
586 g_assert(GTK_IS_RADIO_BUTTON(type_group));
587 button_save = (GtkWidget *) gtk_builder_get_object(builder, "saveAsSave");
588 g_assert(GTK_IS_BUTTON(button_save));
590 g_object_set_data(G_OBJECT(window), "type-group", type_group);
592 g_signal_connect(window, "response",
593 G_CALLBACK(_adg_save_as_response), canvas);
595 return window;
598 static GtkWidget *
599 _adg_main_window(GtkBuilder *builder)
601 GtkWidget *window;
602 AdgPart *part;
603 AdgCanvas *canvas;
604 GtkWidget *button_edit, *button_save_as, *button_about, *button_quit;
605 AdgGtkArea *adg_area;
607 window = (GtkWidget *) gtk_builder_get_object(builder, "wndMain");
608 part = g_new(AdgPart, 1);
609 canvas = adg_canvas_new();
611 g_assert(GTK_IS_WINDOW(window));
612 button_edit = (GtkWidget *) gtk_builder_get_object(builder, "mainEdit");
613 g_assert(GTK_IS_BUTTON(button_edit));
614 button_save_as = (GtkWidget *) gtk_builder_get_object(builder, "mainSaveAs");
615 g_assert(GTK_IS_BUTTON(button_save_as));
616 button_about = (GtkWidget *) gtk_builder_get_object(builder, "mainAbout");
617 g_assert(GTK_IS_BUTTON(button_about));
618 button_quit = (GtkWidget *) gtk_builder_get_object(builder, "mainQuit");
619 g_assert(GTK_IS_BUTTON(button_quit));
620 adg_area = (AdgGtkArea *) gtk_builder_get_object(builder, "mainCanvas");
621 g_assert(ADG_GTK_IS_AREA(adg_area));
623 _adg_part_init(part);
624 _adg_canvas_init(canvas, part);
625 adg_gtk_area_set_canvas(adg_area, canvas);
627 g_signal_connect_swapped(button_edit, "clicked",
628 G_CALLBACK(gtk_dialog_run),
629 _adg_edit_window(builder, part));
630 g_signal_connect_swapped(button_save_as, "clicked",
631 G_CALLBACK(gtk_dialog_run),
632 _adg_save_as_window(builder, canvas));
633 g_signal_connect_swapped(button_about, "clicked",
634 G_CALLBACK(gtk_dialog_run),
635 _adg_about_window(builder));
636 g_signal_connect(button_quit, "clicked", G_CALLBACK(gtk_main_quit), NULL);
637 g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
638 g_signal_connect_swapped(window, "destroy", G_CALLBACK(g_free), part);
640 return window;
645 main(gint argc, gchar **argv)
647 gboolean show_extents;
648 gchar *path;
649 GtkBuilder *builder;
650 GError *error;
651 GtkWidget *main_window;
653 _adg_parse_args(&argc, &argv, &show_extents);
654 adg_switch_extents(show_extents);
656 path = demo_find_data_file("adg-demo.ui");
657 if (path == NULL) {
658 g_print("adg-demo.ui not found!\n");
659 return 1;
662 builder = gtk_builder_new();
663 error = NULL;
664 gtk_builder_add_from_file(builder, path, &error);
666 if (error != NULL) {
667 g_critical(error->message);
668 g_error_free(error);
669 return 2;
672 main_window = _adg_main_window(builder);
673 g_object_unref(builder);
675 gtk_widget_show_all(main_window);
676 gtk_main();
678 return 0;