]> git.llucax.com Git - z.facultad/75.42/figuras.git/commitdiff
Técnicamente se termina el TP. Ya andan los colores y todo. Falta documentación.
authorLeandro Lucarella <llucax@gmail.com>
Sun, 5 Oct 2003 02:23:59 +0000 (02:23 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 5 Oct 2003 02:23:59 +0000 (02:23 +0000)
Makefile
callbacks.cpp
figura.cpp
figura.h
interface.cpp [deleted file]
tp5.cpp
tp5window.cpp [new file with mode: 0644]
tp5window.h [moved from interface.h with 84% similarity]

index eb6c427e7ae0db2ccea46cc4fff7a0b0a9094ba8..2430b97c6015b93cd757eb5adf15af1e96a7f0ed 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,8 +16,8 @@
 # Opciones para el compilador.
 CXXFLAGS=`pkg-config --cflags gtk+-2.0`
 #CXXFLAGS+=-ansi -pedantic -Wall -O3
-CXXFLAGS+=-ansi -pedantic -Wall -g3
-#CXXFLAGS+=-ansi -pedantic -Wall -g3 -DDEBUG
+#CXXFLAGS+=-ansi -pedantic -Wall -g3
+CXXFLAGS+=-ansi -pedantic -Wall -g3 -DDEBUG
 
 LDFLAGS=`pkg-config --libs gtk+-2.0`
 
@@ -34,26 +34,26 @@ all: $(TARGETS)
 tests: $(TESTS)
 
 tp5: dllist.o figura.o rectangulo.o cuadrado.o linea.o circulo.o dibujo.o \
-       callbacks.o interface.o
+       callbacks.o tp5window.o
 
 dllist.o: dllist.cpp dllist.h
 
 figura.o: figura.cpp figura.h punto.h
 
-linea.o: figura.o linea.cpp linea.h
+linea.o: figura.h linea.cpp linea.h
 
-circulo.o: figura.o circulo.cpp circulo.h
+circulo.o: figura.h circulo.cpp circulo.h
 
-rectangulo.o: figura.o rectangulo.cpp rectangulo.h
+rectangulo.o: figura.h rectangulo.cpp rectangulo.h
 
-cuadrado.o: rectangulo.o cuadrado.cpp cuadrado.h
+cuadrado.o: rectangulo.h cuadrado.cpp cuadrado.h
 
-dibujo.o: dllist.o figura.o dibujo.cpp dibujo.h
+dibujo.o: dllist.h figura.h dibujo.cpp dibujo.h
 
-callbacks.o: figura.o linea.o circulo.o rectangulo.o cuadrado.o dibujo.o \
-       callbacks.cpp callbacks.h
+callbacks.o: figura.h linea.o circulo.h rectangulo.h cuadrado.h dibujo.h \
+       tp5window.h callbacks.cpp callbacks.h
 
-interface.o: dibujo.o interface.cpp interface.h
+tp5window.o: dibujo.h callbacks.h tp5window.cpp tp5window.h
 
 
 # Regla para borrar.
@@ -65,7 +65,7 @@ clean:
 FUENTES=dllist.h dllist.cpp punto.h figura.h figura.cpp rectangulo.h \
        rectangulo.cpp cuadrado.h cuadrado.cpp linea.h linea.cpp circulo.h \
        circulo.cpp dibujo.h dibujo.cpp callbacks.h callbacks.cpp \
-       interface.h interface.cpp tp5.cpp
+       tp5window.h tp5window.cpp tp5.cpp
 code.ps: $(FUENTES)
        @enscript -j -Ecpp -U2 -C --fancy-header=squeeze --color -pcode.ps \
        $(FUENTES)
index eced183bb5c71fcdc28c575df4a1f31aa822f658..b0524cae038439ceaf8b91a45e2988f8513c60d1 100644 (file)
@@ -20,7 +20,7 @@
 #include "rectangulo.h"
 #include "circulo.h"
 #include "callbacks.h"
-#include "interface.h"
+#include "tp5window.h"
 #include <gtk/gtk.h>
 
 #ifdef DEBUG
@@ -66,14 +66,14 @@ void on_button_agregar_clicked(GtkButton* button, gpointer user_data) {
 #ifdef DEBUG
     std::cerr << "En agregar event." << std::endl;
 #endif
-    // FIXME: hacer una estructura para guardar todos los punteros a los datos
-    // que necesito: radio buttons, y todas las entradas, más la lista enlazada,
-    // más, tal vez, el drawingarea.
     TP5Window* win = static_cast<TP5Window*>(user_data);
+#ifdef DEBUG
+    std::cerr << "Color: " << win->get_color() << std::endl;
+#endif
     Figura* figura = new Circulo(1, 1, Punto(50, 50), "Lala", 50);
     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(win->radiobutton_linea))) {
         figura = new Linea(
-            1, // Color FIXME
+            win->get_color(),
             gtk_spin_button_get_value_as_int(
                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),
             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),
@@ -87,7 +87,7 @@ void on_button_agregar_clicked(GtkButton* button, gpointer user_data) {
     } else if (gtk_toggle_button_get_active(
                 GTK_TOGGLE_BUTTON(win->radiobutton_cuadrado))) {
         figura = new Cuadrado(
-            1, // Color FIXME
+            win->get_color(),
             gtk_spin_button_get_value_as_int(
                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),
             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),
@@ -99,7 +99,7 @@ void on_button_agregar_clicked(GtkButton* button, gpointer user_data) {
     } else if (gtk_toggle_button_get_active(
                 GTK_TOGGLE_BUTTON(win->radiobutton_rectangulo))) {
         figura = new Rectangulo(
-            1, // Color FIXME
+            win->get_color(),
             gtk_spin_button_get_value_as_int(
                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),
             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),
@@ -112,7 +112,7 @@ void on_button_agregar_clicked(GtkButton* button, gpointer user_data) {
         );
     } else {
         figura = new Circulo(
-            1, // Color FIXME
+            win->get_color(),
             gtk_spin_button_get_value_as_int(
                 GTK_SPIN_BUTTON(win->spinbutton_grosor)),
             Punto(GTK_SPIN_BUTTON(win->spinbutton_centro_x),
@@ -122,7 +122,10 @@ void on_button_agregar_clicked(GtkButton* button, gpointer user_data) {
                 GTK_SPIN_BUTTON(win->spinbutton_radio))
         );
     }
+    // Agrego la figura nueva al dibujo.
     win->dibujo.agregar_figura(figura);
+    // Indico que se debe redibujar para que se vean los cambios.
+    gtk_widget_queue_draw(GTK_WIDGET(win->drawingarea));
 }
 
 gboolean on_window_delete_event(GtkWidget* widget, GdkEvent* event,
index 5ce3dec7ec0b6289a67d1c8335af1e63a37971f5..e320b146a3ade0f83da4c132a4bdb8bc4fa2f6bf 100644 (file)
  */
 
 #include "figura.h"
-#include <cstring>
 
 #ifdef DEBUG
 #   include <iostream>
 #endif
 
+GdkColor* Figura::traducir_color(GdkColor* c) const {
+    // Elimino el color anterior.
+    c->pixel = 0;
+    // Tiene el primer bit en 1.
+    if (color & 1) {
+        // Entonces activo los bits 1,2,3,4,5,6,7 del color de 24 bits.
+        // (quedaría con la componente azul en 0x7F)
+        c->pixel |= 0x7F;
+    }
+    // Tiene el segundo bit en 1.
+    if (color & (1 << 1)) {
+        // Entonces activo los bits 9,10,11,12,13,14,15 del color de 24 bits.
+        // (quedaría con la componente verde en 0x7F)
+        c->pixel |= 0x7F << 8;
+    }
+    // Tiene el tercer bit en 1.
+    if (color & (1 << 2)) {
+        // Entonces activo los bits 17,18,19,20,21,22,23 del color de 24 bits.
+        // (quedaría con la componente roja en 0x7F)
+        c->pixel |= 0x7F << 16;
+    }
+    // Tiene el cuarto bit en 1.
+    if (color & (1 << 3)) {
+        // Si tiene alguno de los bits menos significativos (tiene pigmento).
+        if (color & 7) {
+            c->pixel =
+                // Desplazo los bits del color de 24 bits 1 lugar a la
+                // izquierda (si era, por ejemplo 0111 1111, quedaría
+                // 1111 1110).
+                (c->pixel << 1)
+                // Al resultado le aplico una máscara para que quede 'prendido'
+                // el bit más significativo de los colores activados
+                // anteriormente (y de esta manera darles el doble de "luz").
+                & 0x808080
+                // Finalmente, prendo los bits resultantes en el color de 24 bits.
+                | c->pixel;
+        // Si no tiene pigmento no lo dejo negro porque negro ya es cuando están
+        // todos los bits apagados.
+        } else {
+            // Asigno un gris claro, combinación que no se da de otra manera.
+            c->pixel = 0xF0F0F0;
+        }
+    }
+#ifdef DEBUG
+    std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
+        << "." << std::endl;
+#endif
+    return c;
+}
+
 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
         const char* nombre): centro(centro) {
+    // Cheque límites del color.
     if (color > 15) {
         this->color = 15;
     } else if (color < 0) {
@@ -30,6 +80,7 @@ Figura::Figura(size_t color, size_t grosor, const Punto& centro,
     } else {
         this->color = color;
     }
+    // Chequea límites del grosor.
     if (grosor > 10) {
         this->grosor = 10;
     } else if (grosor < 1) {
@@ -50,12 +101,15 @@ Figura::~Figura(void) {
 }
 
 void Figura::set_gc(GdkGC* gc) const {
+    // Asigna propiedades del trazo.
     gdk_gc_set_line_attributes(
-            gc,
-            grosor,
-            GDK_LINE_SOLID,
-            GDK_CAP_ROUND,
-            GDK_JOIN_ROUND);
-    //gdk_gc_set_foreground(gc, c);
+            gc, // Contexto gráfico al cual asignar propiedades.
+            grosor, // Grosor del trazo.
+            GDK_LINE_SOLID, // Tipo de línea (sólida en este caso).
+            GDK_CAP_ROUND, // Tipo de terminación (redondeada en este caso).
+            GDK_JOIN_ROUND); // Forma de unir trazos (también redondeado).
+    GdkColor c;
+    // Cambia el color del trazo.
+    gdk_gc_set_foreground(gc, traducir_color(&c));
 }
 
index 8e99a46f07aa8f3c1d31556fc3b9944e60c2428c..36579b4c2a79eae95649a90197fbd3cb586b0f4b 100644 (file)
--- a/figura.h
+++ b/figura.h
@@ -49,6 +49,17 @@ class Figura {
          */
         virtual void set_gc(GdkGC* gc) const;
 
+        /**
+         * Traduce los 4 bits de colores en 24 bits de colores.
+         * La traducción es simple. Los 3 bits menos significativos son
+         * usados como indicador del pigmento. El bit menos significativo
+         * indica la presencia de pigmento azul, el siguiente verde
+         * y el siguiente rojo. El bit más significativo representa
+         * la saturación del color, si está activado, el color será
+         * más saturado.
+         */
+        GdkColor* traducir_color(GdkColor* c) const;
+
     public:
 
         /**
diff --git a/interface.cpp b/interface.cpp
deleted file mode 100644 (file)
index 26d0a52..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-/* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80 fileencoding=utf-8:
- *
- * Taller de Programación (75.42).
- *
- * Ejercicio Número 5:
- * Graficador de figuras.
- *
- * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
- * Puede copiar, modificar y distribuir este programa bajo los términos de
- * la licencia GPL (http://www.gnu.org/).
- *
- * Creado: mié oct  1 23:31:40 ART 2003
- *
- * $Id$
- */
-
-#include "callbacks.h"
-#include "interface.h"
-#include "dibujo.h"
-
-//#include <sys/types.h>
-//#include <sys/stat.h>
-//#include <unistd.h>
-//#include <string.h>
-//#include <stdio.h>
-
-//#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-TP5Window::TP5Window(void) {
-    GtkWidget *vbox;
-    GtkWidget *hbox_botones;
-    GtkWidget *frame_dibujo;
-    GtkWidget *label_dibujo;
-    GtkWidget *vbuttonbox_botones;
-    GtkWidget *hbox;
-    GtkWidget *frame_figura;
-    GtkWidget *vbox_figura;
-    GSList    *radiobutton_group = NULL;
-    GtkWidget *label_figura;
-    GtkWidget *vbox_comun;
-    GtkWidget *table_comun;
-    GtkWidget *label_nombre;
-    GtkWidget *label_color;
-    GtkWidget *label_grosor;
-    GList     *combo_color_items = NULL;
-    GtkWidget *combo_entry;
-    GtkObject *spinbutton_grosor_adj;
-    GtkWidget *vbox_otros;
-    GtkWidget *table_puntos;
-    GtkWidget *label_centro;
-    GtkWidget *label_inicio;
-    GtkWidget *label_fin;
-    GtkWidget *label_puntos;
-    GtkWidget *label_x;
-    GtkWidget *label_y;
-    GtkObject *spinbutton_centro_x_adj;
-    GtkObject *spinbutton_centro_y_adj;
-    GtkObject *spinbutton_inicio_x_adj;
-    GtkObject *spinbutton_inicio_y_adj;
-    GtkObject *spinbutton_fin_x_adj;
-    GtkObject *spinbutton_fin_y_adj;
-    GtkWidget *table_otros;
-    GtkWidget *label_alto;
-    GtkWidget *label_ancho;
-    GtkWidget *label_radio;
-    GtkObject *spinbutton_alto_adj;
-    GtkObject *spinbutton_ancho_adj;
-    GtkObject *spinbutton_radio_adj;
-
-    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-    gtk_container_set_border_width (GTK_CONTAINER (window), 5);
-    gtk_window_set_title (GTK_WINDOW (window), "Trabajo Práctico V");
-
-    vbox = gtk_vbox_new (FALSE, 0);
-    gtk_container_add (GTK_CONTAINER (window), vbox);
-
-    hbox_botones = gtk_hbox_new (FALSE, 5);
-    gtk_box_pack_start (GTK_BOX (vbox), hbox_botones, TRUE, TRUE, 0);
-
-    frame_dibujo = gtk_frame_new (NULL);
-    gtk_box_pack_start (GTK_BOX (hbox_botones), frame_dibujo, TRUE, TRUE, 0);
-
-    drawingarea = gtk_drawing_area_new ();
-    gtk_container_add (GTK_CONTAINER (frame_dibujo), drawingarea);
-    gtk_widget_set_size_request (drawingarea, 200, 200);
-
-    label_dibujo = gtk_label_new ("Dibujo");
-    gtk_frame_set_label_widget (GTK_FRAME (frame_dibujo), label_dibujo);
-    gtk_label_set_justify (GTK_LABEL (label_dibujo), GTK_JUSTIFY_LEFT);
-
-    vbuttonbox_botones = gtk_vbutton_box_new ();
-    gtk_box_pack_start (GTK_BOX (hbox_botones), vbuttonbox_botones, FALSE, TRUE, 0);
-    gtk_container_set_border_width (GTK_CONTAINER (vbuttonbox_botones), 5);
-    gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox_botones), GTK_BUTTONBOX_SPREAD);
-
-    button_limpiar = gtk_button_new_from_stock ("gtk-clear");
-    gtk_container_add (GTK_CONTAINER (vbuttonbox_botones), button_limpiar);
-    GTK_WIDGET_SET_FLAGS (button_limpiar, GTK_CAN_DEFAULT);
-
-    button_actualizar = gtk_button_new_from_stock ("gtk-refresh");
-    gtk_container_add (GTK_CONTAINER (vbuttonbox_botones), button_actualizar);
-    GTK_WIDGET_SET_FLAGS (button_actualizar, GTK_CAN_DEFAULT);
-
-    button_salir = gtk_button_new_from_stock ("gtk-quit");
-    gtk_container_add (GTK_CONTAINER (vbuttonbox_botones), button_salir);
-    GTK_WIDGET_SET_FLAGS (button_salir, GTK_CAN_DEFAULT);
-
-    hbox = gtk_hbox_new (FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
-
-    frame_figura = gtk_frame_new (NULL);
-    gtk_box_pack_start (GTK_BOX (hbox), frame_figura, FALSE, FALSE, 0);
-
-    vbox_figura = gtk_vbox_new (FALSE, 0);
-    gtk_container_add (GTK_CONTAINER (frame_figura), vbox_figura);
-
-    radiobutton_linea = gtk_radio_button_new_with_mnemonic (NULL, "Línea");
-    gtk_box_pack_start (GTK_BOX (vbox_figura), radiobutton_linea, FALSE, FALSE, 0);
-    gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton_linea), radiobutton_group);
-    radiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton_linea));
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radiobutton_linea), TRUE);
-
-    radiobutton_cuadrado = gtk_radio_button_new_with_mnemonic (NULL, "_Cuadrado");
-    gtk_box_pack_start (GTK_BOX (vbox_figura), radiobutton_cuadrado, FALSE, FALSE, 0);
-    gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton_cuadrado), radiobutton_group);
-    radiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton_cuadrado));
-
-    radiobutton_rectangulo = gtk_radio_button_new_with_mnemonic (NULL, "_Rectángulo");
-    gtk_box_pack_start (GTK_BOX (vbox_figura), radiobutton_rectangulo, FALSE, FALSE, 0);
-    gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton_rectangulo), radiobutton_group);
-    radiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton_rectangulo));
-
-    radiobutton_circulo = gtk_radio_button_new_with_mnemonic (NULL, "Círc_ulo");
-    gtk_box_pack_start (GTK_BOX (vbox_figura), radiobutton_circulo, FALSE, FALSE, 0);
-    gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton_circulo), radiobutton_group);
-    radiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton_circulo));
-
-    label_figura = gtk_label_new ("Figura");
-    gtk_frame_set_label_widget (GTK_FRAME (frame_figura), label_figura);
-    gtk_label_set_justify (GTK_LABEL (label_figura), GTK_JUSTIFY_LEFT);
-
-    vbox_comun = gtk_vbox_new (FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (hbox), vbox_comun, TRUE, TRUE, 0);
-
-    table_comun = gtk_table_new (3, 2, FALSE);
-    gtk_box_pack_start (GTK_BOX (vbox_comun), table_comun, TRUE, TRUE, 0);
-    gtk_container_set_border_width (GTK_CONTAINER (table_comun), 5);
-    gtk_table_set_row_spacings (GTK_TABLE (table_comun), 3);
-    gtk_table_set_col_spacings (GTK_TABLE (table_comun), 5);
-
-    label_nombre = gtk_label_new ("Nombre");
-    gtk_table_attach (GTK_TABLE (table_comun), label_nombre, 0, 1, 0, 1,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_nombre), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_nombre), 0, 0.5);
-
-    label_color = gtk_label_new ("Color");
-    gtk_table_attach (GTK_TABLE (table_comun), label_color, 0, 1, 1, 2,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_color), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_color), 0, 0.5);
-
-    label_grosor = gtk_label_new ("Grosor");
-    gtk_table_attach (GTK_TABLE (table_comun), label_grosor, 0, 1, 2, 3,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_grosor), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_grosor), 0, 0.5);
-
-    entry_nombre = gtk_entry_new ();
-    gtk_table_attach (GTK_TABLE (table_comun), entry_nombre, 1, 2, 0, 1,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (GTK_EXPAND), 0, 0);
-    gtk_widget_set_size_request (entry_nombre, 100, -1);
-
-    combo_color = gtk_combo_new ();
-    g_object_set_data (G_OBJECT (GTK_COMBO (combo_color)->popwin),
-            "GladeParentKey", combo_color);
-    gtk_table_attach (GTK_TABLE (table_comun), combo_color, 1, 2, 1, 2,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (GTK_EXPAND), 0, 0);
-    gtk_widget_set_size_request (combo_color, 150, -1);
-    gtk_combo_set_value_in_list (GTK_COMBO (combo_color), TRUE, FALSE);
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Negro");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Blanco");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Rojo");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Verde");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Azul");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Cian");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Magenta");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Amarillo");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Gris");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Rojo Oscuro");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Verde Oscuro");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Azul Oscuro");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Cian Oscuro");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Magenta Oscuro");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Amarillo Oscuro");
-    combo_color_items = g_list_append (combo_color_items, (gpointer) "Naranja");
-    gtk_combo_set_popdown_strings (GTK_COMBO (combo_color), combo_color_items);
-    g_list_free (combo_color_items);
-
-    combo_entry = GTK_COMBO (combo_color)->entry;
-    gtk_editable_set_editable (GTK_EDITABLE (combo_entry), FALSE);
-    gtk_entry_set_text (GTK_ENTRY (combo_entry), "Negro");
-
-    spinbutton_grosor_adj = gtk_adjustment_new (1, 1, 10, 1, 10, 10);
-    spinbutton_grosor = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_grosor_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_comun), spinbutton_grosor, 1, 2, 2, 3,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (GTK_EXPAND), 0, 0);
-    gtk_widget_set_size_request (spinbutton_grosor, 48, -1);
-
-    button_agregar = gtk_button_new_from_stock ("gtk-add");
-    gtk_box_pack_start (GTK_BOX (vbox_comun), button_agregar, FALSE, FALSE, 0);
-
-    vbox_otros = gtk_vbox_new (FALSE, 5);
-    gtk_box_pack_start (GTK_BOX (hbox), vbox_otros, FALSE, FALSE, 0);
-    gtk_container_set_border_width (GTK_CONTAINER (vbox_otros), 5);
-
-    table_puntos = gtk_table_new (4, 3, FALSE);
-    gtk_box_pack_start (GTK_BOX (vbox_otros), table_puntos, FALSE, FALSE, 0);
-    gtk_table_set_col_spacings (GTK_TABLE (table_puntos), 2);
-
-    label_centro = gtk_label_new ("Centro");
-    gtk_table_attach (GTK_TABLE (table_puntos), label_centro, 0, 1, 1, 2,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_centro), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_centro), 0, 0.5);
-
-    label_inicio = gtk_label_new ("Inicio");
-    gtk_table_attach (GTK_TABLE (table_puntos), label_inicio, 0, 1, 2, 3,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_inicio), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_inicio), 0, 0.5);
-
-    label_fin = gtk_label_new ("Fin");
-    gtk_table_attach (GTK_TABLE (table_puntos), label_fin, 0, 1, 3, 4,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_fin), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_fin), 0, 0.5);
-
-    label_puntos = gtk_label_new ("");
-    gtk_table_attach (GTK_TABLE (table_puntos), label_puntos, 0, 1, 0, 1,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_puntos), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_puntos), 0, 0.5);
-
-    label_x = gtk_label_new ("X");
-    gtk_table_attach (GTK_TABLE (table_puntos), label_x, 1, 2, 0, 1,
-            (GtkAttachOptions) (0),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_misc_set_alignment (GTK_MISC (label_x), 0, 0.5);
-
-    label_y = gtk_label_new ("Y");
-    gtk_table_attach (GTK_TABLE (table_puntos), label_y, 2, 3, 0, 1,
-            (GtkAttachOptions) (GTK_EXPAND),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_misc_set_alignment (GTK_MISC (label_y), 0, 0.5);
-
-    spinbutton_centro_x_adj = gtk_adjustment_new (0, 0, 1000, 1, 10, 10);
-    spinbutton_centro_x = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_centro_x_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_puntos), spinbutton_centro_x, 1, 2, 1, 2,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-
-    spinbutton_centro_y_adj = gtk_adjustment_new (0, 0, 1000, 1, 10, 10);
-    spinbutton_centro_y = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_centro_y_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_puntos), spinbutton_centro_y, 2, 3, 1, 2,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-
-    spinbutton_inicio_x_adj = gtk_adjustment_new (0, 0, 1000, 1, 10, 10);
-    spinbutton_inicio_x = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_inicio_x_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_puntos), spinbutton_inicio_x, 1, 2, 2, 3,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-
-    spinbutton_inicio_y_adj = gtk_adjustment_new (0, 0, 1000, 1, 10, 10);
-    spinbutton_inicio_y = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_inicio_y_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_puntos), spinbutton_inicio_y, 2, 3, 2, 3,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-
-    spinbutton_fin_x_adj = gtk_adjustment_new (0, 0, 1000, 1, 10, 10);
-    spinbutton_fin_x = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_fin_x_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_puntos), spinbutton_fin_x, 1, 2, 3, 4,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-
-    spinbutton_fin_y_adj = gtk_adjustment_new (0, 0, 1000, 1, 10, 10);
-    spinbutton_fin_y = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_fin_y_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_puntos), spinbutton_fin_y, 2, 3, 3, 4,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-
-    table_otros = gtk_table_new (3, 2, FALSE);
-    gtk_box_pack_start (GTK_BOX (vbox_otros), table_otros, FALSE, FALSE, 0);
-    gtk_table_set_col_spacings (GTK_TABLE (table_otros), 2);
-
-    label_alto = gtk_label_new ("Alto");
-    gtk_table_attach (GTK_TABLE (table_otros), label_alto, 0, 1, 0, 1,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_alto), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_alto), 0, 0.5);
-
-    label_ancho = gtk_label_new ("Ancho");
-    gtk_table_attach (GTK_TABLE (table_otros), label_ancho, 0, 1, 1, 2,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_ancho), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_ancho), 0, 0.5);
-
-    label_radio = gtk_label_new ("Radio");
-    gtk_table_attach (GTK_TABLE (table_otros), label_radio, 0, 1, 2, 3,
-            (GtkAttachOptions) (GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_label_set_justify (GTK_LABEL (label_radio), GTK_JUSTIFY_LEFT);
-    gtk_misc_set_alignment (GTK_MISC (label_radio), 0, 0.5);
-
-    spinbutton_alto_adj = gtk_adjustment_new (1, 1, 1000, 1, 10, 10);
-    spinbutton_alto = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_alto_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_otros), spinbutton_alto, 1, 2, 0, 1,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_widget_set_sensitive (spinbutton_alto, FALSE);
-
-    spinbutton_ancho_adj = gtk_adjustment_new (1, 1, 1000, 1, 10, 10);
-    spinbutton_ancho = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_ancho_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_otros), spinbutton_ancho, 1, 2, 1, 2,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_widget_set_sensitive (spinbutton_ancho, FALSE);
-
-    spinbutton_radio_adj = gtk_adjustment_new (1, 1, 1000, 1, 10, 10);
-    spinbutton_radio = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_radio_adj), 1, 0);
-    gtk_table_attach (GTK_TABLE (table_otros), spinbutton_radio, 1, 2, 2, 3,
-            (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-            (GtkAttachOptions) (0), 0, 0);
-    gtk_widget_set_sensitive (spinbutton_radio, FALSE);
-
-    g_signal_connect((gpointer) window, "delete_event",
-            G_CALLBACK (on_window_delete_event),
-            NULL);
-    g_signal_connect((gpointer) drawingarea, "expose_event",
-            G_CALLBACK (on_drawingarea_expose_event),
-            &dibujo);
-    g_signal_connect((gpointer) button_limpiar, "clicked",
-            G_CALLBACK (on_button_borrar_clicked),
-            &dibujo);
-    g_signal_connect((gpointer) button_actualizar, "clicked",
-            G_CALLBACK (on_button_graficar_clicked),
-            drawingarea);
-    g_signal_connect((gpointer) button_salir, "clicked",
-            G_CALLBACK (on_button_salir_clicked),
-            NULL);
-    g_signal_connect((gpointer) button_agregar, "clicked",
-            G_CALLBACK (on_button_agregar_clicked),
-            this);
-    g_signal_connect((gpointer) radiobutton_linea, "toggled",
-            G_CALLBACK (on_radiobutton_linea_toggled),
-            this);
-    g_signal_connect((gpointer) radiobutton_cuadrado, "toggled",
-            G_CALLBACK (on_radiobutton_cuadrado_toggled),
-            this);
-    g_signal_connect((gpointer) radiobutton_rectangulo, "toggled",
-            G_CALLBACK (on_radiobutton_rectangulo_toggled),
-            this);
-    g_signal_connect((gpointer) radiobutton_circulo, "toggled",
-            G_CALLBACK (on_radiobutton_circulo_toggled),
-            this);
-
-    // Muestro la ventana principal y todos sus componentes.
-    gtk_widget_show_all(window);
-}
-
-TP5Window::~TP5Window(void) {
-    dibujo.borrar_todo();
-}
diff --git a/tp5.cpp b/tp5.cpp
index 5a8a6f90db03f12de68a73524a75fc64771134d4..43f959ec0b97169e14ff41f07ebc8b112b364a24 100644 (file)
--- a/tp5.cpp
+++ b/tp5.cpp
@@ -19,7 +19,7 @@
 #include "cuadrado.h"
 #include "linea.h"
 #include "circulo.h"
