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 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])) {
51 // No debería pasar nunca.
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.
60 GtkWidget *hbox_botones;
61 GtkWidget *frame_dibujo;
62 GtkWidget *label_dibujo;
63 GtkWidget *vbuttonbox_botones;
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;
81 GtkWidget *label_puntos;
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;
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");
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.
110 FALSE, // No se distribuye homogeneamente.
112 gtk_container_add(GTK_CONTAINER(window), vbox);
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);
119 // Indica si se expanda cuando se cambia el <---' | |
120 // tamaño de la ventana. | |
122 // Indica que se debe rellenar toda el área <---------' V
123 // expandida con el widget que contiene. Espaciado
125 // Crea un marco con una leyenda para indicar que dentro está el área de
127 frame_dibujo = gtk_frame_new(NULL);
128 gtk_box_pack_start(GTK_BOX(hbox_botones), frame_dibujo, TRUE, TRUE, 0);
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);
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
140 gtk_widget_set_size_request(drawingarea, 200, 200);
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);
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);
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);
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);
161 hbox = gtk_hbox_new(FALSE, 0);
162 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
164 frame_figura = gtk_frame_new(NULL);
165 gtk_box_pack_start(GTK_BOX(hbox), frame_figura, FALSE, FALSE, 0);
167 vbox_figura = gtk_vbox_new(FALSE, 0);
168 gtk_container_add(GTK_CONTAINER(frame_figura), vbox_figura);
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);
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));
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));
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));
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);
195 vbox_comun = gtk_vbox_new(FALSE, 0);
196 gtk_box_pack_start(GTK_BOX(hbox), vbox_comun, TRUE, TRUE, 0);
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);
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);
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);
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);
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);
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]);
242 gtk_combo_set_popdown_strings(GTK_COMBO(combo_color), combo_color_items);
243 g_list_free(combo_color_items);
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]);
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);
256 button_agregar = gtk_button_new_from_stock("gtk-add");
257 gtk_box_pack_start(GTK_BOX(vbox_comun), button_agregar, FALSE, FALSE, 0);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
389 g_signal_connect((gpointer) window, "delete_event",
390 G_CALLBACK(on_window_delete_event),
392 g_signal_connect((gpointer) drawingarea, "expose_event",
393 G_CALLBACK(on_drawingarea_expose_event),
395 g_signal_connect((gpointer) button_limpiar, "clicked",
396 G_CALLBACK(on_button_borrar_clicked),
398 g_signal_connect((gpointer) button_actualizar, "clicked",
399 G_CALLBACK(on_button_graficar_clicked),
401 g_signal_connect((gpointer) button_salir, "clicked",
402 G_CALLBACK(on_button_salir_clicked),
404 g_signal_connect((gpointer) button_agregar, "clicked",
405 G_CALLBACK(on_button_agregar_clicked),
407 g_signal_connect((gpointer) radiobutton_linea, "toggled",
408 G_CALLBACK(on_radiobutton_linea_toggled),
410 g_signal_connect((gpointer) radiobutton_cuadrado, "toggled",
411 G_CALLBACK(on_radiobutton_cuadrado_toggled),
413 g_signal_connect((gpointer) radiobutton_rectangulo, "toggled",
414 G_CALLBACK(on_radiobutton_rectangulo_toggled),
416 g_signal_connect((gpointer) radiobutton_circulo, "toggled",
417 G_CALLBACK(on_radiobutton_circulo_toggled),
420 // Muestro la ventana principal y todos sus componentes.
421 gtk_widget_show_all(window);
424 TP5Window::~TP5Window(void) {
425 dibujo.borrar_todo();