1 /* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80 fileencoding=utf-8:
3 * Taller de Programación (75.42).
6 * Graficador de figuras.
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/).
12 * Creado: mié oct 1 23:31:40 ART 2003
17 #include "callbacks.h"
18 #include "tp5window.h"
24 const char* TP5Window::COLOR[] = {
43 int TP5Window::get_color(void) const {
44 // Obtiene el string del color elegido.
45 const char* str = gtk_entry_get_text(
46 GTK_ENTRY(GTK_COMBO(combo_color)->entry));
47 for (int i = 0; i < CANT_COLORES; i++) {
48 // Si el string con el color coincide, devuelvo el índice.
49 if (!strcmp(str, COLOR[i])) {
53 // No debería pasar nunca.
57 TP5Window::TP5Window(void) {
58 // Widgets utilizados, de los cuales no voy a guardar un puntero de acceso
59 // rápido en la clase porque no se usan más que para el funcionamiento
60 // general de la interfaz gráfica.
62 GtkWidget *hbox_botones;
63 GtkWidget *frame_dibujo;
64 GtkWidget *label_dibujo;
65 GtkWidget *vbuttonbox_botones;
67 GtkWidget *frame_figura;
68 GtkWidget *vbox_figura;
69 GSList *radiobutton_group = NULL;
70 GtkWidget *label_figura;
71 GtkWidget *vbox_comun;
72 GtkWidget *table_comun;
73 GtkWidget *label_nombre;
74 GtkWidget *label_color;
75 GtkWidget *label_grosor;
76 GtkWidget *combo_entry;
77 GtkObject *spinbutton_grosor_adj;
78 GtkWidget *vbox_otros;
79 GtkWidget *table_puntos;
80 GtkWidget *label_centro;
81 GtkWidget *label_inicio;
83 GtkWidget *label_puntos;
86 GtkObject *spinbutton_centro_x_adj;
87 GtkObject *spinbutton_centro_y_adj;
88 GtkObject *spinbutton_inicio_x_adj;
89 GtkObject *spinbutton_inicio_y_adj;
90 GtkObject *spinbutton_fin_x_adj;
91 GtkObject *spinbutton_fin_y_adj;
92 GtkWidget *table_otros;
93 GtkWidget *label_alto;
94 GtkWidget *label_ancho;
95 GtkWidget *label_radio;
96 GtkObject *spinbutton_alto_adj;
97 GtkObject *spinbutton_ancho_adj;
98 GtkObject *spinbutton_radio_adj;
99 combo_color_items = NULL;
101 // Creo ventana principal.
102 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
103 // Asigna márgen a la ventana (se va a dibujar los controles 5 píxeles por
104 // dentro de la ventana.
105 gtk_container_set_border_width(GTK_CONTAINER(window), 5);
106 // Asigno título a la ventana.
107 gtk_window_set_title(GTK_WINDOW(window), "Trabajo Práctico V");
109 // Divide la ventana en 2 verticalmente. Abajo irán los controles para crear
110 // figuras, arriba el área de dibujo y los controles de dibujo/salida.
112 FALSE, // No se distribuye homogeneamente.
114 gtk_container_add(GTK_CONTAINER(window), vbox);
116 // Divide en dos horizontalmente la porción de arriba. A la izquierda irá el
117 // área de dibujo y a la derecha los botones de dibujo/salida.
118 hbox_botones = gtk_hbox_new(FALSE, 5);
119 gtk_box_pack_start(GTK_BOX(vbox), hbox_botones, TRUE, TRUE, 0);
121 // Indica si se expanda cuando se cambia el <---' | |
122 // tamaño de la ventana. | |
124 // Indica que se debe rellenar toda el área <---------' V
125 // expandida con el widget que contiene. Espaciado
127 // Crea un marco con una leyenda para indicar que dentro está el área de
129 frame_dibujo = gtk_frame_new(NULL);
130 gtk_box_pack_start(GTK_BOX(hbox_botones), frame_dibujo, TRUE, TRUE, 0);
132 // Crea la leyenda y la agrega al marco.
133 label_dibujo = gtk_label_new("Dibujo");
134 gtk_frame_set_label_widget(GTK_FRAME(frame_dibujo), label_dibujo);
136 // Crea el área de dibujo y la agrega al marco.
137 drawingarea = gtk_drawing_area_new();
138 gtk_container_add(GTK_CONTAINER(frame_dibujo), drawingarea);
139 // Sugiere un tamaño de 200x200, pero puede adaptarse si se cambia el tamaño
141 gtk_widget_set_size_request(drawingarea, 200, 200);
143 // Crea una barra vertical de tres botones relativos al dibujo (y
144 // salida). Esto es agregado a la región de la derecha del dibujo.
145 vbuttonbox_botones = gtk_vbutton_box_new();
146 gtk_box_pack_start(GTK_BOX(hbox_botones), vbuttonbox_botones, FALSE,
148 // Deja un márgen de 5 píxeles.
149 gtk_container_set_border_width(GTK_CONTAINER(vbuttonbox_botones), 5);
150 // Ajusta la distribución de los botones.
151 gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox_botones),
152 GTK_BUTTONBOX_SPREAD);
154 // Agrega un botón predefinido para limpiar (con ícono y traducido a varios
156 button_limpiar = gtk_button_new_from_stock("gtk-clear");
157 gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_limpiar);
159 // Agrega un botón predefinido para actualizar (con ícono y traducido a
161 button_actualizar = gtk_button_new_from_stock("gtk-refresh");
162 gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_actualizar);
164 // Agrega un botón predefinido para salir (con ícono y traducido a varios
166 button_salir = gtk_button_new_from_stock("gtk-quit");
167 gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_salir);
169 /////////////// FIN DE LA MITAD SUPERIOR DE LA PANTALLA ///////////////////
171 // Se divide la parte inferior en tres columnas.
172 hbox = gtk_hbox_new(FALSE, 0);
173 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
175 //////////// PRIMERA COLUMNA //////////////
176 // Crea un marco con una leyenda para poner los botones de selección de tipo
178 frame_figura = gtk_frame_new(NULL);
179 gtk_box_pack_start(GTK_BOX(hbox), frame_figura, FALSE, FALSE, 0);
180 // Crea la leyenda del marco.
181 label_figura = gtk_label_new("Figura");
182 gtk_frame_set_label_widget(GTK_FRAME(frame_figura), label_figura);
184 // Crea una división vertical para poner los botones de selección del tipo
186 vbox_figura = gtk_vbox_new(FALSE, 0);
187 gtk_container_add(GTK_CONTAINER(frame_figura), vbox_figura);
189 // Agrega botón de selección (radio button) para Línea.
190 radiobutton_linea = gtk_radio_button_new_with_mnemonic(NULL, "_Línea");
191 gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_linea,FALSE,FALSE,0);
192 // Lo agrega a un grupo de botones para controlar que sólo uno esté activo.
193 gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_linea),
195 // Obtiene el puntero al grupo (ya que la función anterior también
196 // inicializa el grupo que estaba en NULL.
197 radiobutton_group = gtk_radio_button_get_group(
198 GTK_RADIO_BUTTON(radiobutton_linea));
200 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobutton_linea), TRUE);
202 // Agrega botón de selección (radio button) para Cuadrado.
203 radiobutton_cuadrado = gtk_radio_button_new_with_mnemonic(NULL, "_Cuadrado");
204 gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_cuadrado, FALSE, FALSE, 0);
205 gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_cuadrado), radiobutton_group);
206 radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_cuadrado));
208 // Agrega botón de selección (radio button) para Rectángulo.
209 radiobutton_rectangulo = gtk_radio_button_new_with_mnemonic(NULL, "_Rectángulo");
210 gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_rectangulo, FALSE, FALSE, 0);
211 gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_rectangulo), radiobutton_group);
212 radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_rectangulo));
214 // Agrega botón de selección (radio button) para Círculo.
215 radiobutton_circulo = gtk_radio_button_new_with_mnemonic(NULL, "Círc_ulo");
216 gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_circulo, FALSE, FALSE, 0);
217 gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_circulo), radiobutton_group);
218 radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_circulo));
220 //////////// SEGUNDA COLUMNA //////////////
221 // Crea una división vertical para poner los campos comunes a todas las
222 // figuras y el botón de agregar.
223 vbox_comun = gtk_vbox_new(FALSE, 0);
224 gtk_box_pack_start(GTK_BOX(hbox), vbox_comun, TRUE, TRUE, 0);
226 // Crea una tabla de 3x2 para poner los campos de entrada con sus etiquetas.
227 table_comun = gtk_table_new(3, 2, FALSE);
228 gtk_box_pack_start(GTK_BOX(vbox_comun), table_comun, TRUE, TRUE, 0);
229 gtk_container_set_border_width(GTK_CONTAINER(table_comun), 5);
230 // Asigna el espaciado entre celdas.
231 gtk_table_set_row_spacings(GTK_TABLE(table_comun), 3);
232 gtk_table_set_col_spacings(GTK_TABLE(table_comun), 5);
234 // Crea la etiqueta de Nombre.
235 label_nombre = gtk_label_new("Nombre");
236 // La agrega a la tabla.
237 gtk_table_attach(GTK_TABLE(table_comun), label_nombre, 0, 1, 0, 1,
238 (GtkAttachOptions)(GTK_FILL),
239 (GtkAttachOptions)(0), 0, 0);
241 // Crea y agrega la etiqueta de Color.
242 label_color = gtk_label_new("Color");
243 gtk_table_attach(GTK_TABLE(table_comun), label_color, 0, 1, 1, 2,
244 (GtkAttachOptions)(GTK_FILL),
245 (GtkAttachOptions)(0), 0, 0);
247 // Crea y agrega la etiqueta de Grosor.
248 label_grosor = gtk_label_new("Grosor");
249 gtk_table_attach(GTK_TABLE(table_comun), label_grosor, 0, 1, 2, 3,
250 (GtkAttachOptions)(GTK_FILL),
251 (GtkAttachOptions)(0), 0, 0);
253 // Crea y agrega una entrada texto para el Nombre.
254 entry_nombre = gtk_entry_new();
255 gtk_table_attach(GTK_TABLE(table_comun), entry_nombre, 1, 2, 0, 1,
256 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
257 (GtkAttachOptions)(GTK_EXPAND), 0, 0);
258 // Sugiere un tamaño en X de 100 píxeles.
259 gtk_widget_set_size_request(entry_nombre, 100, -1);
261 // Agrega un combo para elegir el color.
262 combo_color = gtk_combo_new();
263 gtk_table_attach(GTK_TABLE(table_comun), combo_color, 1, 2, 1, 2,
264 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
265 (GtkAttachOptions)(GTK_EXPAND), 0, 0);
266 // Sugiere un tamaño en X de 150 píxeles.
267 gtk_widget_set_size_request(combo_color, 150, -1);
268 // Indica que sólo acepta valores que estén en la lista.
269 gtk_combo_set_value_in_list(GTK_COMBO(combo_color),
270 TRUE, // Solo acepta valores en la lista.
271 FALSE); // No puede estar vacío.
272 // Llena la lista con los colores admitidos.
273 for (int i = 0; i < CANT_COLORES; i++) {
274 combo_color_items = g_list_append(combo_color_items,(gpointer) COLOR[i]);
276 // Copia la lista para usarla en el combo.
277 gtk_combo_set_popdown_strings(GTK_COMBO(combo_color), combo_color_items);
278 // Libera la memoria de la lista temporal.
279 g_list_free(combo_color_items);
280 // Obtiene el campo de entrada del combo.
281 combo_entry = GTK_COMBO(combo_color)->entry;
282 // Hace que no pueda editarse.
283 gtk_editable_set_editable(GTK_EDITABLE(combo_entry), FALSE);
284 // Setea el primer color por defecto.
285 gtk_entry_set_text(GTK_ENTRY(combo_entry), COLOR[0]);
287 // Crea valores de ajuste para la entrada de Grosor.
288 spinbutton_grosor_adj = gtk_adjustment_new(
292 1, // Tamaño del paso de incremento.
293 10, // Tamaño del paso de incremento de página. | no aplicable
294 10); // Tamaño de página. | en este caso.
295 // Crea la entrada de grosor con flechas de incremento y decremento.
296 spinbutton_grosor = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_grosor_adj), 1, 0);
297 // Agrega a la tabla.
298 gtk_table_attach(GTK_TABLE(table_comun), spinbutton_grosor, 1, 2, 2, 3,
299 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
300 (GtkAttachOptions)(GTK_EXPAND), 0, 0);
301 // Sugiere el tamaño.
302 gtk_widget_set_size_request(spinbutton_grosor, 48, -1);
304 // Agrega el botón de Agregar.
305 button_agregar = gtk_button_new_from_stock("gtk-add");
306 gtk_box_pack_start(GTK_BOX(vbox_comun), button_agregar, FALSE, FALSE, 0);
308 ///////////////// TERCERA COLUMNA /////////////////
309 // Divide la comunma verticalmente en 2, arriba iran las entradas de puntos
310 // y abajo el alto, ancho y radio.
311 vbox_otros = gtk_vbox_new(FALSE, 5);
312 gtk_box_pack_start(GTK_BOX(hbox), vbox_otros, FALSE, FALSE, 0);
313 gtk_container_set_border_width(GTK_CONTAINER(vbox_otros), 5);
315 // Crea una tabla de 4x3 para poner las entradas de los puntos con
316 // etiquetas de una forma como esta:
318 // -------+---+---+ |
320 // -------+---+---+ +--> 4
322 // -------+---+---+ |
329 table_puntos = gtk_table_new(4, 3, FALSE);
330 gtk_box_pack_start(GTK_BOX(vbox_otros), table_puntos, FALSE, FALSE, 0);
331 gtk_table_set_col_spacings(GTK_TABLE(table_puntos), 2);
333 // Agrega una etiqueta vacía para la esquina superior izquierda.
334 label_puntos = gtk_label_new("");
335 gtk_table_attach(GTK_TABLE(table_puntos), label_puntos, 0, 1, 0, 1,
336 (GtkAttachOptions)(GTK_FILL),
337 (GtkAttachOptions)(0), 0, 0);
339 // Agrega etiqueta de Centro.
340 label_centro = gtk_label_new("Centro");
341 gtk_table_attach(GTK_TABLE(table_puntos), label_centro, 0, 1, 1, 2,
342 (GtkAttachOptions)(GTK_FILL),
343 (GtkAttachOptions)(0), 0, 0);
345 // Agrega etiqueta de Inicio.
346 label_inicio = gtk_label_new("Inicio");
347 gtk_table_attach(GTK_TABLE(table_puntos), label_inicio, 0, 1, 2, 3,
348 (GtkAttachOptions)(GTK_FILL),
349 (GtkAttachOptions)(0), 0, 0);
351 // Agrega etiqueta de Fin.
352 label_fin = gtk_label_new("Fin");
353 gtk_table_attach(GTK_TABLE(table_puntos), label_fin, 0, 1, 3, 4,
354 (GtkAttachOptions)(GTK_FILL),
355 (GtkAttachOptions)(0), 0, 0);
357 // Agrega etiqueta de X.
358 label_x = gtk_label_new("X");
359 gtk_table_attach(GTK_TABLE(table_puntos), label_x, 1, 2, 0, 1,
360 (GtkAttachOptions)(0),
361 (GtkAttachOptions)(0), 0, 0);
363 // Agrega etiqueta de Y.
364 label_y = gtk_label_new("Y");
365 gtk_table_attach(GTK_TABLE(table_puntos), label_y, 2, 3, 0, 1,
366 (GtkAttachOptions)(GTK_EXPAND),
367 (GtkAttachOptions)(0), 0, 0);
369 // Crea botón con ajuste para la coordenada X del Centro.
370 spinbutton_centro_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
371 spinbutton_centro_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_centro_x_adj), 1, 0);
372 gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_centro_x, 1, 2, 1, 2,
373 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
374 (GtkAttachOptions)(0), 0, 0);
376 // Crea botón con ajuste para la coordenada Y del Centro.
377 spinbutton_centro_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
378 spinbutton_centro_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_centro_y_adj), 1, 0);
379 gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_centro_y, 2, 3, 1, 2,
380 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
381 (GtkAttachOptions)(0), 0, 0);
383 // Crea botón con ajuste para la coordenada X del Inicio.
384 spinbutton_inicio_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
385 spinbutton_inicio_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_inicio_x_adj), 1, 0);
386 gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_inicio_x, 1, 2, 2, 3,
387 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
388 (GtkAttachOptions)(0), 0, 0);
390 // Crea botón con ajuste para la coordenada Y del Inicio.
391 spinbutton_inicio_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
392 spinbutton_inicio_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_inicio_y_adj), 1, 0);
393 gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_inicio_y, 2, 3, 2, 3,
394 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
395 (GtkAttachOptions)(0), 0, 0);
397 // Crea botón con ajuste para la coordenada X del Fin.
398 spinbutton_fin_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
399 spinbutton_fin_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_fin_x_adj), 1, 0);
400 gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_fin_x, 1, 2, 3, 4,
401 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
402 (GtkAttachOptions)(0), 0, 0);
404 // Crea botón con ajuste para la coordenada Y del Fin.
405 spinbutton_fin_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
406 spinbutton_fin_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_fin_y_adj), 1, 0);
407 gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_fin_y, 2, 3, 3, 4,
408 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
409 (GtkAttachOptions)(0), 0, 0);
411 // Se crea una tabla de 3x2 para poner las entradas que faltan (Alto, Ancho
412 // y Radio) con sus etiquetas.
413 table_otros = gtk_table_new(3, 2, FALSE);
414 gtk_box_pack_start(GTK_BOX(vbox_otros), table_otros, FALSE, FALSE, 0);
415 gtk_table_set_col_spacings(GTK_TABLE(table_otros), 2);
417 // Agrega etiqueta de Alto.
418 label_alto = gtk_label_new("Alto");
419 gtk_table_attach(GTK_TABLE(table_otros), label_alto, 0, 1, 0, 1,
420 (GtkAttachOptions)(GTK_FILL),
421 (GtkAttachOptions)(0), 0, 0);
423 // Agrega etiqueta de Ancho.
424 label_ancho = gtk_label_new("Ancho");
425 gtk_table_attach(GTK_TABLE(table_otros), label_ancho, 0, 1, 1, 2,
426 (GtkAttachOptions)(GTK_FILL),
427 (GtkAttachOptions)(0), 0, 0);
429 // Agrega etiqueta de Radio.
430 label_radio = gtk_label_new("Radio");
431 gtk_table_attach(GTK_TABLE(table_otros), label_radio, 0, 1, 2, 3,
432 (GtkAttachOptions)(GTK_FILL),
433 (GtkAttachOptions)(0), 0, 0);
435 // Agrega botón con ajuste para el Alto.
436 spinbutton_alto_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
437 spinbutton_alto = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_alto_adj), 1, 0);
438 gtk_table_attach(GTK_TABLE(table_otros), spinbutton_alto, 1, 2, 0, 1,
439 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
440 (GtkAttachOptions)(0), 0, 0);
441 // Lo desactiva ya que inicialmente está seleccionada la Línea.
442 gtk_widget_set_sensitive(spinbutton_alto, FALSE);
444 // Agrega botón con ajuste para el Ancho.
445 spinbutton_ancho_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
446 spinbutton_ancho = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_ancho_adj), 1, 0);
447 gtk_table_attach(GTK_TABLE(table_otros), spinbutton_ancho, 1, 2, 1, 2,
448 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
449 (GtkAttachOptions)(0), 0, 0);
450 // Lo desactiva ya que inicialmente está seleccionada la Línea.
451 gtk_widget_set_sensitive(spinbutton_ancho, FALSE);
453 // Agrega botón con ajuste para el Radio.
454 spinbutton_radio_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
455 spinbutton_radio = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_radio_adj), 1, 0);
456 gtk_table_attach(GTK_TABLE(table_otros), spinbutton_radio, 1, 2, 2, 3,
457 (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
458 (GtkAttachOptions)(0), 0, 0);
459 // Lo desactiva ya que inicialmente está seleccionada la Línea.
460 gtk_widget_set_sensitive(spinbutton_radio, FALSE);
462 ////////////////// ASIGNACION DE FUNCIONES CALLBACK ///////////////////////
464 // Conecta el evento (señal) delete_event para la ventana principal.
465 g_signal_connect((gpointer) window, "delete_event",
466 G_CALLBACK(on_window_delete_event), NULL);
467 // Conecta el evento (señal) expose para el área de dibujo.
468 g_signal_connect((gpointer) drawingarea, "expose_event",
469 G_CALLBACK(on_drawingarea_expose_event), &dibujo);
470 // Conecta el evento (señal) clicked del botón Borrar.
471 g_signal_connect((gpointer) button_limpiar, "clicked",
472 G_CALLBACK(on_button_borrar_clicked), &dibujo);
473 // Conecta el evento (señal) clicked del botón Actualizar.
474 g_signal_connect((gpointer) button_actualizar, "clicked",
475 G_CALLBACK(on_button_graficar_clicked), drawingarea);
476 // Conecta el evento (señal) clicked del botón Salir.
477 g_signal_connect((gpointer) button_salir, "clicked",
478 G_CALLBACK(on_button_salir_clicked), NULL);
479 // Conecta el evento (señal) clicked del botón Agregar.
480 g_signal_connect((gpointer) button_agregar, "clicked",
481 G_CALLBACK(on_button_agregar_clicked), this);
482 // Conecta el evento (señal) toggled del botón de selección Línea.
483 g_signal_connect((gpointer) radiobutton_linea, "toggled",
484 G_CALLBACK(on_radiobutton_linea_toggled), this);
485 // Conecta el evento (señal) toggled del botón de selección Cuadrado.
486 g_signal_connect((gpointer) radiobutton_cuadrado, "toggled",
487 G_CALLBACK(on_radiobutton_cuadrado_toggled), this);
488 // Conecta el evento (señal) toggled del botón de selección Rectángulo.
489 g_signal_connect((gpointer) radiobutton_rectangulo, "toggled",
490 G_CALLBACK(on_radiobutton_rectangulo_toggled), this);
491 // Conecta el evento (señal) toggled del botón de selección Círculo.
492 g_signal_connect((gpointer) radiobutton_circulo, "toggled",
493 G_CALLBACK(on_radiobutton_circulo_toggled), this);
495 // Muestrá la ventana principal y todos sus componentes.
496 gtk_widget_show_all(window);
499 TP5Window::~TP5Window(void) {
500 dibujo.borrar_todo();