X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/3314f9284024c7bb9e618f310ca467a93990922d..HEAD:/Constructor/src/constructor.cpp diff --git a/Constructor/src/constructor.cpp b/Constructor/src/constructor.cpp index 4ab81de..07b0165 100644 --- a/Constructor/src/constructor.cpp +++ b/Constructor/src/constructor.cpp @@ -1,12 +1,35 @@ #include "constructor.h" +#include Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtr& refGlade):Gtk::Window(cobject) { id = 0; saved = false; set_title("Constructor"); + Gtk::Label *lbl_plaqui_version; + Gtk::Image *plaqui_logo; + Gtk::MenuItem *mnu_about; + Gtk::Button *close_about; + plaqui_logo = 0; + lbl_plaqui_version = 0; + refGlade->get_widget("lbl_plaqui_version", lbl_plaqui_version); + refGlade->get_widget("plaqui_logo", plaqui_logo); + plaqui_logo->set(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/logo.png"); + + refGlade->get_widget("plaqui_logo", plaqui_logo); + // Calculo número de revisión. + std::string rev = "$Rev$"; + rev = rev.substr(6, rev.length() - 8); + std::string s = "PlaQui Constructor versión " VERSION " (revisión "; + s += rev + ")"; + lbl_plaqui_version->set_text(Glib::convert(s, "UTF-8", "ISO-8859-1")); + refGlade->get_widget("dlgAbout", dlg_about); + refGlade->get_widget("close_about", close_about); + refGlade->get_widget("mnu_about", mnu_about); + + // Cargo todas las imagenes de los iconos de los botones ico_canio = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/canio_n.png"); ico_y = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/y_n.png"); ico_codo = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/codo_o.png"); @@ -18,6 +41,7 @@ Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtrget_widget("btn_canio", btn_canio); refGlade->get_widget("btn_codo", btn_codo); refGlade->get_widget("btn_y", btn_y); @@ -47,7 +71,11 @@ Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtrget_widget("edit_menu_delete_all", edit_menu_delete_all); refGlade->get_widget("btn_find", btn_find); refGlade->get_widget("status_bar", status_bar); + refGlade->get_widget("dlg_quit", dlg_quit); + refGlade->get_widget("btn_dlg_quit_ok", btn_dlg_quit_ok); + refGlade->get_widget("btn_dlg_quit_cancel", btn_dlg_quit_cancel); + //Obtengo el area de trabajo, la cual tiene definida su propia clase. refGlade->get_widget_derived("workplace", workplace); //fixed //Targets @@ -56,6 +84,9 @@ Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtrsignal_activate().connect( SigC::slot(*dlg_about, &Gtk::Widget::show) ); + close_about->signal_clicked().connect( SigC::slot(*dlg_about, &Gtk::Widget::hide) ); btn_canio->drag_source_set(listTargets); btn_y->drag_source_set(listTargets); btn_codo->drag_source_set(listTargets); @@ -67,6 +98,7 @@ Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtrdrag_source_set(listTargets); btn_not->drag_source_set(listTargets); + //Conecto las señales de cada boton con su correspondiente metodo. btn_canio->signal_drag_data_get().connect( SigC::slot(*this, &Constructor::on_btn_canio_drag_get)); btn_bomba->signal_drag_data_get().connect( SigC::slot(*this, &Constructor::on_btn_bomba_drag_get)); btn_exclusa->signal_drag_data_get().connect( SigC::slot(*this, &Constructor::on_btn_exclusa_drag_get)); @@ -84,6 +116,8 @@ Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtrsignal_clicked().connect(SigC::slot(*this, &Constructor::on_quick_btn_new_clicked)); quick_btn_save->signal_clicked().connect(SigC::slot(*this, &Constructor::on_quick_btn_save_clicked)); quick_btn_open->signal_clicked().connect(SigC::slot(*this, &Constructor::on_main_menu_open)); + btn_dlg_quit_ok->signal_clicked().connect(SigC::slot(*this, &Constructor::on_btn_dlg_quit_ok_clicked)); + btn_dlg_quit_cancel->signal_clicked().connect(SigC::slot(*this, &Constructor::on_btn_dlg_quit_cancel_clicked)); main_menu_quit->signal_activate().connect(SigC::slot(*this, &Constructor::on_main_menu_quit)); main_menu_new->signal_activate().connect(SigC::slot(*this, &Constructor::on_quick_btn_new_clicked)); @@ -92,11 +126,11 @@ Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtrsignal_activate().connect(SigC::slot(*this,&Constructor::on_edit_menu_del)); edit_menu_delete_all->signal_activate().connect(SigC::slot(*this,&Constructor::on_quick_btn_delete_all_clicked)); + //Obtengo y conecto los botones del dialogo de Salvar/Cargar un archivo. btn_file_cancel = file_selection->get_cancel_button(); btn_file_ok = file_selection->get_ok_button(); btn_file_ok->signal_clicked().connect(SigC::slot(*this,&Constructor::on_btn_file_ok_clicked)); btn_file_cancel->signal_clicked().connect(SigC::slot(*this,&Constructor::on_btn_file_cancel_clicked)); - btn_open_cancel = file_open_selection->get_cancel_button(); btn_open_ok = file_open_selection->get_ok_button(); btn_open_ok->signal_clicked().connect(SigC::slot(*this,&Constructor::on_load_from_xml)); @@ -115,6 +149,7 @@ Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtrsignal_drag_begin().connect( SigC::slot(*this, &Constructor::on_not_drag_begin)); workplace->drag_dest_set(listTargets); workplace->signal_drag_data_received().connect( SigC::slot(*this, &Constructor::on_item_drop_drag_received) ); + // Apunto la lista del area de trabajo a la lista de items en el Constructor workplace->listaItems = &listaItems; workplace->lista_logic_Items = &lista_logic_Items; workplace->logica = &logica; @@ -123,9 +158,11 @@ Constructor::Constructor(BaseObjectType* cobject, const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time) { gtk_selection_data_set (selection_data, selection_data->target, 8, (const guchar*)"canio_n.png", 12); @@ -176,20 +213,43 @@ void Constructor::on_btn_not_drag_get(const Glib::RefPtr& cont gtk_selection_data_set(selection_data, selection_data->target, 8,(const guchar*)"not_e.png",9); } - +//Sale del programa. Pregunta si desea salvar antes de salir. void Constructor::on_main_menu_quit() { - delete this; + if ( !saved ) + dlg_quit->show(); + else + Gtk::Main::quit(); +} +bool Constructor::on_delete_event(GdkEventAny *e) +{ + std::cout<<"terminando constructor"<hide(); + on_quick_btn_save_clicked(); +} + +//Sale del programa sin guardar el archivo. +void Constructor::on_btn_dlg_quit_cancel_clicked() +{ + dlg_quit->hide(); Gtk::Main::quit(); - //hide(); } + +// Carga de un archivo XML void Constructor::on_main_menu_open() { // Conecto el boton OK para llamar al cargar del XML file_open_selection->show(); } +// Salva un archivo XML void Constructor::on_main_menu_save() { // Conecto el boton OK para llamar al salvar @@ -202,11 +262,13 @@ void Constructor::on_main_menu_save() file_selection->show(); } +// Elimina el item apuntado desde el menu principal void Constructor::on_edit_menu_del() { workplace->delete_item(WorkPlace::pointed); } +// Elimina todos lo items void Constructor::on_edit_menu_delete_all() { std::list::iterator i = listaItems.begin(); @@ -226,6 +288,7 @@ void Constructor::on_edit_menu_delete_all() combo_entry->get_entry()->set_text(""); } +// Al presionarse el check button "logica" void Constructor::on_chk_btn_logica_clicked() { logica = !logica; @@ -233,6 +296,7 @@ void Constructor::on_chk_btn_logica_clicked() workplace->queue_draw(); } +// Metodo que levanta el archivo XML y crea todos los items agregandolos a las listas correspondientes void Constructor::on_load_from_xml() { on_edit_menu_delete_all(); @@ -242,6 +306,7 @@ void Constructor::on_load_from_xml() xmlDocPtr document; document = xmlParseFile(file_name.c_str()); if (document == NULL) { + std::cout<<"NO SE PUDO CARGAR EL ARCHIVO"<next; } - + + // Crea las lineas que conectan la parte logica. create_lines(document->children); xmlFreeDoc(document); workplace->update_logic_position(); workplace->queue_draw(); } else { + std::cout<< "EL XML NO ES VALIDO" << std::endl; // TODO : avisar que el XML no es valido!! } std::cout << "CARGA COMPLETA" << std::endl; file_open_selection->hide(); - id = listaItems.size()+lista_logic_Items.size()+2; + + // Seteo el id en el maximo mas uno de todos los id cargados, para que quede bien cuando se agregan nuevos items en un proyecto + // cargado desde un archivo. + int id_1 = -1 , id_2 = -1; + std::list::iterator i = listaItems.begin(); + while ( i != listaItems.end() ){ + if ( (*i)->get_id() >= id_1 ) + id_1 = (*i)->get_id(); + i++; + } + id_1++; + + i = lista_logic_Items.begin(); + while ( i != lista_logic_Items.end() ){ + if ( (*i)->get_id() >= id_2 ) + id_2 = (*i)->get_id(); + i++; + } + id_2++; + if ( id_1 < id_2 ) id = id_2; + else id = id_1; } +// Recorre todo los items los cuales conocen la manera de salvarse en un archivo XML. void Constructor::on_btn_file_ok_clicked() { std::list::iterator i = listaItems.begin(); @@ -347,6 +435,7 @@ void Constructor::on_btn_file_ok_clicked() file_selection->hide(); } +// Salva el archivo, si no estaba salvado muestra el dialogo, si no sobreescribe el ultimo archivo salvado. void Constructor::on_quick_btn_save_clicked() { if ( ! saved ) { @@ -356,17 +445,20 @@ void Constructor::on_quick_btn_save_clicked() } } +// Limpia la pantalla para comenzar un nuevo proyecto. void Constructor::on_quick_btn_new_clicked() { on_quick_btn_delete_all_clicked(); saved = false; } +// Borra todos los items pero desde otro boton. void Constructor::on_quick_btn_delete_all_clicked() { on_edit_menu_delete_all(); } +// busca en la lista el nombre del item que aparece en el cuadro de texto y si lo encuentra dibuja un recuadro para mostrarlo. void Constructor::on_btn_find_clicked() { CItem * temp = NULL; @@ -392,21 +484,25 @@ void Constructor::on_btn_find_clicked() temp->get_image()->get_width()+10, temp->get_image()->get_height()+10); } +// Oculta el dialogo. void Constructor::on_btn_file_cancel_clicked() { file_selection->hide(); } +//Muestra el dialogo para seleccionar archivo void Constructor::on_btn_open_cancel_clicked() { file_open_selection->hide(); } +// Oculta el dialogo void Constructor::on_btn_dlg_connect_clicked() { dlg_connect->hide(); } +//Metodos que permiten que el icono sea el del items durante el drag void Constructor::on_canio_drag_begin(const Glib::RefPtr& context) { context->set_icon(ico_canio, 5, 5); @@ -467,6 +563,7 @@ void Constructor::on_item_drag_data_get(const Glib::RefPtr& co gtk_selection_data_set (selection_data, selection_data->target, 10, (const guchar*)"item_codo.png", 13); } +// Si un item es movido encima de otro este metodo devueve falso. De esta manera no podran encimarse items. bool Constructor::can_drop(CItem *item, int _x, int _y) { std::list::iterator i = listaItems.begin(); @@ -485,6 +582,8 @@ bool Constructor::can_drop(CItem *item, int _x, int _y) return true; } +//Cada vez que se realiza un drag o un drop este metodo es invocado. +//Aca se validan las posiciones de los items y se crean si no estaban en el area de trabajo. void Constructor::on_item_drop_drag_received(const Glib::RefPtr& context, int x, int y, GtkSelectionData* selection_data, guint info, guint time) { workplace->update_logic_position(); @@ -576,6 +675,9 @@ void Constructor::on_item_drop_drag_received(const Glib::RefPtrqueue_draw(); } +// Cuando se presiona el boton "Verificar Conexiones" esta funcion es invocada +//Muestra un dialogo de error en caso de que no esten bien conectados y un dialogo +//de exito si lo estan. void Constructor::on_btn_check_clicked() { Glib::ustring name; @@ -590,7 +692,8 @@ void Constructor::on_btn_check_clicked() } } - +//Verifica que todos los items esten correctamente conectados en sus extremos. +//Cada item verifica su conexion en forma independiente. bool Constructor::check_connection(Glib::ustring& name) { std::list::iterator i = listaItems.begin(); @@ -623,6 +726,9 @@ bool Constructor::check_connection(Glib::ustring& name) return true; } + +//Los siguientes metodos son utilizados para levantar cada item desde el XML + Not *Constructor::loadNot(xmlNodePtr nodo) { std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre"); @@ -714,6 +820,7 @@ Pump *Constructor::loadBomba(xmlNodePtr nodo) std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id"); int orientacion=0, x, y; float flujo; + Gdk::Color color; nodo = nodo->children; while (nodo != NULL) { @@ -727,7 +834,7 @@ Pump *Constructor::loadBomba(xmlNodePtr nodo) } else if (xmlStrcmp(nodo->name, BAD_CAST"entrega") == 0) { flujo = atof( (char *)XML_GET_CONTENT(nodo->children) ); } else if (xmlStrcmp(nodo->name, BAD_CAST"color") == 0) { - // FIXME ! + color = loadColor(nodo->children); } } nodo = nodo->next; @@ -738,10 +845,31 @@ Pump *Constructor::loadBomba(xmlNodePtr nodo) p->set_entrega(flujo); p->set_id( atoi(id.c_str()) ); p->set_name(name); + p->set_liquid_color(color); return p; } +Gdk::Color Constructor::loadColor(xmlNodePtr nodo) +{ + gushort r,g,b; + while (nodo != NULL) { + if (nodo->type == XML_ELEMENT_NODE) { + if (xmlStrcmp(nodo->name, BAD_CAST"rojo")==0) + r = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + if (xmlStrcmp(nodo->name, BAD_CAST"verde")==0) + g = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + if (xmlStrcmp(nodo->name, BAD_CAST"azul")==0) + b = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + } + nodo = nodo->next; + } + Gdk::Color c; + c.set_rgb(r,g,b); + std::cout << r << " " << g << " " << b << std::endl; + return c; +} + Conduct *Constructor::loadConduct(xmlNodePtr nodo) { std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre"); @@ -813,6 +941,7 @@ Cistern *Constructor::loadTank(xmlNodePtr nodo) std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id"); int orientacion=0, x, y; float liquido,capacidad; + Gdk::Color color; nodo = nodo->children; while (nodo != NULL) { @@ -827,6 +956,8 @@ Cistern *Constructor::loadTank(xmlNodePtr nodo) capacidad = atof ((char *)XML_GET_CONTENT(nodo->children) ); } else if (xmlStrcmp(nodo->name, BAD_CAST"inicial") == 0) { liquido = atof ((char *)XML_GET_CONTENT(nodo->children) ); + } else if (xmlStrcmp(nodo->name, BAD_CAST"color") == 0) { + color = loadColor(nodo->children); } } nodo = nodo->next; @@ -838,7 +969,7 @@ Cistern *Constructor::loadTank(xmlNodePtr nodo) p->set_name(name); p->set_capacidad(capacidad); p->set_contenido_inicial(liquido); - + p->set_liquid_color(color); return p; } @@ -963,6 +1094,7 @@ void Constructor::create_lines(xmlNodePtr nodo) } } +//Levanta las lineas desde el archvo XML void Constructor::create_line(xmlNodePtr nodo, int logic_id) { std::string otro; @@ -974,16 +1106,36 @@ void Constructor::create_line(xmlNodePtr nodo, int logic_id) t_line tmp_line; tmp_line.logic_id = logic_id; //workplace->get_logic_item(logic_id)->set_out_connected(true); - tmp_line.store_id = workplace->get_item_id(otro); - std::cout << otro << " " << tmp_line.logic_id << " " << tmp_line.store_id << std::endl; - workplace->lista_lineas_in.push_back(tmp_line); + if (workplace->get_item_id(otro) != -1) { + tmp_line.store_id = workplace->get_item_id(otro); + std::cout << otro << " se conecta a una compuerta" << std::endl; + workplace->lista_lineas_in.push_back(tmp_line); + } else { + /* Como no era un item, debe ser una compuerta */ + tmp_line.store_id = workplace->get_logic_id(otro); + workplace->lista_lineas_logic.push_back(tmp_line); + } } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada")==0) { otro = (char *)XML_GET_CONTENT(nodo->children); t_line tmp_line; tmp_line.logic_id = logic_id; - tmp_line.store_id = workplace->get_item_id(otro); - workplace->lista_lineas_out.push_back(tmp_line); - std::cout << otro << " " << tmp_line.logic_id << " " << tmp_line.store_id << std::endl; + if (workplace->get_item_id(otro) != -1) { + tmp_line.store_id = workplace->get_item_id(otro); + /* Tengo que ver si es un tanque, para setearlo correctamente */ + if (dynamic_cast(workplace->get_item(workplace->get_item_id(otro)))) { + std::string donde = (char *)xmlGetProp(nodo, BAD_CAST"id"); + tmp_line.cistern_out1 = true; + if (donde == "inferior") { + tmp_line.cistern_out1 = false; + } + } + workplace->lista_lineas_out.push_back(tmp_line); + std::cout << otro << " se conecta a una compuerta" << std::endl; + } else { + /* Como no era un item, debe ser una compuerta */ + tmp_line.store_id = workplace->get_logic_id(otro); + workplace->lista_lineas_logic.push_back(tmp_line); + } } } nodo = nodo->next;