]> git.llucax.com Git - z.facultad/75.42/figuras.git/blob - tp5window.cpp
Se agrega documentacion.
[z.facultad/75.42/figuras.git] / tp5window.cpp
1 /* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80 fileencoding=utf-8:
2  *
3  * Taller de Programación (75.42).
4  *
5  * Ejercicio Número 5:
6  * Graficador de figuras.
7  *
8  * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9  * Puede copiar, modificar y distribuir este programa bajo los términos de
10  * la licencia GPL (http://www.gnu.org/).
11  *
12  * Creado: mié oct  1 23:31:40 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "callbacks.h"
18 #include "tp5window.h"
19 #include "dibujo.h"
20
21 #include <cstring>
22 #include <gtk/gtk.h>
23
24 const char* TP5Window::COLOR[] = {
25     "Negro",
26     "Azul Oscuro",
27     "Verde Oscuro",
28     "Cián Oscuro",
29     "Rojo Oscuro",
30     "Magenta Oscuro",
31     "Amarillo Oscuro",
32     "Gris Oscuro",
33     "Gris",
34     "Azul",
35     "Verde",
36     "Cián",
37     "Rojo",
38     "Magenta",
39     "Amarillo",
40     "Blanco"
41 };
42
43 int TP5Window::get_color(void) const {
44     const char* str = gtk_entry_get_text(
45             GTK_ENTRY(GTK_COMBO(combo_color)->entry));
46     for (int i = 0; i < CANT_COLORES; i++) {
47         if (!strcmp(str, COLOR[i])) {
48             return i;
49         }
50     }
51     // No debería pasar nunca.
52     return -1;
53 }
54
55 TP5Window::TP5Window(void) {
56     // Widgets utilizados, de los cuales no voy a guardar un puntero de acceso
57     // rápido en la clase porque no se usan más que para el funcionamiento
58     // general de la interfaz gráfica.
59     GtkWidget *vbox;
60     GtkWidget *hbox_botones;
61     GtkWidget *frame_dibujo;
62     GtkWidget *label_dibujo;
63     GtkWidget *vbuttonbox_botones;
64     GtkWidget *hbox;
65     GtkWidget *frame_figura;
66     GtkWidget *vbox_figura;
67     GSList    *radiobutton_group = NULL;
68     GtkWidget *label_figura;
69     GtkWidget *vbox_comun;
70     GtkWidget *table_comun;
71     GtkWidget *label_nombre;
72     GtkWidget *label_color;
73     GtkWidget *label_grosor;
74     GtkWidget *combo_entry;
75     GtkObject *spinbutton_grosor_adj;
76     GtkWidget *vbox_otros;
77     GtkWidget *table_puntos;
78     GtkWidget *label_centro;
79     GtkWidget *label_inicio;
80     GtkWidget *label_fin;
81     GtkWidget *label_puntos;
82     GtkWidget *label_x;
83     GtkWidget *label_y;
84     GtkObject *spinbutton_centro_x_adj;
85     GtkObject *spinbutton_centro_y_adj;
86     GtkObject *spinbutton_inicio_x_adj;
87     GtkObject *spinbutton_inicio_y_adj;
88     GtkObject *spinbutton_fin_x_adj;
89     GtkObject *spinbutton_fin_y_adj;
90     GtkWidget *table_otros;
91     GtkWidget *label_alto;
92     GtkWidget *label_ancho;
93     GtkWidget *label_radio;
94     GtkObject *spinbutton_alto_adj;
95     GtkObject *spinbutton_ancho_adj;
96     GtkObject *spinbutton_radio_adj;
97     combo_color_items = NULL;
98
99     // Creo ventana principal.
100     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
101     // Asigna márgen a la ventana (se va a dibujar los controles 5 píxeles por
102     // dentro de la ventana.
103     gtk_container_set_border_width(GTK_CONTAINER(window), 5);
104     // Asigno título a la ventana.
105     gtk_window_set_title(GTK_WINDOW(window), "Trabajo Práctico V");
106
107     // Divide la ventana en 2 verticalmente. Abajo irán los controles para crear
108     // figuras, arriba el área de dibujo y los controles de dibujo/salida.
109     vbox = gtk_vbox_new(
110             FALSE, // No se distribuye homogeneamente.
111             0);    // Espaciado.
112     gtk_container_add(GTK_CONTAINER(window), vbox);
113
114     // Divide en dos horizontalmente la porción de arriba. A la izquierda irá el
115     // área de dibujo y a la derecha los botones de dibujo/salida.
116     hbox_botones = gtk_hbox_new(FALSE, 5);
117     gtk_box_pack_start(GTK_BOX(vbox), hbox_botones, TRUE, TRUE, 0);
118     //                                              ^|^^  ^|^^  |
119     // Indica si se expanda cuando se cambia el  <---'     |    |
120     // tamaño de la ventana.                               |    |
121     //                                                     |    |
122     // Indica que se debe rellenar toda el área  <---------'    V
123     // expandida con el widget que contiene.                 Espaciado
124
125     // Crea un marco con una leyenda para indicar que dentro está el área de
126     // dibujo.
127     frame_dibujo = gtk_frame_new(NULL);
128     gtk_box_pack_start(GTK_BOX(hbox_botones), frame_dibujo, TRUE, TRUE, 0);
129
130     // Crea la leyenda y la agrega al marco.
131     label_dibujo = gtk_label_new("Dibujo");
132     gtk_frame_set_label_widget(GTK_FRAME(frame_dibujo), label_dibujo);
133     //gtk_label_set_justify(GTK_LABEL(label_dibujo), GTK_JUSTIFY_LEFT);
134
135     // Crea el área de dibujo y la agrega al marco.
136     drawingarea = gtk_drawing_area_new();
137     gtk_container_add(GTK_CONTAINER(frame_dibujo), drawingarea);
138     // Sugiere un tamaño de 200x200, pero puede adaptarse si se cambia el tamaño
139     // de la ventana.
140     gtk_widget_set_size_request(drawingarea, 200, 200);
141
142     // Crea una matriz de 3x1 para los tres botones relativos al dibujo (y
143     // salida). Esto es agregado a la región de la derecha del dibujo.
144     vbuttonbox_botones = gtk_vbutton_box_new();
145     gtk_box_pack_start(GTK_BOX(hbox_botones), vbuttonbox_botones, FALSE, TRUE, 0);
146     gtk_container_set_border_width(GTK_CONTAINER(vbuttonbox_botones), 5);
147     gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox_botones), GTK_BUTTONBOX_SPREAD);
148
149     button_limpiar = gtk_button_new_from_stock("gtk-clear");
150     gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_limpiar);
151     GTK_WIDGET_SET_FLAGS(button_limpiar, GTK_CAN_DEFAULT);
152
153     button_actualizar = gtk_button_new_from_stock("gtk-refresh");
154     gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_actualizar);
155     GTK_WIDGET_SET_FLAGS(button_actualizar, GTK_CAN_DEFAULT);
156
157     button_salir = gtk_button_new_from_stock("gtk-quit");
158     gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_salir);
159     GTK_WIDGET_SET_FLAGS(button_salir, GTK_CAN_DEFAULT);
160
161     hbox = gtk_hbox_new(FALSE, 0);
162     gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
163
164     frame_figura = gtk_frame_new(NULL);
165     gtk_box_pack_start(GTK_BOX(hbox), frame_figura, FALSE, FALSE, 0);
166
167     vbox_figura = gtk_vbox_new(FALSE, 0);
168     gtk_container_add(GTK_CONTAINER(frame_figura), vbox_figura);
169
170     radiobutton_linea = gtk_radio_button_new_with_mnemonic(NULL, "_Línea");
171     gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_linea, FALSE, FALSE, 0);
172     gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_linea), radiobutton_group);
173     radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_linea));
174     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobutton_linea), TRUE);
175
176     radiobutton_cuadrado = gtk_radio_button_new_with_mnemonic(NULL, "_Cuadrado");
177     gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_cuadrado, FALSE, FALSE, 0);
178     gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_cuadrado), radiobutton_group);
179     radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_cuadrado));
180
181     radiobutton_rectangulo = gtk_radio_button_new_with_mnemonic(NULL, "_Rectángulo");
182     gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_rectangulo, FALSE, FALSE, 0);
183     gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_rectangulo), radiobutton_group);
184     radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_rectangulo));
185
186     radiobutton_circulo = gtk_radio_button_new_with_mnemonic(NULL, "Círc_ulo");
187     gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_circulo, FALSE, FALSE, 0);
188     gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_circulo), radiobutton_group);
189     radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_circulo));
190
191     label_figura = gtk_label_new("Figura");
192     gtk_frame_set_label_widget(GTK_FRAME(frame_figura), label_figura);
193     gtk_label_set_justify(GTK_LABEL(label_figura), GTK_JUSTIFY_LEFT);
194
195     vbox_comun = gtk_vbox_new(FALSE, 0);
196     gtk_box_pack_start(GTK_BOX(hbox), vbox_comun, TRUE, TRUE, 0);
197
198     table_comun = gtk_table_new(3, 2, FALSE);
199     gtk_box_pack_start(GTK_BOX(vbox_comun), table_comun, TRUE, TRUE, 0);
200     gtk_container_set_border_width(GTK_CONTAINER(table_comun), 5);
201     gtk_table_set_row_spacings(GTK_TABLE(table_comun), 3);
202     gtk_table_set_col_spacings(GTK_TABLE(table_comun), 5);
203
204     label_nombre = gtk_label_new("Nombre");
205     gtk_table_attach(GTK_TABLE(table_comun), label_nombre, 0, 1, 0, 1,
206            (GtkAttachOptions)(GTK_FILL),
207            (GtkAttachOptions)(0), 0, 0);
208     gtk_label_set_justify(GTK_LABEL(label_nombre), GTK_JUSTIFY_LEFT);
209     gtk_misc_set_alignment(GTK_MISC(label_nombre), 0, 0.5);
210
211     label_color = gtk_label_new("Color");
212     gtk_table_attach(GTK_TABLE(table_comun), label_color, 0, 1, 1, 2,
213            (GtkAttachOptions)(GTK_FILL),
214            (GtkAttachOptions)(0), 0, 0);
215     gtk_label_set_justify(GTK_LABEL(label_color), GTK_JUSTIFY_LEFT);
216     gtk_misc_set_alignment(GTK_MISC(label_color), 0, 0.5);
217
218     label_grosor = gtk_label_new("Grosor");
219     gtk_table_attach(GTK_TABLE(table_comun), label_grosor, 0, 1, 2, 3,
220            (GtkAttachOptions)(GTK_FILL),
221            (GtkAttachOptions)(0), 0, 0);
222     gtk_label_set_justify(GTK_LABEL(label_grosor), GTK_JUSTIFY_LEFT);
223     gtk_misc_set_alignment(GTK_MISC(label_grosor), 0, 0.5);
224
225     entry_nombre = gtk_entry_new();
226     gtk_table_attach(GTK_TABLE(table_comun), entry_nombre, 1, 2, 0, 1,
227            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
228            (GtkAttachOptions)(GTK_EXPAND), 0, 0);
229     gtk_widget_set_size_request(entry_nombre, 100, -1);
230
231     combo_color = gtk_combo_new();
232     g_object_set_data(G_OBJECT(GTK_COMBO(combo_color)->popwin),
233             "GladeParentKey", combo_color);
234     gtk_table_attach(GTK_TABLE(table_comun), combo_color, 1, 2, 1, 2,
235            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
236            (GtkAttachOptions)(GTK_EXPAND), 0, 0);
237     gtk_widget_set_size_request(combo_color, 150, -1);
238     gtk_combo_set_value_in_list(GTK_COMBO(combo_color), TRUE, FALSE);
239     for (int i = 0; i < CANT_COLORES; i++) {
240         combo_color_items = g_list_append(combo_color_items,(gpointer) COLOR[i]);
241     }
242     gtk_combo_set_popdown_strings(GTK_COMBO(combo_color), combo_color_items);
243     g_list_free(combo_color_items);
244
245     combo_entry = GTK_COMBO(combo_color)->entry;
246     gtk_editable_set_editable(GTK_EDITABLE(combo_entry), FALSE);
247     gtk_entry_set_text(GTK_ENTRY(combo_entry), COLOR[0]);
248
249     spinbutton_grosor_adj = gtk_adjustment_new(1, 1, 10, 1, 10, 10);
250     spinbutton_grosor = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_grosor_adj), 1, 0);
251     gtk_table_attach(GTK_TABLE(table_comun), spinbutton_grosor, 1, 2, 2, 3,
252            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
253            (GtkAttachOptions)(GTK_EXPAND), 0, 0);
254     gtk_widget_set_size_request(spinbutton_grosor, 48, -1);
255
256     button_agregar = gtk_button_new_from_stock("gtk-add");
257     gtk_box_pack_start(GTK_BOX(vbox_comun), button_agregar, FALSE, FALSE, 0);
258
259     vbox_otros = gtk_vbox_new(FALSE, 5);
260     gtk_box_pack_start(GTK_BOX(hbox), vbox_otros, FALSE, FALSE, 0);
261     gtk_container_set_border_width(GTK_CONTAINER(vbox_otros), 5);
262
263     table_puntos = gtk_table_new(4, 3, FALSE);
264     gtk_box_pack_start(GTK_BOX(vbox_otros), table_puntos, FALSE, FALSE, 0);
265     gtk_table_set_col_spacings(GTK_TABLE(table_puntos), 2);
266
267     label_centro = gtk_label_new("Centro");
268     gtk_table_attach(GTK_TABLE(table_puntos), label_centro, 0, 1, 1, 2,
269            (GtkAttachOptions)(GTK_FILL),
270            (GtkAttachOptions)(0), 0, 0);
271     gtk_label_set_justify(GTK_LABEL(label_centro), GTK_JUSTIFY_LEFT);
272     gtk_misc_set_alignment(GTK_MISC(label_centro), 0, 0.5);
273
274     label_inicio = gtk_label_new("Inicio");
275     gtk_table_attach(GTK_TABLE(table_puntos), label_inicio, 0, 1, 2, 3,
276            (GtkAttachOptions)(GTK_FILL),
277            (GtkAttachOptions)(0), 0, 0);
278     gtk_label_set_justify(GTK_LABEL(label_inicio), GTK_JUSTIFY_LEFT);
279     gtk_misc_set_alignment(GTK_MISC(label_inicio), 0, 0.5);
280
281     label_fin = gtk_label_new("Fin");
282     gtk_table_attach(GTK_TABLE(table_puntos), label_fin, 0, 1, 3, 4,
283            (GtkAttachOptions)(GTK_FILL),
284            (GtkAttachOptions)(0), 0, 0);
285     gtk_label_set_justify(GTK_LABEL(label_fin), GTK_JUSTIFY_LEFT);
286     gtk_misc_set_alignment(GTK_MISC(label_fin), 0, 0.5);
287
288     label_puntos = gtk_label_new("");
289     gtk_table_attach(GTK_TABLE(table_puntos), label_puntos, 0, 1, 0, 1,
290            (GtkAttachOptions)(GTK_FILL),
291            (GtkAttachOptions)(0), 0, 0);
292     gtk_label_set_justify(GTK_LABEL(label_puntos), GTK_JUSTIFY_LEFT);
293     gtk_misc_set_alignment(GTK_MISC(label_puntos), 0, 0.5);
294
295     label_x = gtk_label_new("X");
296     gtk_table_attach(GTK_TABLE(table_puntos), label_x, 1, 2, 0, 1,
297            (GtkAttachOptions)(0),
298            (GtkAttachOptions)(0), 0, 0);
299     gtk_misc_set_alignment(GTK_MISC(label_x), 0, 0.5);
300
301     label_y = gtk_label_new("Y");
302     gtk_table_attach(GTK_TABLE(table_puntos), label_y, 2, 3, 0, 1,
303            (GtkAttachOptions)(GTK_EXPAND),
304            (GtkAttachOptions)(0), 0, 0);
305     gtk_misc_set_alignment(GTK_MISC(label_y), 0, 0.5);
306
307     spinbutton_centro_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
308     spinbutton_centro_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_centro_x_adj), 1, 0);
309     gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_centro_x, 1, 2, 1, 2,
310            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
311            (GtkAttachOptions)(0), 0, 0);
312
313     spinbutton_centro_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
314     spinbutton_centro_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_centro_y_adj), 1, 0);
315     gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_centro_y, 2, 3, 1, 2,
316            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
317            (GtkAttachOptions)(0), 0, 0);
318
319     spinbutton_inicio_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
320     spinbutton_inicio_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_inicio_x_adj), 1, 0);
321     gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_inicio_x, 1, 2, 2, 3,
322            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
323            (GtkAttachOptions)(0), 0, 0);
324
325     spinbutton_inicio_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
326     spinbutton_inicio_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_inicio_y_adj), 1, 0);
327     gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_inicio_y, 2, 3, 2, 3,
328            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
329            (GtkAttachOptions)(0), 0, 0);
330
331     spinbutton_fin_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
332     spinbutton_fin_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_fin_x_adj), 1, 0);
333     gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_fin_x, 1, 2, 3, 4,
334            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
335            (GtkAttachOptions)(0), 0, 0);
336
337     spinbutton_fin_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
338     spinbutton_fin_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_fin_y_adj), 1, 0);
339     gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_fin_y, 2, 3, 3, 4,
340            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
341            (GtkAttachOptions)(0), 0, 0);
342
343     table_otros = gtk_table_new(3, 2, FALSE);
344     gtk_box_pack_start(GTK_BOX(vbox_otros), table_otros, FALSE, FALSE, 0);
345     gtk_table_set_col_spacings(GTK_TABLE(table_otros), 2);
346
347     label_alto = gtk_label_new("Alto");
348     gtk_table_attach(GTK_TABLE(table_otros), label_alto, 0, 1, 0, 1,
349            (GtkAttachOptions)(GTK_FILL),
350            (GtkAttachOptions)(0), 0, 0);
351     gtk_label_set_justify(GTK_LABEL(label_alto), GTK_JUSTIFY_LEFT);
352     gtk_misc_set_alignment(GTK_MISC(label_alto), 0, 0.5);
353
354     label_ancho = gtk_label_new("Ancho");
355     gtk_table_attach(GTK_TABLE(table_otros), label_ancho, 0, 1, 1, 2,
356            (GtkAttachOptions)(GTK_FILL),
357            (GtkAttachOptions)(0), 0, 0);
358     gtk_label_set_justify(GTK_LABEL(label_ancho), GTK_JUSTIFY_LEFT);
359     gtk_misc_set_alignment(GTK_MISC(label_ancho), 0, 0.5);
360
361     label_radio = gtk_label_new("Radio");
362     gtk_table_attach(GTK_TABLE(table_otros), label_radio, 0, 1, 2, 3,
363            (GtkAttachOptions)(GTK_FILL),
364            (GtkAttachOptions)(0), 0, 0);
365     gtk_label_set_justify(GTK_LABEL(label_radio), GTK_JUSTIFY_LEFT);
366     gtk_misc_set_alignment(GTK_MISC(label_radio), 0, 0.5);
367
368     spinbutton_alto_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
369     spinbutton_alto = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_alto_adj), 1, 0);
370     gtk_table_attach(GTK_TABLE(table_otros), spinbutton_alto, 1, 2, 0, 1,
371            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
372            (GtkAttachOptions)(0), 0, 0);
373     gtk_widget_set_sensitive(spinbutton_alto, FALSE);
374
375     spinbutton_ancho_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
376     spinbutton_ancho = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_ancho_adj), 1, 0);
377     gtk_table_attach(GTK_TABLE(table_otros), spinbutton_ancho, 1, 2, 1, 2,
378            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
379            (GtkAttachOptions)(0), 0, 0);
380     gtk_widget_set_sensitive(spinbutton_ancho, FALSE);
381
382     spinbutton_radio_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
383     spinbutton_radio = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_radio_adj), 1, 0);
384     gtk_table_attach(GTK_TABLE(table_otros), spinbutton_radio, 1, 2, 2, 3,
385            (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
386            (GtkAttachOptions)(0), 0, 0);
387     gtk_widget_set_sensitive(spinbutton_radio, FALSE);
388
389     g_signal_connect((gpointer) window, "delete_event",
390             G_CALLBACK(on_window_delete_event),
391             NULL);
392     g_signal_connect((gpointer) drawingarea, "expose_event",
393             G_CALLBACK(on_drawingarea_expose_event),
394             &dibujo);
395     g_signal_connect((gpointer) button_limpiar, "clicked",
396             G_CALLBACK(on_button_borrar_clicked),
397             &dibujo);
398     g_signal_connect((gpointer) button_actualizar, "clicked",
399             G_CALLBACK(on_button_graficar_clicked),
400             drawingarea);
401     g_signal_connect((gpointer) button_salir, "clicked",
402             G_CALLBACK(on_button_salir_clicked),
403             NULL);
404     g_signal_connect((gpointer) button_agregar, "clicked",
405             G_CALLBACK(on_button_agregar_clicked),
406             this);
407     g_signal_connect((gpointer) radiobutton_linea, "toggled",
408             G_CALLBACK(on_radiobutton_linea_toggled),
409             this);
410     g_signal_connect((gpointer) radiobutton_cuadrado, "toggled",
411             G_CALLBACK(on_radiobutton_cuadrado_toggled),
412             this);
413     g_signal_connect((gpointer) radiobutton_rectangulo, "toggled",
414             G_CALLBACK(on_radiobutton_rectangulo_toggled),
415             this);
416     g_signal_connect((gpointer) radiobutton_circulo, "toggled",
417             G_CALLBACK(on_radiobutton_circulo_toggled),
418             this);
419
420     // Muestro la ventana principal y todos sus componentes.
421     gtk_widget_show_all(window);
422 }
423
424 TP5Window::~TP5Window(void) {
425     dibujo.borrar_todo();
426 }