]> git.llucax.com Git - z.facultad/75.42/figuras.git/blob - callbacks.cpp
b0524cae038439ceaf8b91a45e2988f8513c60d1
[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 = new Circulo(1, 1, Punto(50, 50), "Lala", 50);
74     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(win->radiobutton_linea))) {
75         figura = new Linea(
76             win->get_color(),
77             gtk_spin_button_get_value_as_int(
78                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),
79             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),
80                 GTK_SPIN_BUTTON(win->spinbutton_centro_y)),
81             gtk_entry_get_text(GTK_ENTRY(win->entry_nombre)),
82             Punto(GTK_SPIN_BUTTON(win->spinbutton_inicio_x),
83                 GTK_SPIN_BUTTON(win->spinbutton_inicio_y)),
84             Punto(GTK_SPIN_BUTTON(win->spinbutton_fin_x),
85                 GTK_SPIN_BUTTON(win->spinbutton_fin_y))
86         );
87     } else if (gtk_toggle_button_get_active(
88                 GTK_TOGGLE_BUTTON(win->radiobutton_cuadrado))) {
89         figura = new Cuadrado(
90             win->get_color(),
91             gtk_spin_button_get_value_as_int(
92                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),
93             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),
94                 GTK_SPIN_BUTTON(win->spinbutton_centro_y)),
95             gtk_entry_get_text(GTK_ENTRY(win->entry_nombre)),
96             gtk_spin_button_get_value_as_int(
97                 GTK_SPIN_BUTTON(win->spinbutton_alto))
98         );
99     } else if (gtk_toggle_button_get_active(
100                 GTK_TOGGLE_BUTTON(win->radiobutton_rectangulo))) {
101         figura = new Rectangulo(
102             win->get_color(),
103             gtk_spin_button_get_value_as_int(
104                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),
105             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),
106                 GTK_SPIN_BUTTON(win->spinbutton_centro_y)),
107             gtk_entry_get_text(GTK_ENTRY(win->entry_nombre)),
108             gtk_spin_button_get_value_as_int(
109                 GTK_SPIN_BUTTON(win->spinbutton_alto)),
110             gtk_spin_button_get_value_as_int(
111                 GTK_SPIN_BUTTON(win->spinbutton_ancho))
112         );
113     } else {
114         figura = new Circulo(
115             win->get_color(),
116             gtk_spin_button_get_value_as_int(
117                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),
118             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),
119                 GTK_SPIN_BUTTON(win->spinbutton_centro_y)),
120             gtk_entry_get_text(GTK_ENTRY(win->entry_nombre)),
121             gtk_spin_button_get_value_as_int(
122                 GTK_SPIN_BUTTON(win->spinbutton_radio))
123         );
124     }
125     // Agrego la figura nueva al dibujo.
126     win->dibujo.agregar_figura(figura);
127     // Indico que se debe redibujar para que se vean los cambios.
128     gtk_widget_queue_draw(GTK_WIDGET(win->drawingarea));
129 }
130
131 gboolean on_window_delete_event(GtkWidget* widget, GdkEvent* event,
132         gpointer user_data) {
133 #ifdef DEBUG
134     std::cerr << "En delete_event." << std::endl;
135 #endif
136     // Termina el loop principal.
137     gtk_main_quit();
138     // Al devolver FALSE se indica que se debe ocultar la ventana FIXME.
139     return FALSE;
140 }
141
142 void on_radiobutton_linea_toggled(GtkToggleButton* togglebutton,
143         gpointer user_data) {
144 #ifdef DEBUG
145     std::cerr << "En linea event." << std::endl;
146 #endif
147     // TODO
148     TP5Window* win = static_cast<TP5Window*>(user_data);
149     gtk_widget_set_sensitive(win->spinbutton_inicio_x, true);
150     gtk_widget_set_sensitive(win->spinbutton_inicio_y, true);
151     gtk_widget_set_sensitive(win->spinbutton_fin_x, true);
152     gtk_widget_set_sensitive(win->spinbutton_fin_y, true);
153     gtk_widget_set_sensitive(win->spinbutton_alto, false);
154     gtk_widget_set_sensitive(win->spinbutton_ancho, false);
155     gtk_widget_set_sensitive(win->spinbutton_radio, false);
156 }
157
158 void on_radiobutton_cuadrado_toggled(GtkToggleButton* togglebutton,
159         gpointer user_data) {
160 #ifdef DEBUG
161     std::cerr << "En cuadrado event." << std::endl;
162 #endif
163     // TODO
164     TP5Window* win = static_cast<TP5Window*>(user_data);
165     gtk_widget_set_sensitive(win->spinbutton_inicio_x, false);
166     gtk_widget_set_sensitive(win->spinbutton_inicio_y, false);
167     gtk_widget_set_sensitive(win->spinbutton_fin_x, false);
168     gtk_widget_set_sensitive(win->spinbutton_fin_y, false);
169     gtk_widget_set_sensitive(win->spinbutton_alto, true);
170     gtk_widget_set_sensitive(win->spinbutton_ancho, false);
171     gtk_widget_set_sensitive(win->spinbutton_radio, false);
172 }
173
174 void on_radiobutton_rectangulo_toggled(GtkToggleButton* togglebutton,
175         gpointer user_data) {
176 #ifdef DEBUG
177     std::cerr << "En rectangulo event." << std::endl;
178 #endif
179     // TODO
180     TP5Window* win = static_cast<TP5Window*>(user_data);
181     gtk_widget_set_sensitive(win->spinbutton_inicio_x, false);
182     gtk_widget_set_sensitive(win->spinbutton_inicio_y, false);
183     gtk_widget_set_sensitive(win->spinbutton_fin_x, false);
184     gtk_widget_set_sensitive(win->spinbutton_fin_y, false);
185     gtk_widget_set_sensitive(win->spinbutton_alto, true);
186     gtk_widget_set_sensitive(win->spinbutton_ancho, true);
187     gtk_widget_set_sensitive(win->spinbutton_radio, false);
188 }
189
190 void on_radiobutton_circulo_toggled(GtkToggleButton* togglebutton,
191         gpointer user_data) {
192 #ifdef DEBUG
193     std::cerr << "En circulo event." << std::endl;
194 #endif
195     // TODO
196     TP5Window* win = static_cast<TP5Window*>(user_data);
197     gtk_widget_set_sensitive(win->spinbutton_inicio_x, false);
198     gtk_widget_set_sensitive(win->spinbutton_inicio_y, false);
199     gtk_widget_set_sensitive(win->spinbutton_fin_x, false);
200     gtk_widget_set_sensitive(win->spinbutton_fin_y, false);
201     gtk_widget_set_sensitive(win->spinbutton_alto, false);
202     gtk_widget_set_sensitive(win->spinbutton_ancho, false);
203     gtk_widget_set_sensitive(win->spinbutton_radio, true);
204 }
205