From 8618abe571a8f7e7c226abd7b70a24403936dc0b Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sun, 5 Oct 2003 02:23:59 +0000 Subject: [PATCH] =?utf8?q?T=C3=A9cnicamente=20se=20termina=20el=20TP.=20Ya?= =?utf8?q?=20andan=20los=20colores=20y=20todo.=20Falta=20documentaci=C3=B3?= =?utf8?q?n.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Makefile | 24 +-- callbacks.cpp | 19 +- figura.cpp | 68 +++++- figura.h | 11 + interface.cpp | 387 --------------------------------- tp5.cpp | 2 +- tp5window.cpp | 426 +++++++++++++++++++++++++++++++++++++ interface.h => tp5window.h | 15 ++ 8 files changed, 537 insertions(+), 415 deletions(-) delete mode 100644 interface.cpp create mode 100644 tp5window.cpp rename interface.h => tp5window.h (84%) diff --git a/Makefile b/Makefile index eb6c427..2430b97 100644 --- 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) diff --git a/callbacks.cpp b/callbacks.cpp index eced183..b0524ca 100644 --- a/callbacks.cpp +++ b/callbacks.cpp @@ -20,7 +20,7 @@ #include "rectangulo.h" #include "circulo.h" #include "callbacks.h" -#include "interface.h" +#include "tp5window.h" #include #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(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, diff --git a/figura.cpp b/figura.cpp index 5ce3dec..e320b14 100644 --- a/figura.cpp +++ b/figura.cpp @@ -15,14 +15,64 @@ */ #include "figura.h" -#include #ifdef DEBUG # include #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)); } diff --git a/figura.h b/figura.h index 8e99a46..36579b4 100644 --- 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 index 26d0a52..0000000 --- a/interface.cpp +++ /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 - * 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 -//#include -//#include -//#include -//#include - -//#include -#include - -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 5a8a6f9..43f959e 100644 --- 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 /** diff --git a/tp5window.cpp b/tp5window.cpp new file mode 100644 index 0000000..eb0f9e0 --- /dev/null +++ b/tp5window.cpp @@ -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 + * 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 +#include + +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(); +} diff --git a/interface.h b/tp5window.h similarity index 84% rename from interface.h rename to tp5window.h index 9c7c957..174c31c 100644 --- a/interface.h +++ b/tp5window.h @@ -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); + }; -- 2.43.0