]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Constructor/include/item.h
despues de estar como un pelotudo buscando el error, lo encontre, era un == ( yo...
[z.facultad/75.42/plaqui.git] / Constructor / include / item.h
1 #ifndef _ITEM_H_
2 #define _ITEM_H_
3
4 #include <iostream>
5 #include <gtkmm/drawingarea.h>
6 #include <gtkmm/spinbutton.h>
7 #include <gtkmm/stock.h>
8 #include <gtkmm.h>
9 #include <gdkmm.h>
10 #include <libglademm.h>
11 #include <gtkmm/entry.h>
12 #include "itemptywnd.h"
13 #include "workplace.h"
14
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.
19 */
20
21 ///Tipo de estado en el que pueden estar los conectores de un item
22 typedef enum { UNDEF, IN, OUT } ConnectorType;
23
24 ///Tipo que indica que conector de alguna compuerta esta conectado con algun item. Usado para cargar el XML.
25 typedef struct {
26         ConnectorType type;
27         Glib::ustring name_dest;
28         int cistern_connector;
29 }t_logic_connector;
30
31 ///Clase que define un conector del item
32 class Connector {
33         public: 
34                 ///Numero que identifica con quien esta conectado
35                 int id_dest;
36                 ///Tipo de conector
37                 ConnectorType type;
38                 ///Sobrecarga del operador = para poder realizar asignaciones entre dos instancias de Connector
39                 Connector& operator= (Connector & c) {
40                         id_dest = c.id_dest;
41                         type = c.type;
42                         return *this;
43                 }
44 };
45
46 //class WorkPlace;
47         
48 class CItem:public Gtk::DrawingArea {
49 public:
50         ///Constructor
51         CItem();
52
53         ///Constructor, crea el item indicando cual es la imagen que le corresponde
54         CItem(const char *filename);
55         ///Destructor
56         virtual ~CItem();
57         
58         
59         virtual void on_realize();
60
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);
63
64         ///Muestra la ventana de propiedades al seleccionarse la opcion en el menu flotante.
65         virtual void on_menu_popup_propiedades();
66         
67         ///Rota el item al seleccionarse la opcion en el menu flotante
68         virtual void on_menu_popup_rotar();
69         
70         ///Elimina el Item al seleccionarse la opcion en el menu flotante
71         virtual void on_menu_popup_eliminar();
72         
73         ///TODO: conectar los items con lineas!!!
74         virtual void on_menu_popup_conectar();
75                 
76         ///Retorna un puntero a la imagen actual.
77         Glib::RefPtr<Gdk::Pixbuf> get_image() { return image; }
78         
79         ///Funciones para setear y obtener los atributos privados
80         int get_position_x();
81         int get_position_y();
82         int get_id();
83         int get_img_actual();
84         double get_caudal();
85         Glib::ustring get_name();
86         Glib::ustring get_other_name(int _id);
87         void set_position(int _x, int _y);
88         void set_id(int _id);
89         void set_caudal(double _caudal);
90         void set_name(Glib::ustring _name);
91         
92         ///Retorna true si las coordenadas (_a, _b) pertenecen a otro item que ya fue colocado en el area de trabajo
93         bool is_occupied_area(int _a, int _b);
94         
95         ///Devuelve el tipo de conector de el item que este en (_a, _b) y un puntero a este. Devolvera UNDEF si no hay nada. 
96         ConnectorType is_other_connection_area(int _a, int _b, CItem ** _item);
97         
98         /**Funcion abstracta que debe ser redefinida en cada clase descendiente. 
99           * Cada clase descendiente debe implementar su manera de guardarse en 
100           * en el archivo que se pasa por parametro.
101         */
102         virtual void save(FILE *archivo) = 0;
103         
104         /**Funcion abstracta que debe ser implementada en las clases descendientes
105           * ya que cada item verifica sus conexione de manera difenrente y todos deben
106           * hacerlo.
107         */
108         virtual bool check_connection()=0;
109         
110         ///TODO: hacer abstractas estas funciones... en item no hacen nada....
111         virtual void set_default_connector();   
112         virtual ConnectorType get_connector_type( int _a, int _b );
113         
114         /**Devuelve en _a y _b la posicion de los conectores logicos del item segun su posicion.
115         */
116         virtual void get_in_logic_connect_position(int& _a, int& _b);
117         virtual void get_out_logic_connect_position(int& _a, int& _b);
118         
119         /**Actualiza las posiciones de los conectores ante un movimiento o rotacion del item.
120         */
121         virtual void update_logic_position();
122         
123         /**Funciones para no permitir mas de una conexion a la salida de las compuertas.
124           *En el caso de la compuerta NOT, tampoco puede tener mas de una conexion 
125           *a la entrada.          
126         */
127         virtual void set_out_connected(bool _o);
128         virtual void set_in_connected(bool _o);
129         
130         virtual bool get_out_logic_connect();
131         /**Dibuja los conectores logicos del Item, AZUL == SALIDA, ROJO == ENTRADA.
132         */
133         virtual void draw_connectors();
134         
135         ///Puntero al area de trabajo de la ventana principal
136         WorkPlace *workplace;
137         
138         ///Puntero al cuadro de texto de la ventana principal
139         Gtk::Combo *combo_entry;
140         
141         ///Puntero a la barra de estado
142         Gtk::Statusbar *status_bar;
143         
144         ///Puntero a la lista de items
145         std::list<CItem *> *listaItems;
146         
147         ///Puntero a la lista de Items logicos
148         std::list<CItem *> *lista_logic_Items;
149         
150         ///TODO poner esto en Union y crear una ventana nueva de propiedades
151         bool is_union;
152         
153         ///indica si el item ya esta conectado con sus conectores bien definidos
154         bool is_connected;
155         
156         ///Indica si es una compuerta logica
157         bool is_logic;
158         
159         ///Indica si puede realizarse la conexion logica con una compuerta
160         static bool logic_connect;
161         
162         ///Almacena el ID de la compuerta logica seleccionada
163         static int gate_id;
164         
165         /**Vector de connectores donde se mantiene la siguiente referencia:
166          * indice 0 = "arriba/izquierda" para la exclusa, el tubo, el codo, el empalme y el tanque.
167          *                                      "derecha" para la bomba.
168          *                                      es unico para el drenaje.
169          * indice 1 = "abajo/derecha" para la exclusa, el tubo, el codo, el empalme y el tanque.
170          *                                      "izquierda" para el tanque
171          * indice 2 = "medio" para el empalme.
172          *La referencia se toma para las imagenes iniciales en el orden izquierda-derecha-medio, 
173          *excepto el tanque que seria derecha-izquierda.
174          */                                                             
175         std::vector<Connector> connect_vec;
176
177         void set_img_actual(int i) { imgActual = i; }
178         
179         ///Puntero al cuadro de texo de la ventana principal.
180         std::list<Glib::ustring> *list_pointed;
181 protected:
182         ///Indica el numero que le corresponde a la imagen actual del item.
183         int imgActual;
184
185         ///Numero "unico" que identifica al item.
186         int ID;
187
188         Glib::RefPtr<Gdk::GC> gc;
189
190         Gdk::Color blue, red;
191
192         ///Nombre del item
193         Glib::ustring name;
194         
195         ///Caudal maximo que puede contener un item.
196         double caudal_max;
197         
198         ///Menu flotante del item
199         Gtk::Menu menu_popup;
200         
201         ///Lista de opciones del menu flotante
202         Gtk::Menu::MenuList menulist;
203         
204         ///Imagenes del menu flotante
205         Gtk::Image menu_image_delete, menu_image_rotar, menu_image_propiedades, menu_image_linea;
206         
207         ///Puntero a la imagen del item
208         Glib::RefPtr<Gdk::Pixbuf> image;
209         
210         ///Puntero a la ventana de propiedades del item
211         ItemPtyWnd *property_wnd;
212
213         ///Posicion del item en el area de trabajo
214         int x, y;
215         
216         ///Posicion de los conectores logicos.
217         int in_x, in_y, out_x, out_y;
218 };
219
220 #endif