5 #include <gtkmm/drawingarea.h>
6 #include <gtkmm/spinbutton.h>
7 #include <gtkmm/stock.h>
10 #include <libglademm.h>
11 #include <gtkmm/entry.h>
12 #include "itemptywnd.h"
14 ///Tipo de estado en el que pueden estar los conectores de un item
15 typedef enum { UNDEF, IN, OUT } ConnectorType;
17 ///Clase que define un conector del item
20 ///Numero que identifica con quien esta conectado
24 ///Sobrecarga del operador = para poder realizar asignaciones entre dos instancias de Connector
25 Connector& operator= (Connector & c) {
34 class CItem:public Gtk::DrawingArea {
39 ///Constructor, crea el item indicando cual es la imagen que le corresponde
40 CItem(const char *filename);
44 ///Dibuja el item cada vez que este evento es llamado por la ventana que lo contiene.
45 virtual bool on_expose_event(GdkEventExpose* event);
47 ///Muestra la ventana de propiedades al seleccionarse la opcion en el menu flotante.
48 virtual void on_menu_popup_propiedades();
50 ///Rota el item al seleccionarse la opcion en el menu flotante
51 virtual void on_menu_popup_rotar();
53 ///Elimina el Item al seleccionarse la opcion en el menu flotante
54 virtual void on_menu_popup_eliminar();
56 ///TODO: conectar los items con lineas!!!
57 virtual void on_menu_popup_conectar();
59 ///Retorna un puntero a la imagen actual.
60 Glib::RefPtr<Gdk::Pixbuf> get_image() { return image; }
62 ///Funciones para setear y obtener los atributos privados
68 Glib::ustring get_name();
69 Glib::ustring get_other_name(int _id);
70 void set_position(int _x, int _y);
72 void set_caudal(double _caudal);
73 void set_name(Glib::ustring _name);
75 ///Retorna true si las coordenadas (_a, _b) pertenecen a otro item que ya fue colocado en el area de trabajo
76 bool is_occupied_area(int _a, int _b);
78 ///Devuelve el tipo de conector de el item que este en (_a, _b) y un puntero a este. Devolvera UNDEF si no hay nada.
79 ConnectorType is_other_connection_area(int _a, int _b, CItem ** _item);
81 /**Funcion abstracta que debe ser redefinida en cada clase descendiente.
82 * Cada clase descendiente debe implementar su manera de guardarse en
83 * en el archivo que se pasa por parametro.
85 virtual void save(FILE *archivo) = 0;
87 /**Funcion abstracta que debe ser implementada en las clases descendientes
88 * ya que cada item verifica sus conexione de manera difenrente y todos deben
91 virtual bool check_connection()=0;
93 ///TODO: hacer abstractas estas funciones... en item no hacen nada....
94 virtual void set_default_connector();
95 virtual ConnectorType get_connector_type( int _a, int _b );
97 ///Puntero al area de trabajo de la ventana principal
100 ///Puntero al cuadro de texto de la ventana principal
101 Gtk::Entry *combo_entry;
103 ///Puntero a la lista de items
104 std::list<CItem *> *listaItems;
106 ///TODO poner esto en Union y crear una ventana nueva de propiedades
109 ///indica si el item ya esta conectado con sus conectores bien definidos
112 /**Vector de connectores donde se mantiene la siguiente referencia:
113 * indice 0 = "arriba/izquierda" para la exclusa, el tubo, el codo, el empalme y el tanque.
114 * "derecha" para la bomba.
115 * es unico para el drenaje.
116 * indice 1 = "abajo/derecha" para la exclusa, el tubo, el codo, el empalme y el tanque.
117 * "izquierda" para el tanque
118 * indice 2 = "medio" para el empalme.
119 *La referencia se toma para las imagenes iniciales en el orden izquierda-derecha-medio,
120 *excepto el tanque que seria derecha-izquierda.
122 std::vector<Connector> connect_vec;
124 ///Indica el numero que le corresponde a la imagen actual del item.
126 ///Numero "unico" que identifica al item.
130 ///Caudal maximo que puede contener un item.
132 ///Menu flotante del item
133 Gtk::Menu menu_popup;
134 ///Lista de opciones del menu flotante
135 Gtk::Menu::MenuList menulist;
136 ///Imagenes del menu flotante
137 Gtk::Image menu_image_delete, menu_image_rotar, menu_image_propiedades, menu_image_linea;
138 ///Puntero a la imagen del item
139 Glib::RefPtr<Gdk::Pixbuf> image;
140 ///Puntero a la ventana de propiedades del item
141 ItemPtyWnd *property_wnd;
142 ///Posicion del item en el area de trabajo