]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Constructor/include/item.h
8ffd14e0e2f02b6a82ab50223b50844039c90c0d
[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 }t_logic_connector;
29
30 ///Clase que define un conector del item
31 class Connector {
32         public: 
33                 ///Numero que identifica con quien esta conectado
34                 int id_dest;
35                 ///Tipo de conector
36                 ConnectorType type;
37                 ///Sobrecarga del operador = para poder realizar asignaciones entre dos instancias de Connector
38                 Connector& operator= (Connector & c) {
39                         id_dest = c.id_dest;
40                         type = c.type;
41                         return *this;
42                 }
43 };
44
45 //class WorkPlace;
46         
47 class CItem:public Gtk::DrawingArea {
48 public:
49         ///Constructor
50         CItem();
51
52         ///Constructor, crea el item indicando cual es la imagen que le corresponde
53         CItem(const char *filename);
54         ///Destructor
55         virtual ~CItem();
56         
57         ///Dibuja el item cada vez que este evento es llamado por la ventana que lo contiene.
58         virtual bool on_expose_event(GdkEventExpose* event);
59
60         ///Muestra la ventana de propiedades al seleccionarse la opcion en el menu flotante.
61         virtual void on_menu_popup_propiedades();
62         
63         ///Rota el item al seleccionarse la opcion en el menu flotante
64         virtual void on_menu_popup_rotar();
65         
66         ///Elimina el Item al seleccionarse la opcion en el menu flotante
67         virtual void on_menu_popup_eliminar();
68         
69         ///TODO: conectar los items con lineas!!!
70         virtual void on_menu_popup_conectar();
71                 
72         ///Retorna un puntero a la imagen actual.
73         Glib::RefPtr<Gdk::Pixbuf> get_image() { return image; }
74         
75         ///Funciones para setear y obtener los atributos privados
76         int get_position_x();
77         int get_position_y();
78         int get_id();
79         int get_img_actual();
80         double get_caudal();
81         Glib::ustring get_name();
82         Glib::ustring get_other_name(int _id);
83         void set_position(int _x, int _y);
84         void set_id(int _id);
85         void set_caudal(double _caudal);
86         void set_name(Glib::ustring _name);
87         
88         ///Retorna true si las coordenadas (_a, _b) pertenecen a otro item que ya fue colocado en el area de trabajo
89         bool is_occupied_area(int _a, int _b);
90         
91         ///Devuelve el tipo de conector de el item que este en (_a, _b) y un puntero a este. Devolvera UNDEF si no hay nada. 
92         ConnectorType is_other_connection_area(int _a, int _b, CItem ** _item);
93         
94         /**Funcion abstracta que debe ser redefinida en cada clase descendiente. 
95           * Cada clase descendiente debe implementar su manera de guardarse en 
96           * en el archivo que se pasa por parametro.
97         */
98         virtual void save(FILE *archivo) = 0;
99         
100         /**Funcion abstracta que debe ser implementada en las clases descendientes
101           * ya que cada item verifica sus conexione de manera difenrente y todos deben
102           * hacerlo.
103         */
104         virtual bool check_connection()=0;
105         
106         ///TODO: hacer abstractas estas funciones... en item no hacen nada....
107         virtual void set_default_connector();   
108         virtual ConnectorType get_connector_type( int _a, int _b );
109         
110         /**Devuelve en _a y _b la posicion de los conectores logicos del item segun su posicion.
111         */
112         virtual void get_in_logic_connect_position(int& _a, int& _b);
113         virtual void get_out_logic_connect_position(int& _a, int& _b);
114         
115         /**Actualiza las posiciones de los conectores ante un movimiento o rotacion del item.
116         */
117         virtual void update_logic_position();
118         
119         ///Puntero al area de trabajo de la ventana principal
120         WorkPlace *workplace;
121         
122         ///Puntero al cuadro de texto de la ventana principal
123         Gtk::Entry *combo_entry;
124         
125         ///Puntero a la lista de items
126         std::list<CItem *> *listaItems;
127         
128         ///Puntero a la lista de Items logicos
129         std::list<CItem *> *lista_logic_Items;
130         
131         ///TODO poner esto en Union y crear una ventana nueva de propiedades
132         bool is_union;
133         
134         ///indica si el item ya esta conectado con sus conectores bien definidos
135         bool is_connected;
136         
137         ///Indica si es una compuerta logica
138         bool is_logic;
139         
140         ///Indica si puede realizarse la conexion logica con una compuerta
141         static bool logic_connect;
142         
143         ///Almacena el ID de la compuerta logica seleccionada
144         static int gate_id;
145         
146         /**Vector de connectores donde se mantiene la siguiente referencia:
147          * indice 0 = "arriba/izquierda" para la exclusa, el tubo, el codo, el empalme y el tanque.
148          *                                      "derecha" para la bomba.
149          *                                      es unico para el drenaje.
150          * indice 1 = "abajo/derecha" para la exclusa, el tubo, el codo, el empalme y el tanque.
151          *                                      "izquierda" para el tanque
152          * indice 2 = "medio" para el empalme.
153          *La referencia se toma para las imagenes iniciales en el orden izquierda-derecha-medio, 
154          *excepto el tanque que seria derecha-izquierda.
155          */                                                             
156         std::vector<Connector> connect_vec;
157
158         void set_img_actual(int i) { imgActual = i; }
159 protected:
160         ///Indica el numero que le corresponde a la imagen actual del item.
161         int imgActual;
162
163         ///Numero "unico" que identifica al item.
164         int ID;
165
166         ///Nombre del item
167         Glib::ustring name;
168         
169         ///Caudal maximo que puede contener un item.
170         double caudal_max;
171         
172         ///Menu flotante del item
173         Gtk::Menu menu_popup;
174         
175         ///Lista de opciones del menu flotante
176         Gtk::Menu::MenuList menulist;
177         
178         ///Imagenes del menu flotante
179         Gtk::Image menu_image_delete, menu_image_rotar, menu_image_propiedades, menu_image_linea;
180         
181         ///Puntero a la imagen del item
182         Glib::RefPtr<Gdk::Pixbuf> image;
183         
184         ///Puntero a la ventana de propiedades del item
185         ItemPtyWnd *property_wnd;
186         
187         ///Posicion del item en el area de trabajo
188         int x, y;
189 };
190
191 #endif