X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/60d025bd1152960ac9131128c7cea2b7af8a406e..796708eefb056b936274da15c7af2c7d709c9249:/Constructor/item.h diff --git a/Constructor/item.h b/Constructor/item.h index 7a2f35b..34f9ecd 100644 --- a/Constructor/item.h +++ b/Constructor/item.h @@ -1,26 +1,166 @@ +#ifndef _ITEM_H_ +#define _ITEM_H_ - -#ifndef GTKMM_EXAMPLE_DRAWINGAREALINES_H -#define GTKMM_EXAMPLE_DRAWINGAREALINES_H - +#include #include +#include #include #include #include +#include +#include +#include "itemptywnd.h" +#include "workplace.h" +///Tipo de estado en el que pueden estar los conectores de un item +typedef enum { UNDEF, IN, OUT } ConnectorType; + +///Clase que define un conector del item +class Connector { + public: + ///Numero que identifica con quien esta conectado + int id_dest; + ///Tipo de conector + ConnectorType type; + ///Sobrecarga del operador = para poder realizar asignaciones entre dos instancias de Connector + Connector& operator= (Connector & c) { + id_dest = c.id_dest; + type = c.type; + return *this; + } +}; +//class WorkPlace; + class CItem:public Gtk::DrawingArea { public: + ///Constructor CItem(); + + ///Constructor, crea el item indicando cual es la imagen que le corresponde CItem(const char *filename); - ~CItem(); + ///Destructor + virtual ~CItem(); + + ///Dibuja el item cada vez que este evento es llamado por la ventana que lo contiene. virtual bool on_expose_event(GdkEventExpose* event); - virtual void on_menu_file_popup_generic(); + + ///Muestra la ventana de propiedades al seleccionarse la opcion en el menu flotante. + virtual void on_menu_popup_propiedades(); + + ///Rota el item al seleccionarse la opcion en el menu flotante + virtual void on_menu_popup_rotar(); + + ///Elimina el Item al seleccionarse la opcion en el menu flotante + virtual void on_menu_popup_eliminar(); + + ///TODO: conectar los items con lineas!!! + virtual void on_menu_popup_conectar(); + + ///Retorna un puntero a la imagen actual. Glib::RefPtr get_image() { return image; } + + ///Funciones para setear y obtener los atributos privados + int get_position_x(); + int get_position_y(); + int get_id(); + int get_img_actual(); + double get_caudal(); + Glib::ustring get_name(); + Glib::ustring get_other_name(int _id); + void set_position(int _x, int _y); + void set_id(int _id); + void set_caudal(double _caudal); + void set_name(Glib::ustring _name); + + ///Retorna true si las coordenadas (_a, _b) pertenecen a otro item que ya fue colocado en el area de trabajo + bool is_occupied_area(int _a, int _b); + + ///Devuelve el tipo de conector de el item que este en (_a, _b) y un puntero a este. Devolvera UNDEF si no hay nada. + ConnectorType is_other_connection_area(int _a, int _b, CItem ** _item); + + /**Funcion abstracta que debe ser redefinida en cada clase descendiente. + * Cada clase descendiente debe implementar su manera de guardarse en + * en el archivo que se pasa por parametro. + */ + virtual void save(FILE *archivo) = 0; + + /**Funcion abstracta que debe ser implementada en las clases descendientes + * ya que cada item verifica sus conexione de manera difenrente y todos deben + * hacerlo. + */ + virtual bool check_connection()=0; + + ///TODO: hacer abstractas estas funciones... en item no hacen nada.... + virtual void set_default_connector(); + virtual ConnectorType get_connector_type( int _a, int _b ); + + ///Puntero al area de trabajo de la ventana principal + WorkPlace *workplace; + + ///Puntero al cuadro de texto de la ventana principal + Gtk::Entry *combo_entry; + + ///Puntero a la lista de items + std::list *listaItems; + + ///Puntero a la lista de Items logicos + std::list *lista_logic_Items; + + ///TODO poner esto en Union y crear una ventana nueva de propiedades + bool is_union; + + ///indica si el item ya esta conectado con sus conectores bien definidos + bool is_connected; + + ///Indica si es una compuerta logica + bool is_logic; + + ///Indica si puede realizarse la conexion logica con una compuerta + static bool logic_connect; + static int quien; + + /**Vector de connectores donde se mantiene la siguiente referencia: + * indice 0 = "arriba/izquierda" para la exclusa, el tubo, el codo, el empalme y el tanque. + * "derecha" para la bomba. + * es unico para el drenaje. + * indice 1 = "abajo/derecha" para la exclusa, el tubo, el codo, el empalme y el tanque. + * "izquierda" para el tanque + * indice 2 = "medio" para el empalme. + *La referencia se toma para las imagenes iniciales en el orden izquierda-derecha-medio, + *excepto el tanque que seria derecha-izquierda. + */ + std::vector connect_vec; protected: + ///Indica el numero que le corresponde a la imagen actual del item. + int imgActual; + + ///Numero "unico" que identifica al item. + int ID; + + ///Nombre del item + Glib::ustring name; + + ///Caudal maximo que puede contener un item. + double caudal_max; + + ///Menu flotante del item Gtk::Menu menu_popup; - Gtk::Image menu_image; + + ///Lista de opciones del menu flotante + Gtk::Menu::MenuList menulist; + + ///Imagenes del menu flotante + Gtk::Image menu_image_delete, menu_image_rotar, menu_image_propiedades, menu_image_linea; + + ///Puntero a la imagen del item Glib::RefPtr image; + + ///Puntero a la ventana de propiedades del item + ItemPtyWnd *property_wnd; + + ///Posicion del item en el area de trabajo + int x, y; }; #endif