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"
13 #include "workplace.h"
15 /**Esta es la clase padre de todos los items que puedan aparecer
16 *Aca estan definidos todos los comportamientos en comun y en
17 *algunos casos hay funciones abstractas para que cada item defina
18 * su propio comportamiento.
21 ///Tipo de estado en el que pueden estar los conectores de un item
22 typedef enum { UNDEF, IN, OUT } ConnectorType;
24 ///Tipo que indica que conector de alguna compuerta esta conectado con algun item. Usado para cargar el XML.
27 Glib::ustring name_dest;
28 int cistern_connector;
31 ///Clase que define un conector del item
34 ///Numero que identifica con quien esta conectado
38 ///Sobrecarga del operador = para poder realizar asignaciones entre dos instancias de Connector
39 Connector& operator= (Connector & c) {
48 class CItem:public Gtk::DrawingArea {
53 ///Constructor, crea el item indicando cual es la imagen que le corresponde
54 CItem(const char *filename);
59 virtual void on_realize();
61 ///Dibuja el item cada vez que este evento es llamado por la ventana que lo contiene.
62 virtual bool on_expose_event(GdkEventExpose* event);
64 ///Muestra la ventana de propiedades al seleccionarse la opcion en el menu flotante.
65 virtual void on_menu_popup_propiedades();
67 ///Rota el item al seleccionarse la opcion en el menu flotante
68 virtual void on_menu_popup_rotar();
70 ///Elimina el Item al seleccionarse la opcion en el menu flotante
71 virtual void on_menu_popup_eliminar();
73 ///Retorna un puntero a la imagen actual.
74 Glib::RefPtr<Gdk::Pixbuf> get_image() { return image; }
76 ///Funciones para setear y obtener los atributos privados
82 Glib::ustring get_name();
83 Glib::ustring get_other_name(int _id);
84 void set_position(int _x, int _y);
86 void set_caudal(double _caudal);
87 void set_name(Glib::ustring _name);
89 ///Retorna true si las coordenadas (_a, _b) pertenecen a otro item que ya fue colocado en el area de trabajo
90 bool is_occupied_area(int _a, int _b);
92 ///Devuelve el tipo de conector de el item que este en (_a, _b) y un puntero a este. Devolvera UNDEF si no hay nada.
93 ConnectorType is_other_connection_area(int _a, int _b, CItem ** _item);
95 /**Funcion abstracta que debe ser redefinida en cada clase descendiente.
96 * Cada clase descendiente debe implementar su manera de guardarse en
97 * en el archivo que se pasa por parametro.
99 virtual void save(FILE *archivo) = 0;
101 /**Funcion abstracta que debe ser implementada en las clases descendientes
102 * ya que cada item verifica sus conexione de manera difenrente y todos deben
105 virtual bool check_connection()=0;
107 ///TODO: hacer abstractas estas funciones... en item no hacen nada....
108 virtual void set_default_connector();
109 virtual ConnectorType get_connector_type( int _a, int _b );
111 /**Devuelve en _a y _b la posicion de los conectores logicos del item segun su posicion.
113 virtual void get_in_logic_connect_position(int& _a, int& _b);
114 virtual void get_out_logic_connect_position(int& _a, int& _b);
116 /**Actualiza las posiciones de los conectores ante un movimiento o rotacion del item.
118 virtual void update_logic_position();
120 /**Funciones para no permitir mas de una conexion a la salida de las compuertas.
121 *En el caso de la compuerta NOT, tampoco puede tener mas de una conexion
124 virtual void set_out_connected(bool _o);
125 virtual void set_in_connected(bool _o);
127 virtual bool get_out_logic_connect();
128 /**Dibuja los conectores logicos del Item, AZUL == SALIDA, ROJO == ENTRADA.
130 virtual void draw_connectors();
132 ///Puntero al area de trabajo de la ventana principal
133 WorkPlace *workplace;
135 ///Puntero al cuadro de texto de la ventana principal
136 Gtk::Combo *combo_entry;
138 ///Puntero a la barra de estado
139 Gtk::Statusbar *status_bar;
141 ///Puntero a la lista de items
142 std::list<CItem *> *listaItems;
144 ///Puntero a la lista de Items logicos
145 std::list<CItem *> *lista_logic_Items;
147 ///TODO poner esto en Union y crear una ventana nueva de propiedades
150 ///indica si el item ya esta conectado con sus conectores bien definidos
153 ///Indica si es una compuerta logica
156 ///Indica si puede realizarse la conexion logica con una compuerta
157 static bool logic_connect;
159 ///Almacena el ID de la compuerta logica seleccionada
162 /**Vector de connectores donde se mantiene la siguiente referencia:
163 * indice 0 = "arriba/izquierda" para la exclusa, el tubo, el codo, el empalme y el tanque.
164 * "derecha" para la bomba.
165 * es unico para el drenaje.
166 * indice 1 = "abajo/derecha" para la exclusa, el tubo, el codo, el empalme y el tanque.
167 * "izquierda" para el tanque
168 * indice 2 = "medio" para el empalme.
169 *La referencia se toma para las imagenes iniciales en el orden izquierda-derecha-medio,
170 *excepto el tanque que seria derecha-izquierda.
172 std::vector<Connector> connect_vec;
174 void set_img_actual(int i) { imgActual = i; }
176 ///Puntero al cuadro de texo de la ventana principal.
177 std::list<Glib::ustring> *list_pointed;
179 ///Indica el numero que le corresponde a la imagen actual del item.
182 ///Numero "unico" que identifica al item.
185 Glib::RefPtr<Gdk::GC> gc;
187 Gdk::Color blue, red;
192 ///Caudal maximo que puede contener un item.
195 ///Menu flotante del item
196 Gtk::Menu menu_popup;
198 ///Lista de opciones del menu flotante
199 Gtk::Menu::MenuList menulist;
201 ///Imagenes del menu flotante
202 Gtk::Image menu_image_delete, menu_image_rotar, menu_image_propiedades, menu_image_linea;
204 ///Puntero a la imagen del item
205 Glib::RefPtr<Gdk::Pixbuf> image;
207 ///Puntero a la ventana de propiedades del item
208 ItemPtyWnd *property_wnd;
210 ///Posicion del item en el area de trabajo
213 ///Posicion de los conectores logicos.
214 int in_x, in_y, out_x, out_y;