X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/b703e826843af6055f4685d70f029b1262db9f1e..b804b4bd1f222976f6a1fb3156fede8e26e32d3d:/Client/src/principal.cpp?ds=sidebyside diff --git a/Client/src/principal.cpp b/Client/src/principal.cpp index 3a9bfe4..89caf82 100644 --- a/Client/src/principal.cpp +++ b/Client/src/principal.cpp @@ -21,8 +21,11 @@ Principal::Principal(BaseObjectType *co, const Glib::RefPtr &rg):Gtk::Window(co),refXml(rg) { Gtk::MenuItem *conect=0, *exit=0, *about=0, *mnu_prop=0, *mnu_disconnect=0, *server_stop=0; + Gtk::MenuItem *mnu_simular=0, *mnu_pausar=0; Gtk::Button *bar_connect=0, *close_about=0; Gtk::Image *plaqui_logo; + Gtk::Label *lbl_plaqui_version; + txt_view = 0; work_place = 0; lbl_cap_flujo = lbl_cap_extra = lbl_extra = lbl_nombre = lbl_color = lbl_flujo = 0; @@ -39,15 +42,27 @@ Principal::Principal(BaseObjectType *co, const Glib::RefPtr & current_frame = 0; plaqui_logo = anim = 0; + lbl_plaqui_version = 0; + rg->get_widget("lbl_plaqui_version", lbl_plaqui_version); rg->get_widget("plaqui_logo", plaqui_logo); plaqui_logo->set(PACKAGE_DATA_DIR"/plaqui-client/pixmaps/logo.png"); + rg->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 Client versión " VERSION " (revisión "; + s += rev + ")"; + lbl_plaqui_version->set_text(Glib::locale_to_utf8(s)); + rg->get_widget("anim_frames", anim); anim->set(anim_frames[current_frame]); rg->get_widget("close_about", close_about); rg->get_widget("dlgAbout", dlg_about); + rg->get_widget("mnu_pausar", mnu_pausar); rg->get_widget("btn_pausa", btn_pause); + rg->get_widget("mnu_simular", mnu_simular); rg->get_widget("btn_simular", btn_simulate); rg->get_widget("btn_activar", btn_activar); rg->get_widget("color_preview", color_preview); @@ -80,7 +95,9 @@ Principal::Principal(BaseObjectType *co, const Glib::RefPtr & exit->signal_activate().connect( SigC::slot(*this, &Principal::on_mnu_file_exit)); about->signal_activate().connect( SigC::slot(*this, &Principal::on_mnu_help_about)); btn_activar->signal_clicked().connect( SigC::slot(*this, &Principal::on_btn_activar_clicked) ); + mnu_simular->signal_activate().connect( SigC::slot(*this, &Principal::on_btn_simulate_clicked) ); btn_simulate->signal_clicked().connect( SigC::slot(*this, &Principal::on_btn_simulate_clicked) ); + mnu_pausar->signal_activate().connect( SigC::slot(*this, &Principal::on_btn_pause_clicked) ); btn_pause->signal_clicked().connect( SigC::slot(*this, &Principal::on_btn_pause_clicked) ); close_about->signal_clicked().connect( SigC::slot(*dlg_about, &Gtk::Widget::hide) ); @@ -95,6 +112,7 @@ Principal::Principal(BaseObjectType *co, const Glib::RefPtr & color_high = Gdk::Color("red"); Gtk::Widget::get_default_colormap()->alloc_color(color_low); Gtk::Widget::get_default_colormap()->alloc_color(color_high); + txt_view->set_editable(false); } Principal::~Principal() @@ -117,15 +135,36 @@ bool Principal::on_workplace_expose_event(GdkEventExpose *e) if (dynamic_cast(i->second) || dynamic_cast(i->second) || dynamic_cast(i->second)) { x1 = i->second->x + i->second->in_x; y1 = i->second->y + i->second->in_y; - std::list::iterator linea; + std::list::iterator linea; for(linea=i->second->in_lines.begin(); linea!=i->second->in_lines.end(); linea++) { - ViewItem *tmp = find_item(*linea); - x2 = tmp->x + tmp->out_x; - y2 = tmp->y + tmp->out_y; - if (tmp->get_open()) { - gc->set_foreground(color_high); + ViewItem *tmp = find_item(linea->dst); + /* Si este item es un tanque */ + if (linea->is_tank) { + if (linea->is_tank_lower) { + x2 = tmp->x + tmp->out_x; + y2 = tmp->y + tmp->out_y; + if (dynamic_cast(tmp)->get_out_inf()) { + gc->set_foreground(color_high); + } else { + gc->set_foreground(color_low); + } + } else { + x2 = tmp->x + tmp->in_x; + y2 = tmp->y + tmp->in_y; + if (dynamic_cast(tmp)->get_out_sup()) { + gc->set_foreground(color_high); + } else { + gc->set_foreground(color_low); + } + } } else { - gc->set_foreground(color_low); + x2 = tmp->x + tmp->out_x; + y2 = tmp->y + tmp->out_y; + if (tmp->get_open()) { + gc->set_foreground(color_high); + } else { + gc->set_foreground(color_low); + } } gc->set_line_attributes(3, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_MITER); window->draw_line(gc, x2+tmp->item_offset_x, y2+tmp->item_offset_y, x2+tmp->item_offset_x, y1+i->second->offset_y); @@ -136,7 +175,7 @@ bool Principal::on_workplace_expose_event(GdkEventExpose *e) x1 = i->second->x + i->second->out_x; y1 = i->second->y + i->second->out_y; for(linea=i->second->out_lines.begin(); linea!=i->second->out_lines.end(); linea++) { - ViewItem *tmp = find_item(*linea); + ViewItem *tmp = find_item(linea->dst); x2 = tmp->x + tmp->in_x; y2 = tmp->y + tmp->in_y; if (i->second->get_open()) { @@ -173,10 +212,12 @@ void Principal::on_dlg_connect_ok() conexion = new PlaQui::Server::ControlClient(dlg_conectar->get_server_name(), dlg_conectar->get_server_port()); } catch (...) { - txt_view->get_buffer()->insert_at_cursor("NO SE PUDO CREAR OBJETO\n"); + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(), "NO SE PUDO CONECTAR\n"); //delete conexion; XXX Si no me equivoco, si falla el //constructor, no se reserva la memoria (el delete no va). + delete conexion; conexion = NULL; + dlg_conectar->hide(); return; } @@ -188,7 +229,7 @@ void Principal::on_dlg_connect_ok() conexion->signal_frame_received().connect(SigC::slot(*this, &Principal::on_conexion_frame)); // Lanzo la conexion! conexion->run(); - txt_view->get_buffer()->insert_at_cursor("CONNECTED\n"); + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(),"CONNECTED\n"); ico_conected->set( Gtk::Stock::YES , Gtk::IconSize(Gtk::ICON_SIZE_LARGE_TOOLBAR)); // Pido la planta por defecto @@ -269,10 +310,9 @@ void Principal::on_mnu_help_about() bool Principal::on_item_clicked(GdkEventButton *e, ViewItem *i) { - - txt_view->get_buffer()->insert_at_cursor("Selecciono "); - txt_view->get_buffer()->insert_at_cursor(i->get_name()); - txt_view->get_buffer()->insert_at_cursor("\n"); + Glib::ustring s; + s = "Selecciono "+i->get_name()+"\n"; + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(), s); last_selected = i; update_items_prop(); @@ -317,7 +357,7 @@ void Principal::on_conexion_frame(const std::string &frame) void Principal::on_conexion_finished() { - txt_view->get_buffer()->insert_at_cursor("HANG UP\n"); + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(),"HANG UP\n"); ico_conected->set( Gtk::Stock::NO , Gtk::IconSize(Gtk::ICON_SIZE_LARGE_TOOLBAR)); conexion = NULL; // Elimino la planta @@ -334,14 +374,12 @@ void Principal::on_conexion_ok(const std::string &body) /* lo paso a la carga del XML */ /* verifico que body este completo */ if ((body.find("")>0) && (body.find("")>0)) { - //loadXML(body); xml_body = body; load_xml_dispatch(); } else { - std::cout << body << std::endl; - txt_view->get_buffer()->insert_at_cursor("\n"); - txt_view->get_buffer()->insert_at_cursor(Glib::locale_to_utf8(body)); - txt_view->get_buffer()->insert_at_cursor("\n"); + Glib::ustring s; + s = "\n"+Glib::locale_to_utf8(body)+"\n\n"; + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(),s); } } @@ -351,11 +389,9 @@ void Principal::on_conexion_fatal_error(const PlaQui::Server::ControlClient::Err std::string s; a << code; a >> s; - txt_view->get_buffer()->insert_at_cursor("Error de red nro. "); - txt_view->get_buffer()->insert_at_cursor(s); - txt_view->get_buffer()->insert_at_cursor(": "); - txt_view->get_buffer()->insert_at_cursor(desc); - txt_view->get_buffer()->insert_at_cursor("\n"); + Glib::ustring st; + st = "Error de red nro. "+s+": "+desc+"\n"; + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(),st); } void Principal::on_conexion_error(unsigned code, const std::string& desc) @@ -364,11 +400,9 @@ void Principal::on_conexion_error(unsigned code, const std::string& desc) std::string s; a << code; a >> s; - txt_view->get_buffer()->insert_at_cursor("El server dice que hay error nro. "); - txt_view->get_buffer()->insert_at_cursor(s); - txt_view->get_buffer()->insert_at_cursor(": "); - txt_view->get_buffer()->insert_at_cursor(desc); - txt_view->get_buffer()->insert_at_cursor("\n"); + Glib::ustring st; + st = "El server dice que hay error nro. "+s+": "+desc+"\n"; + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(),st); } void Principal::loadXML() @@ -380,7 +414,8 @@ void Principal::loadXML() xmlDocPtr document; document = xmlParseMemory(xml_body.c_str(),xml_body.size()); if (document == NULL) { - std::cout << "EEERRRRRRROOOOOOOOOO" << std::endl; + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(),"No se pudo cargar XML enviado por el servidor."); + is_xml_loaded = false; return; } is_xml_loaded = true; @@ -434,6 +469,7 @@ void Principal::loadNot(xmlNodePtr nodo) std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre"); std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id"); int orientacion=0, x, y; + t_Linea linea; ViewNot *p; nodo = nodo->children; @@ -447,9 +483,18 @@ void Principal::loadNot(xmlNodePtr nodo) } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) { y = atoi( (char *)XML_GET_CONTENT(nodo->children) ); } else if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) { - p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + p->out_lines.push_back(linea); } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { - p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + linea.is_tank = false; + if (dynamic_cast(find_item(linea.dst)) != NULL) { + linea.is_tank = true; + linea.is_tank_lower = false; + if (xmlStrcmp(xmlGetProp(nodo, BAD_CAST"id"), BAD_CAST"inferior")==0) + linea.is_tank_lower = true; + } + p->in_lines.push_back(linea); } } nodo = nodo->next; @@ -468,6 +513,7 @@ void Principal::loadOr(xmlNodePtr nodo) std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre"); std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id"); int orientacion=0, x, y; + t_Linea linea; ViewOr *p; @@ -482,9 +528,18 @@ void Principal::loadOr(xmlNodePtr nodo) } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) { y = atoi( (char *)XML_GET_CONTENT(nodo->children) ); } else if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) { - p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + p->out_lines.push_back(linea); } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { - p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + linea.is_tank = false; + if (dynamic_cast(find_item(linea.dst)) != NULL) { + linea.is_tank = true; + linea.is_tank_lower = false; + if (xmlStrcmp(xmlGetProp(nodo, BAD_CAST"id"), BAD_CAST"inferior")==0) + linea.is_tank_lower = true; + } + p->in_lines.push_back(linea); } } nodo = nodo->next; @@ -505,7 +560,7 @@ void Principal::loadAnd(xmlNodePtr nodo) int orientacion=0, x, y; float flujo; xmlNodePtr inicial = nodo; - + t_Linea linea; ViewAnd *p; nodo = nodo->children; @@ -519,9 +574,18 @@ void Principal::loadAnd(xmlNodePtr nodo) } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) { y = atoi( (char *)XML_GET_CONTENT(nodo->children) ); } else if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) { - p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + p->out_lines.push_back(linea); } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { - p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + linea.is_tank = false; + if (dynamic_cast(find_item(linea.dst)) != NULL) { + linea.is_tank = true; + linea.is_tank_lower = false; + if (xmlStrcmp(xmlGetProp(nodo, BAD_CAST"id"), BAD_CAST"inferior")==0) + linea.is_tank_lower = true; + } + p->in_lines.push_back(linea); } } nodo = nodo->next; @@ -744,7 +808,7 @@ void Principal::read_status_xml(const std::string &frame) xmlDocPtr document; document = xmlParseMemory(frame.c_str(),frame.size()); if (document == NULL) { - std::cout << "read_status_xml::no se creo documento" << std::endl; + txt_view->get_buffer()->insert(txt_view->get_buffer()->begin(), "ERROR : No se pudo leer el último frame!\n"); return; } @@ -782,18 +846,28 @@ void Principal::read_status_xml(const std::string &frame) xmlNodePtr nodo_tmp = items->children; float cap, lit; cap = lit = -1; + bool b_inf, b_sup; while (nodo_tmp != NULL) { if (nodo_tmp->type == XML_ELEMENT_NODE) { if (xmlStrcmp(nodo_tmp->name, BAD_CAST"capacity")==0) cap = atof( (char *)XML_GET_CONTENT(nodo_tmp->children) ); else if (xmlStrcmp(nodo_tmp->name, BAD_CAST"litros")==0) lit= atof( (char *)XML_GET_CONTENT(nodo_tmp->children) ); + else if (xmlStrcmp(nodo_tmp->name, BAD_CAST"salida")==0) { + if (xmlStrcmp(xmlGetProp(items, BAD_CAST"id"), BAD_CAST"inferior")==0) { + b_inf = get_bool_from_xml(nodo_tmp->children); + } else { + b_sup = get_bool_from_xml(nodo_tmp->children); + } + } } nodo_tmp = nodo_tmp->next; } item_name = (char *)xmlGetProp(items, BAD_CAST"name"); mapItems[item_name]->set_actual_flow(cap); mapItems[item_name]->set_extra(lit); + dynamic_cast(mapItems[item_name])->set_out_sup(b_sup); + dynamic_cast(mapItems[item_name])->set_out_inf(b_inf); } } items = items->next;