X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/e87ccf6dd21c4739331f33891111c0a006bec002..cd508589aa50ba1a706b8b9f07c9f4c8d6daee4c:/Client/src/principal.cpp diff --git a/Client/src/principal.cpp b/Client/src/principal.cpp index cb4a853..6a08583 100644 --- a/Client/src/principal.cpp +++ b/Client/src/principal.cpp @@ -11,6 +11,9 @@ #include "item_pump.h" #include "item_union.h" #include "item_drain.h" +#include "item_not.h" +#include "item_or.h" +#include "item_and.h" #include Principal::Principal(BaseObjectType *co, const Glib::RefPtr &rg):Gtk::Window(co),refXml(rg) @@ -48,6 +51,7 @@ Principal::Principal(BaseObjectType *co, const Glib::RefPtr & rg->get_widget("work_place", work_place); rg->get_widget("ico_conected", ico_conected); + work_place->signal_expose_event().connect( SigC::slot(*this, &Principal::on_workplace_expose_event) ); dlg_property->get_ok_button()->signal_clicked().connect( SigC::slot(*this, &Principal::on_dlg_property_ok) ); dlg_conectar->get_ok_button()->signal_clicked().connect( SigC::slot(*this, &Principal::on_dlg_connect_ok) ); mnu_prop->signal_activate().connect( SigC::slot(*this, &Principal::on_mnu_property)); @@ -66,6 +70,7 @@ Principal::Principal(BaseObjectType *co, const Glib::RefPtr & last_selected = NULL; update_ui.connect( SigC::slot(*this, &Principal::update_items_prop ) ); load_xml_dispatch.connect( SigC::slot(*this, &Principal::loadXML ) ); + gc = Gdk::GC::create(get_window()); } Principal::~Principal() @@ -79,6 +84,60 @@ Principal::~Principal() } } +void Principal::on_realize() +{ + Gtk::Window::on_realize(); +} + +bool Principal::on_workplace_expose_event(GdkEventExpose *e) +{ + Glib::RefPtr window = work_place->get_window(); + + int x1, y1, x2, y2; + // Dibujo las lineas + std::map::iterator i; + for(i=mapItems.begin(); i!=mapItems.end(); i++) { + 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; + 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; + 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); + window->draw_line(gc, x2+tmp->item_offset_x, y1+i->second->offset_y, x1+i->second->offset_x, y1+i->second->offset_y); + window->draw_line(gc, x1, y1, x1+i->second->offset_x, y1+i->second->offset_y); + window->draw_line(gc, x2, y2, x2+tmp->item_offset_x, y2+tmp->item_offset_y); + } + 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); + x2 = tmp->x + tmp->in_x; + y2 = tmp->y + tmp->in_y; + gc->set_line_attributes(3, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_MITER); + window->draw_line(gc, x1+i->second->offset_x, y1+i->second->offset_y, x1+i->second->offset_x, y2+tmp->item_offset_y); + window->draw_line(gc, x1+i->second->offset_x, y2+tmp->item_offset_y, x2+tmp->item_offset_x, y2+tmp->item_offset_y); + window->draw_line(gc, x1, y1, x1+i->second->offset_x, y1+i->second->offset_y); + window->draw_line(gc, x2, y2, x2+tmp->item_offset_x, y2+tmp->item_offset_y); + } + } + } +} + +ViewItem *Principal::find_item(std::string &_name) +{ + std::map::iterator i; + for(i=mapItems.begin(); i!=mapItems.end(); i++) { + if (i->second->get_name() == _name) { + return i->second; + } + } + return NULL; +} + void Principal::on_dlg_connect_ok() { if (conexion == NULL) { @@ -320,6 +379,12 @@ void Principal::loadXML() loadUnion(items); } else if (xmlStrcmp(items->name, BAD_CAST"drenaje")==0) { loadDrain(items); + } else if (xmlStrcmp(items->name, BAD_CAST"and")==0) { + loadAnd(items); + } else if (xmlStrcmp(items->name, BAD_CAST"or")==0) { + loadOr(items); + } else if (xmlStrcmp(items->name, BAD_CAST"not")==0) { + loadNot(items); } } @@ -337,6 +402,112 @@ void Principal::loadXML() conexion->send(c); } +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; + + ViewNot *p; + nodo = nodo->children; + while (nodo != NULL) { + if (nodo->type == XML_ELEMENT_NODE) { + if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) { + orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + p = new ViewNot(name, orientacion); + } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) { + x = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + } 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)); + } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { + p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + } + } + nodo = nodo->next; + } + + p->signal_button_press_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), p) ); + p->set_position(x,y); + work_place->put(*p, x, y); + p->show(); + // los agrego al hash + mapItems[name] = p; +} + +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; + + ViewOr *p; + + nodo = nodo->children; + while (nodo != NULL) { + if (nodo->type == XML_ELEMENT_NODE) { + if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) { + orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + p = new ViewOr(name, orientacion); + } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) { + x = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + } 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)); + } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { + p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + } + } + nodo = nodo->next; + } + + p->signal_button_press_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), p) ); + p->set_position(x,y); + work_place->put(*p, x, y); + p->show(); + // los agrego al hash + mapItems[name] = p; +} + +void Principal::loadAnd(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; + float flujo; + xmlNodePtr inicial = nodo; + + ViewAnd *p; + + nodo = nodo->children; + while (nodo != NULL) { + if (nodo->type == XML_ELEMENT_NODE) { + if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) { + orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + p = new ViewAnd(name, orientacion); + } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) { + x = atoi( (char *)XML_GET_CONTENT(nodo->children) ); + } 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)); + } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { + p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + } + } + nodo = nodo->next; + } + + p->signal_button_press_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), p) ); + p->set_position(x,y); + work_place->put(*p, x, y); + p->show(); + // los agrego al hash + mapItems[name] = p; +} + void Principal::loadBomba(xmlNodePtr nodo) { Glib::ustring name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");