-#include "interface.h"
+#include "tp5window.h"
 #include <gtk/gtk.h>
 
 /**
diff --git a/tp5window.cpp b/tp5window.cpp
new file mode 100644 (file)
index 0000000..eb0f9e0
--- /dev/null
@@ -0,0 +1,426 @@
+/* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80 fileencoding=utf-8:
+ *
+ * Taller de Programación (75.42).
+ *
+ * Ejercicio Número 5:
+ * Graficador de figuras.
+ *
+ * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
+ * Puede copiar, modificar y distribuir este programa bajo los términos de
+ * la licencia GPL (http://www.gnu.org/).
+ *
+ * Creado: mié oct  1 23:31:40 ART 2003
+ *
+ * $Id$
+ */
+
+#include "callbacks.h"
+#include "tp5window.h"
+#include "dibujo.h"
+
+#include <cstring>
+#include <gtk/gtk.h>
+
+const char* TP5Window::COLOR[] = {
+    "Negro",
+    "Azul Oscuro",
+    "Verde Oscuro",
+    "Cián Oscuro",
+    "Rojo Oscuro",
+    "Magenta Oscuro",
+    "Amarillo Oscuro",
+    "Gris Oscuro",
+    "Gris",
+    "Azul",
+    "Verde",
+    "Cián",
+    "Rojo",
+    "Magenta",
+    "Amarillo",
+    "Blanco"
+};
+
+int TP5Window::get_color(void) const {
+    const char* str = gtk_entry_get_text(
+            GTK_ENTRY(GTK_COMBO(combo_color)->entry));
+    for (int i = 0; i < CANT_COLORES; i++) {
+        if (!strcmp(str, COLOR[i])) {
+            return i;
+        }
+    }
+    // No debería pasar nunca.
+    return -1;
+}
+
+TP5Window::TP5Window(void) {
+    // Widgets utilizados, de los cuales no voy a guardar un puntero de acceso
+    // rápido en la clase porque no se usan más que para el funcionamiento
+    // general de la interfaz gráfica.
+    GtkWidget *vbox;
+    GtkWidget *hbox_botones;
+    GtkWidget *frame_dibujo;
+    GtkWidget *label_dibujo;
+    GtkWidget *vbuttonbox_botones;
+    GtkWidget *hbox;
+    GtkWidget *frame_figura;
+    GtkWidget *vbox_figura;
+    GSList    *radiobutton_group = NULL;
+    GtkWidget *label_figura;
+    GtkWidget *vbox_comun;
+    GtkWidget *table_comun;
+    GtkWidget *label_nombre;
+    GtkWidget *label_color;
+    GtkWidget *label_grosor;
+    GtkWidget *combo_entry;
+    GtkObject *spinbutton_grosor_adj;
+    GtkWidget *vbox_otros;
+    GtkWidget *table_puntos;
+    GtkWidget *label_centro;
+    GtkWidget *label_inicio;
+    GtkWidget *label_fin;
+    GtkWidget *label_puntos;
+    GtkWidget *label_x;
+    GtkWidget *label_y;
+    GtkObject *spinbutton_centro_x_adj;
+    GtkObject *spinbutton_centro_y_adj;
+    GtkObject *spinbutton_inicio_x_adj;
+    GtkObject *spinbutton_inicio_y_adj;
+    GtkObject *spinbutton_fin_x_adj;
+    GtkObject *spinbutton_fin_y_adj;
+    GtkWidget *table_otros;
+    GtkWidget *label_alto;
+    GtkWidget *label_ancho;
+    GtkWidget *label_radio;
+    GtkObject *spinbutton_alto_adj;
+    GtkObject *spinbutton_ancho_adj;
+    GtkObject *spinbutton_radio_adj;
+    combo_color_items = NULL;
+
+    // Creo ventana principal.
+    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    // Asigna márgen a la ventana (se va a dibujar los controles 5 píxeles por
+    // dentro de la ventana.
+    gtk_container_set_border_width(GTK_CONTAINER(window), 5);
+    // Asigno título a la ventana.
+    gtk_window_set_title(GTK_WINDOW(window), "Trabajo Práctico V");
+
+    // Divide la ventana en 2 verticalmente. Abajo irán los controles para crear
+    // figuras, arriba el área de dibujo y los controles de dibujo/salida.
+    vbox = gtk_vbox_new(
+            FALSE, // No se distribuye homogeneamente.
+            0);    // Espaciado.
+    gtk_container_add(GTK_CONTAINER(window), vbox);
+
+    // Divide en dos horizontalmente la porción de arriba. A la izquierda irá el
+    // área de dibujo y a la derecha los botones de dibujo/salida.
+    hbox_botones = gtk_hbox_new(FALSE, 5);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox_botones, TRUE, TRUE, 0);
+    //                                              ^|^^  ^|^^  |
+    // Indica si se expanda cuando se cambia el  <---'     |    |
+    // tamaño de la ventana.                               |    |
+    //                                                     |    |
+    // Indica que se debe rellenar toda el área  <---------'    V
+    // expandida con el widget que contiene.                 Espaciado
+
+    // Crea un marco con una leyenda para indicar que dentro está el área de
+    // dibujo.
+    frame_dibujo = gtk_frame_new(NULL);
+    gtk_box_pack_start(GTK_BOX(hbox_botones), frame_dibujo, TRUE, TRUE, 0);
+
+    // Crea la leyenda y la agrega al marco.
+    label_dibujo = gtk_label_new("Dibujo");
+    gtk_frame_set_label_widget(GTK_FRAME(frame_dibujo), label_dibujo);
+    //gtk_label_set_justify(GTK_LABEL(label_dibujo), GTK_JUSTIFY_LEFT);
+
+    // Crea el área de dibujo y la agrega al marco.
+    drawingarea = gtk_drawing_area_new();
+    gtk_container_add(GTK_CONTAINER(frame_dibujo), drawingarea);
+    // Sugiere un tamaño de 200x200, pero puede adaptarse si se cambia el tamaño
+    // de la ventana.
+    gtk_widget_set_size_request(drawingarea, 200, 200);
+
+    // Crea una matriz de 3x1 para los tres botones relativos al dibujo (y
+    // salida). Esto es agregado a la región de la derecha del dibujo.
+    vbuttonbox_botones = gtk_vbutton_box_new();
+    gtk_box_pack_start(GTK_BOX(hbox_botones), vbuttonbox_botones, FALSE, TRUE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(vbuttonbox_botones), 5);
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox_botones), GTK_BUTTONBOX_SPREAD);
+
+    button_limpiar = gtk_button_new_from_stock("gtk-clear");
+    gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_limpiar);
+    GTK_WIDGET_SET_FLAGS(button_limpiar, GTK_CAN_DEFAULT);
+
+    button_actualizar = gtk_button_new_from_stock("gtk-refresh");
+    gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_actualizar);
+    GTK_WIDGET_SET_FLAGS(button_actualizar, GTK_CAN_DEFAULT);
+
+    button_salir = gtk_button_new_from_stock("gtk-quit");
+    gtk_container_add(GTK_CONTAINER(vbuttonbox_botones), button_salir);
+    GTK_WIDGET_SET_FLAGS(button_salir, GTK_CAN_DEFAULT);
+
+    hbox = gtk_hbox_new(FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
+
+    frame_figura = gtk_frame_new(NULL);
+    gtk_box_pack_start(GTK_BOX(hbox), frame_figura, FALSE, FALSE, 0);
+
+    vbox_figura = gtk_vbox_new(FALSE, 0);
+    gtk_container_add(GTK_CONTAINER(frame_figura), vbox_figura);
+
+    radiobutton_linea = gtk_radio_button_new_with_mnemonic(NULL, "_Línea");
+    gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_linea, FALSE, FALSE, 0);
+    gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_linea), radiobutton_group);
+    radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_linea));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobutton_linea), TRUE);
+
+    radiobutton_cuadrado = gtk_radio_button_new_with_mnemonic(NULL, "_Cuadrado");
+    gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_cuadrado, FALSE, FALSE, 0);
+    gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_cuadrado), radiobutton_group);
+    radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_cuadrado));
+
+    radiobutton_rectangulo = gtk_radio_button_new_with_mnemonic(NULL, "_Rectángulo");
+    gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_rectangulo, FALSE, FALSE, 0);
+    gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_rectangulo), radiobutton_group);
+    radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_rectangulo));
+
+    radiobutton_circulo = gtk_radio_button_new_with_mnemonic(NULL, "Círc_ulo");
+    gtk_box_pack_start(GTK_BOX(vbox_figura), radiobutton_circulo, FALSE, FALSE, 0);
+    gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobutton_circulo), radiobutton_group);
+    radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobutton_circulo));
+
+    label_figura = gtk_label_new("Figura");
+    gtk_frame_set_label_widget(GTK_FRAME(frame_figura), label_figura);
+    gtk_label_set_justify(GTK_LABEL(label_figura), GTK_JUSTIFY_LEFT);
+
+    vbox_comun = gtk_vbox_new(FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(hbox), vbox_comun, TRUE, TRUE, 0);
+
+    table_comun = gtk_table_new(3, 2, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox_comun), table_comun, TRUE, TRUE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(table_comun), 5);
+    gtk_table_set_row_spacings(GTK_TABLE(table_comun), 3);
+    gtk_table_set_col_spacings(GTK_TABLE(table_comun), 5);
+
+    label_nombre = gtk_label_new("Nombre");
+    gtk_table_attach(GTK_TABLE(table_comun), label_nombre, 0, 1, 0, 1,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_nombre), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_nombre), 0, 0.5);
+
+    label_color = gtk_label_new("Color");
+    gtk_table_attach(GTK_TABLE(table_comun), label_color, 0, 1, 1, 2,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_color), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_color), 0, 0.5);
+
+    label_grosor = gtk_label_new("Grosor");
+    gtk_table_attach(GTK_TABLE(table_comun), label_grosor, 0, 1, 2, 3,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_grosor), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_grosor), 0, 0.5);
+
+    entry_nombre = gtk_entry_new();
+    gtk_table_attach(GTK_TABLE(table_comun), entry_nombre, 1, 2, 0, 1,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(GTK_EXPAND), 0, 0);
+    gtk_widget_set_size_request(entry_nombre, 100, -1);
+
+    combo_color = gtk_combo_new();
+    g_object_set_data(G_OBJECT(GTK_COMBO(combo_color)->popwin),
+            "GladeParentKey", combo_color);
+    gtk_table_attach(GTK_TABLE(table_comun), combo_color, 1, 2, 1, 2,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(GTK_EXPAND), 0, 0);
+    gtk_widget_set_size_request(combo_color, 150, -1);
+    gtk_combo_set_value_in_list(GTK_COMBO(combo_color), TRUE, FALSE);
+    for (int i = 0; i < CANT_COLORES; i++) {
+        combo_color_items = g_list_append(combo_color_items,(gpointer) COLOR[i]);
+    }
+    gtk_combo_set_popdown_strings(GTK_COMBO(combo_color), combo_color_items);
+    g_list_free(combo_color_items);
+
+    combo_entry = GTK_COMBO(combo_color)->entry;
+    gtk_editable_set_editable(GTK_EDITABLE(combo_entry), FALSE);
+    gtk_entry_set_text(GTK_ENTRY(combo_entry), COLOR[0]);
+
+    spinbutton_grosor_adj = gtk_adjustment_new(1, 1, 10, 1, 10, 10);
+    spinbutton_grosor = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_grosor_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_comun), spinbutton_grosor, 1, 2, 2, 3,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(GTK_EXPAND), 0, 0);
+    gtk_widget_set_size_request(spinbutton_grosor, 48, -1);
+
+    button_agregar = gtk_button_new_from_stock("gtk-add");
+    gtk_box_pack_start(GTK_BOX(vbox_comun), button_agregar, FALSE, FALSE, 0);
+
+    vbox_otros = gtk_vbox_new(FALSE, 5);
+    gtk_box_pack_start(GTK_BOX(hbox), vbox_otros, FALSE, FALSE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(vbox_otros), 5);
+
+    table_puntos = gtk_table_new(4, 3, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox_otros), table_puntos, FALSE, FALSE, 0);
+    gtk_table_set_col_spacings(GTK_TABLE(table_puntos), 2);
+
+    label_centro = gtk_label_new("Centro");
+    gtk_table_attach(GTK_TABLE(table_puntos), label_centro, 0, 1, 1, 2,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_centro), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_centro), 0, 0.5);
+
+    label_inicio = gtk_label_new("Inicio");
+    gtk_table_attach(GTK_TABLE(table_puntos), label_inicio, 0, 1, 2, 3,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_inicio), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_inicio), 0, 0.5);
+
+    label_fin = gtk_label_new("Fin");
+    gtk_table_attach(GTK_TABLE(table_puntos), label_fin, 0, 1, 3, 4,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_fin), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_fin), 0, 0.5);
+
+    label_puntos = gtk_label_new("");
+    gtk_table_attach(GTK_TABLE(table_puntos), label_puntos, 0, 1, 0, 1,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_puntos), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_puntos), 0, 0.5);
+
+    label_x = gtk_label_new("X");
+    gtk_table_attach(GTK_TABLE(table_puntos), label_x, 1, 2, 0, 1,
+           (GtkAttachOptions)(0),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_misc_set_alignment(GTK_MISC(label_x), 0, 0.5);
+
+    label_y = gtk_label_new("Y");
+    gtk_table_attach(GTK_TABLE(table_puntos), label_y, 2, 3, 0, 1,
+           (GtkAttachOptions)(GTK_EXPAND),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_misc_set_alignment(GTK_MISC(label_y), 0, 0.5);
+
+    spinbutton_centro_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
+    spinbutton_centro_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_centro_x_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_centro_x, 1, 2, 1, 2,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+
+    spinbutton_centro_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
+    spinbutton_centro_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_centro_y_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_centro_y, 2, 3, 1, 2,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+
+    spinbutton_inicio_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
+    spinbutton_inicio_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_inicio_x_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_inicio_x, 1, 2, 2, 3,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+
+    spinbutton_inicio_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
+    spinbutton_inicio_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_inicio_y_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_inicio_y, 2, 3, 2, 3,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+
+    spinbutton_fin_x_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
+    spinbutton_fin_x = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_fin_x_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_fin_x, 1, 2, 3, 4,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+
+    spinbutton_fin_y_adj = gtk_adjustment_new(0, 0, 1000, 1, 10, 10);
+    spinbutton_fin_y = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_fin_y_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_puntos), spinbutton_fin_y, 2, 3, 3, 4,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+
+    table_otros = gtk_table_new(3, 2, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox_otros), table_otros, FALSE, FALSE, 0);
+    gtk_table_set_col_spacings(GTK_TABLE(table_otros), 2);
+
+    label_alto = gtk_label_new("Alto");
+    gtk_table_attach(GTK_TABLE(table_otros), label_alto, 0, 1, 0, 1,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_alto), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_alto), 0, 0.5);
+
+    label_ancho = gtk_label_new("Ancho");
+    gtk_table_attach(GTK_TABLE(table_otros), label_ancho, 0, 1, 1, 2,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_ancho), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_ancho), 0, 0.5);
+
+    label_radio = gtk_label_new("Radio");
+    gtk_table_attach(GTK_TABLE(table_otros), label_radio, 0, 1, 2, 3,
+           (GtkAttachOptions)(GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(label_radio), GTK_JUSTIFY_LEFT);
+    gtk_misc_set_alignment(GTK_MISC(label_radio), 0, 0.5);
+
+    spinbutton_alto_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
+    spinbutton_alto = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_alto_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_otros), spinbutton_alto, 1, 2, 0, 1,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_widget_set_sensitive(spinbutton_alto, FALSE);
+
+    spinbutton_ancho_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
+    spinbutton_ancho = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_ancho_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_otros), spinbutton_ancho, 1, 2, 1, 2,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_widget_set_sensitive(spinbutton_ancho, FALSE);
+
+    spinbutton_radio_adj = gtk_adjustment_new(1, 1, 1000, 1, 10, 10);
+    spinbutton_radio = gtk_spin_button_new(GTK_ADJUSTMENT(spinbutton_radio_adj), 1, 0);
+    gtk_table_attach(GTK_TABLE(table_otros), spinbutton_radio, 1, 2, 2, 3,
+           (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+           (GtkAttachOptions)(0), 0, 0);
+    gtk_widget_set_sensitive(spinbutton_radio, FALSE);
+
+    g_signal_connect((gpointer) window, "delete_event",
+            G_CALLBACK(on_window_delete_event),
+            NULL);
+    g_signal_connect((gpointer) drawingarea, "expose_event",
+            G_CALLBACK(on_drawingarea_expose_event),
+            &dibujo);
+    g_signal_connect((gpointer) button_limpiar, "clicked",
+            G_CALLBACK(on_button_borrar_clicked),
+            &dibujo);
+    g_signal_connect((gpointer) button_actualizar, "clicked",
+            G_CALLBACK(on_button_graficar_clicked),
+            drawingarea);
+    g_signal_connect((gpointer) button_salir, "clicked",
+            G_CALLBACK(on_button_salir_clicked),
+            NULL);
+    g_signal_connect((gpointer) button_agregar, "clicked",
+            G_CALLBACK(on_button_agregar_clicked),
+            this);
+    g_signal_connect((gpointer) radiobutton_linea, "toggled",
+            G_CALLBACK(on_radiobutton_linea_toggled),
+            this);
+    g_signal_connect((gpointer) radiobutton_cuadrado, "toggled",
+            G_CALLBACK(on_radiobutton_cuadrado_toggled),
+            this);
+    g_signal_connect((gpointer) radiobutton_rectangulo, "toggled",
+            G_CALLBACK(on_radiobutton_rectangulo_toggled),
+            this);
+    g_signal_connect((gpointer) radiobutton_circulo, "toggled",
+            G_CALLBACK(on_radiobutton_circulo_toggled),
+            this);
+
+    // Muestro la ventana principal y todos sus componentes.
+    gtk_widget_show_all(window);
+}
+
+TP5Window::~TP5Window(void) {
+    dibujo.borrar_todo();
+}
similarity index 84%
rename from interface.h
rename to tp5window.h
index 9c7c9579f509b02978988d72fb284907820005f5..174c31c1d9776d373984f67c9c6f6d873aa168ba 100644 (file)
@@ -24,6 +24,10 @@ GtkWidget* create_window(Dibujo* dibujo);
  * \note Es un struct porque es todo público.
  */
 struct TP5Window {
+    /**
+     * \defgroup widgets Widgets importantes de la ventana.
+     * @{
+     */
     /// Ventana principal.
     GtkWidget* window;
     /// Área de dibujo.
@@ -48,6 +52,8 @@ struct TP5Window {
     GtkWidget* entry_nombre;
     /// Caja de selección del color.
     GtkWidget* combo_color;
+    // Lista de colores.
+    GList*     combo_color_items;
     /// Selector de grosor.
     GtkWidget* spinbutton_grosor;
     /// Selector de coordenada X del centro.
@@ -70,10 +76,19 @@ struct TP5Window {
     GtkWidget* spinbutton_radio;
     /// Dibujo con las figuras a mostrar.
     Dibujo     dibujo;
+    /** @} */ // Fin del grupo
+
+    /// Cantidad de colores.
+    static const int CANT_COLORES = 16;
+    /// Constantes de colores.
+    static const char* COLOR[CANT_COLORES];
+    /// Convierte un string de color en el número correspondiente.
+    int get_color(void) const;
 
     /// Constructor.
     TP5Window(void);
     /// Destructor.
     virtual ~TP5Window(void);
+
 };