]> git.llucax.com Git - z.facultad/75.42/figuras.git/blob - callbacks.cpp
5f51614efe7a0b39b2b90c5ae6ea1fe36c5c8e54
[z.facultad/75.42/figuras.git] / callbacks.cpp
1 /* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80:
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:24:12 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "dibujo.h"
18 #include "linea.h"
19 #include "cuadrado.h"
20 #include "rectangulo.h"
21 #include "circulo.h"
22 #include "callbacks.h"
23 #include "tp5window.h"
24 #include <gtk/gtk.h>
25
26 #ifdef DEBUG
27 #   include <iostream>
28 #endif
29
30 gboolean on_drawingarea_expose_event(GtkWidget* widget, GdkEventExpose* event,
31         gpointer user_data) {
32 #ifdef DEBUG
33     std::cerr << "En expose_event." << std::endl;
34 #endif
35     // Dibujo.
36     static_cast<Dibujo*>(user_data)->dibujar(widget);
37     return FALSE;
38 }
39
40 void on_button_borrar_clicked(GtkButton* button, gpointer user_data) {
41 #ifdef DEBUG
42     std::cerr << "En borrar event." << std::endl;
43 #endif
44     // Borro dibujo.
45     static_cast<Dibujo*>(user_data)->borrar_todo();
46 }
47
48 void on_button_graficar_clicked(GtkButton* button, gpointer user_data) {
49 #ifdef DEBUG
50     std::cerr << "En graficar event." << std::endl;
51 #endif
52     // Indica que hay que redibujar el widget user_data, que será el área de
53     // dibujo.
54     gtk_widget_queue_draw(GTK_WIDGET(user_data));
55 }
56
57 void on_button_salir_clicked(GtkButton* button, gpointer user_data) {
58 #ifdef DEBUG
59     std::cerr << "En salir event." << std::endl;
60 #endif
61     // Termina el loop principal.
62     gtk_main_quit();
63 }
64
65 void on_button_agregar_clicked(GtkButton* button, gpointer user_data) {
66 #ifdef DEBUG
67     std::cerr << "En agregar event." << std::endl;
68 #endif
69     TP5Window* win = static_cast<TP5Window*>(user_data);
70 #ifdef DEBUG
71     std::cerr << "Color: " << win->get_color() << std::endl;
72 #endif
73     Figura* figura;
74     // Si se agrega una línea.
75     if (gtk_toggle_button_get_active(
76                 GTK_TOGGLE_BUTTON(win->radiobutton_linea))) {
77         // Creo la nueva línea con los parámetros ingresados por el usuario.
78         figura = new Linea(
79             win->get_color(),                                 // Color
80             gtk_spin_button_get_value_as_int(
81                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),     // Grosor
82             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),  // Centro X
83                 GTK_SPIN_BUTTON(win->spinbutton_centro_y)),   // Centro Y
84             gtk_entry_get_text(GTK_ENTRY(win->entry_nombre)), // Nombre
85             Punto(GTK_SPIN_BUTTON(win->spinbutton_inicio_x),  // Inicio X
86                 GTK_SPIN_BUTTON(win->spinbutton_inicio_y)),   // Inicio Y
87             Punto(GTK_SPIN_BUTTON(win->spinbutton_fin_x),     // Fin X
88                 GTK_SPIN_BUTTON(win->spinbutton_fin_y))       // Fin Y
89         );
90     // Si se agrega un cuadrado.
91     } else if (gtk_toggle_button_get_active(
92                 GTK_TOGGLE_BUTTON(win->radiobutton_cuadrado))) {
93         // Creo la figura con los párametros ingresados por el usuario.
94         figura = new Cuadrado(
95             win->get_color(),                                 // Color   
96             gtk_spin_button_get_value_as_int(                            
97                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),     // Grosor  
98             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),  // Centro X
99                 GTK_SPIN_BUTTON(win->spinbutton_centro_y)),   // Centro Y
100             gtk_entry_get_text(GTK_ENTRY(win->entry_nombre)), // Nombre  
101             gtk_spin_button_get_value_as_int(
102                 GTK_SPIN_BUTTON(win->spinbutton_alto))        // Lado.
103         );
104     // Si se agrega un rectángulo.
105     } else if (gtk_toggle_button_get_active(
106                 GTK_TOGGLE_BUTTON(win->radiobutton_rectangulo))) {
107         // Creo la figura con los párametros ingresados por el usuario.
108         figura = new Rectangulo(
109             win->get_color(),                                 // Color   
110             gtk_spin_button_get_value_as_int(                            
111                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),     // Grosor  
112             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),  // Centro X
113                 GTK_SPIN_BUTTON(win->spinbutton_centro_y)),   // Centro Y
114             gtk_entry_get_text(GTK_ENTRY(win->entry_nombre)), // Nombre  
115             gtk_spin_button_get_value_as_int(
116                 GTK_SPIN_BUTTON(win->spinbutton_alto)),       // Alto.
117             gtk_spin_button_get_value_as_int(
118                 GTK_SPIN_BUTTON(win->spinbutton_ancho))       // Ancho.
119         );
120     // Si no, se agrega un círculo.
121     } else {
122         // Creo la figura con los párametros ingresados por el usuario.
123         figura = new Circulo(
124             win->get_color(),                                 // Color   
125             gtk_spin_button_get_value_as_int(                            
126                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),     // Grosor  
127             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),  // Centro X
128                 GTK_SPIN_BUTTON(win->spinbutton_centro_y)),   // Centro Y
129             gtk_entry_get_text(GTK_ENTRY(win->entry_nombre)), // Nombre  
130             gtk_spin_button_get_value_as_int(
131                 GTK_SPIN_BUTTON(win->spinbutton_radio))       // Radio
132         );
133     }
134     // Agrego la figura nueva al dibujo.
135     win->dibujo.agregar_figura(figura);
136     // Indico que se debe redibujar para que se vean los cambios.
137     gtk_widget_queue_draw(GTK_WIDGET(win->drawingarea));
138 }
139
140 gboolean on_window_delete_event(GtkWidget* widget, GdkEvent* event,
141         gpointer user_data) {
142 #ifdef DEBUG
143     std::cerr << "En delete_event." << std::endl;
144 #endif
145     // Termina el loop principal.
146     gtk_main_quit();
147     // Al devolver FALSE se indica que se debe ocultar la ventana FIXME.
148     return FALSE;
149 }
150
151 void on_radiobutton_linea_toggled(GtkToggleButton* togglebutton,
152         gpointer user_data) {
153 #ifdef DEBUG
154     std::cerr << "En linea event." << std::endl;
155 #endif
156     // Activo y desactivos los campos necesarios.
157     TP5Window* win = static_cast<TP5Window*>(user_data);
158     gtk_widget_set_sensitive(win->spinbutton_inicio_x, TRUE);
159     gtk_widget_set_sensitive(win->spinbutton_inicio_y, TRUE);
160     gtk_widget_set_sensitive(win->spinbutton_fin_x, TRUE);
161     gtk_widget_set_sensitive(win->spinbutton_fin_y, TRUE);
162     gtk_widget_set_sensitive(win->spinbutton_alto, FALSE);
163     gtk_widget_set_sensitive(win->spinbutton_ancho, FALSE);
164     gtk_widget_set_sensitive(win->spinbutton_radio, FALSE);
165 }
166
167 void on_radiobutton_cuadrado_toggled(GtkToggleButton* togglebutton,
168         gpointer user_data) {
169 #ifdef DEBUG
170     std::cerr << "En cuadrado event." << std::endl;
171 #endif
172     // Activo y desactivos los campos necesarios.
173     TP5Window* win = static_cast<TP5Window*>(user_data);
174     gtk_widget_set_sensitive(win->spinbutton_inicio_x, FALSE);
175     gtk_widget_set_sensitive(win->spinbutton_inicio_y, FALSE);
176     gtk_widget_set_sensitive(win->spinbutton_fin_x, FALSE);
177     gtk_widget_set_sensitive(win->spinbutton_fin_y, FALSE);
178     gtk_widget_set_sensitive(win->spinbutton_alto, TRUE);
179     gtk_widget_set_sensitive(win->spinbutton_ancho, FALSE);
180     gtk_widget_set_sensitive(win->spinbutton_radio, FALSE);
181 }
182
183 void on_radiobutton_rectangulo_toggled(GtkToggleButton* togglebutton,
184         gpointer user_data) {
185 #ifdef DEBUG
186     std::cerr << "En rectangulo event." << std::endl;
187 #endif
188     // Activo y desactivos los campos necesarios.
189     TP5Window* win = static_cast<TP5Window*>(user_data);
190     gtk_widget_set_sensitive(win->spinbutton_inicio_x, FALSE);
191     gtk_widget_set_sensitive(win->spinbutton_inicio_y, FALSE);
192     gtk_widget_set_sensitive(win->spinbutton_fin_x, FALSE);
193     gtk_widget_set_sensitive(win->spinbutton_fin_y, FALSE);
194     gtk_widget_set_sensitive(win->spinbutton_alto, TRUE);
195     gtk_widget_set_sensitive(win->spinbutton_ancho, TRUE);
196     gtk_widget_set_sensitive(win->spinbutton_radio, FALSE);
197 }
198
199 void on_radiobutton_circulo_toggled(GtkToggleButton* togglebutton,
200         gpointer user_data) {
201 #ifdef DEBUG
202     std::cerr << "En circulo event." << std::endl;
203 #endif
204     // Activo y desactivos los campos necesarios.
205     TP5Window* win = static_cast<TP5Window*>(user_data);
206     gtk_widget_set_sensitive(win->spinbutton_inicio_x, FALSE);
207     gtk_widget_set_sensitive(win->spinbutton_inicio_y, FALSE);
208     gtk_widget_set_sensitive(win->spinbutton_fin_x, FALSE);
209     gtk_widget_set_sensitive(win->spinbutton_fin_y, FALSE);
210     gtk_widget_set_sensitive(win->spinbutton_alto, FALSE);
211     gtk_widget_set_sensitive(win->spinbutton_ancho, FALSE);
212     gtk_widget_set_sensitive(win->spinbutton_radio, TRUE);
213 }
214