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