void ArrowModel::onPointUpdated(void) { GraphicModel::points.clear(); double x1, y1; GyPoint pt; if(!bNullArrow) { // Adding label position Glib::RefPtr<Goocanvas::Item> item = parentWindow->m_Canvas->get_item(label); if(item) { Goocanvas::Bounds bi = item->get_bounds(); bi = item->get_bounds(); pt.x = bi.get_x1(); pt.y = bi.get_y1(); } else pt.x = pt.y = -1; } GraphicModel::points.push_back(pt); Goocanvas::Points pts = this->property_points().get_value(); for(int i=0; i<pts.get_num_points(); i++) { pts.get_coordinate(i, x1, y1); pt.x = x1; pt.y = y1; GraphicModel::points.push_back(pt); } }
void ApplicationModel::updateBounds(void) { for(int i=0; i<this->get_n_children(); i++) { Glib::RefPtr<Goocanvas::Item> item = parentWindow->m_Canvas->get_item(this->get_child(i)); if(item) { Goocanvas::Bounds bd = item->get_bounds(); bounds.set_x1( (bounds.get_x1() < bd.get_x1()) ? bounds.get_x1(): bd.get_x1() ); bounds.set_x2( (bounds.get_x2() > bd.get_x2()) ? bounds.get_x2(): bd.get_x2() ); bounds.set_y1( (bounds.get_y1() < bd.get_y1()) ? bounds.get_y1(): bd.get_y1() ); bounds.set_y2( (bounds.get_y2() > bd.get_y2()) ? bounds.get_y2(): bd.get_y2() ); } } width = MAX(MIN_WIDTH + text_w, bounds.get_x2()-bounds.get_x1() + 2*ITEMS_MARGIE); height = MAX(MIN_HEIGHT, bounds.get_y2()-bounds.get_y1() + 2*ITEMS_MARGIE + text_h); Goocanvas::Points points(6); points.set_coordinate(0, 0, 0); points.set_coordinate(1, text_w+TEXT_MARGINE*2, 0); points.set_coordinate(2, text_w+TEXT_MARGINE*2, text_h+TEXT_MARGINE); points.set_coordinate(3, width, text_h+TEXT_MARGINE); points.set_coordinate(4, width, height); points.set_coordinate(5, 0, height); poly->property_points().set_value(points); Goocanvas::Points points3(3); points3.set_coordinate(0, width, text_h+TEXT_MARGINE); points3.set_coordinate(1, width, height); points3.set_coordinate(2, 0, height); shadow->property_points().set_value(points3); }
bool MidpointModel::onItemMotionNotifyEvent(const Glib::RefPtr<Goocanvas::Item>& item, GdkEventMotion* event) { if(item && _dragging && item == _dragging) { parentWindow->setModified(); double new_x = event->x ; double new_y = event->y ; item->translate(new_x - _drag_x, new_y - _drag_y); if(event->state & GDK_CONTROL_MASK) { int index = arrow->getIndex(point_x, point_y); if(index) { Gdk::Point current_point, base_point; int dist; current_point = getContactPoint(); // adjusting to the previous point base_point = arrow->getPoint(index-1); dist = current_point.get_y() - base_point.get_y(); if(abs(dist) <= AUTOSNIPE_MARGINE) item->translate(0, -dist); dist = current_point.get_x() - base_point.get_x(); if(abs(dist) <= AUTOSNIPE_MARGINE) item->translate(-dist, 0); // adjusting to the next point base_point = arrow->getPoint(index+1); dist = current_point.get_y() - base_point.get_y(); if(abs(dist) <= AUTOSNIPE_MARGINE) item->translate(0, -dist); dist = current_point.get_x() - base_point.get_x(); if(abs(dist) <= AUTOSNIPE_MARGINE) item->translate(-dist, 0); } } Goocanvas::Bounds bi = item->get_bounds(); bi = item->get_bounds(); if(bi.get_x1() < 0) item->translate(-bi.get_x1(), 0); if(bi.get_y1() < 0) item->translate(0, -bi.get_y1()); snapToGrid(); // updating arrows coordination updateCoordiantes(); } return true; }
void ArrowModel::setLabelPosition(double x, double y) { if(!bNullArrow) { Glib::RefPtr<Goocanvas::Item> item = parentWindow->m_Canvas->get_item(label); if(item) { Goocanvas::Bounds bi = item->get_bounds(); bi = item->get_bounds(); item->translate(x-bi.get_x1(), y-bi.get_y1()); } onPointUpdated(); } }
bool ApplicationModel::onItemMotionNotifyEvent(const Glib::RefPtr<Goocanvas::Item>& item, GdkEventMotion* event) { if(item && _dragging && (item == _dragging)) { parentWindow->setModified(); double new_x = event->x ; double new_y = event->y ; item->get_parent()->translate(new_x - _drag_x, new_y - _drag_y); Goocanvas::Bounds bi = item->get_parent()->get_bounds(); bi = item->get_parent()->get_bounds(); if(bi.get_x1() < 0) item->get_parent()->translate(-bi.get_x1(), 0); if(bi.get_y1() < 0) item->get_parent()->translate(0, -bi.get_y1()); snapToGrid(); bi = item->get_parent()->get_bounds(); this->points.clear(); GyPoint pt; pt.x = bi.get_x1(); pt.y = bi.get_y1(); this->points.push_back(pt); for(int i=0; i<get_n_children(); i++) { if(Glib::RefPtr<ModuleModel>::cast_dynamic(get_child(i))) Glib::RefPtr<ModuleModel>::cast_dynamic(get_child(i))->updateArrowCoordination(); if(Glib::RefPtr<ExternalPortModel>::cast_dynamic(get_child(i))) Glib::RefPtr<ExternalPortModel>::cast_dynamic(get_child(i))->updateArrowCoordination(); } // updating canvas boundries bool needUpdate = false; if(parentWindow->m_Canvas) { Goocanvas::Bounds bc; parentWindow->m_Canvas->get_bounds(bc); needUpdate = (bi.get_x2() > bc.get_x2()) || (bi.get_y2() > bc.get_y2()); if(needUpdate) { new_x = (bi.get_x2() > bc.get_x2()) ? bi.get_x2() : bc.get_x2(); new_y = (bi.get_y2() > bc.get_y2()) ? bi.get_y2() : bc.get_y2(); parentWindow->m_Canvas->set_bounds(0,0, new_x, new_y); if(parentWindow->m_Grid) { g_object_set(parentWindow->m_Grid, "width", new_x, NULL); g_object_set(parentWindow->m_Grid, "height", new_y, NULL); } } } } return true; }
//TODO: check nested applications too void ApplicationModel::getApplicationBounds(Goocanvas::Bounds& bounds) { ModulePContainer modules = parentWindow->manager.getKnowledgeBase()->getModules(application); CnnContainer connections = parentWindow->manager.getKnowledgeBase()->getConnections(application); ApplicaitonPContainer applications = parentWindow->manager.getKnowledgeBase()->getApplications(application); ModulePIterator itr; bounds.set_x1(0); bounds.set_x2(0); bounds.set_y1(0); bounds.set_y2(0); for(itr=modules.begin(); itr!=modules.end(); itr++) { Module* module = (*itr); //if(module->owner() == application) //{ if(module->getModelBase().points.size()>0) { if((bounds.get_x1() == 0) || (module->getModelBase().points[0].x < bounds.get_x1()) ) bounds.set_x1(module->getModelBase().points[0].x); if((bounds.get_x2() == 0) || (module->getModelBase().points[0].x > bounds.get_x1()) ) bounds.set_x2(module->getModelBase().points[0].x); if((bounds.get_y1() == 0) || (module->getModelBase().points[0].y < bounds.get_y1()) ) bounds.set_y1(module->getModelBase().points[0].y); if((bounds.get_y2() == 0) || (module->getModelBase().points[0].y > bounds.get_y2()) ) bounds.set_y2(module->getModelBase().points[0].y); } //} } CnnIterator citr; for(citr=connections.begin(); citr<connections.end(); citr++) { Connection baseCon = *citr; //if(baseCon.owner() == application) //{ GraphicModel model = baseCon.getModelBase(); int size = model.points.size(); for(int i=0; i<size; i++) { if((bounds.get_x1() == -1) || (model.points[i].x < bounds.get_x1()) ) bounds.set_x1(model.points[i].x); if((bounds.get_x2() == -1) || (model.points[i].x > bounds.get_x2()) ) bounds.set_x2(model.points[i].x); if((bounds.get_y1() == -1) || (model.points[i].y < bounds.get_y1()) ) bounds.set_y1(model.points[i].y); if((bounds.get_y2() == -1) || (model.points[i].y > bounds.get_y2()) ) bounds.set_y2(model.points[i].y); } //} } }
int AutomataGui::init(){ //CREATE REFBUILDER this->refBuilder = Gtk::Builder::create(); const std::string gladepath = resourcelocator::findGladeFile("automatagui.glade"); try{ refBuilder->add_from_file(gladepath); }catch (const Glib::FileError& ex){ std::cerr << "FileError: " << ex.what() << std::endl; return -1; }catch (const Glib::MarkupError& ex){ std::cerr << "MarkupError: " << ex.what() << std::endl; return -1; }catch (const Gtk::BuilderError& ex){ std::cerr << "BuilderError: " << ex.what() << std::endl; return -1; } //GETTING WIDGETS refBuilder->get_widget("scrolledwindow_schema", this->scrolledwindow_schema); refBuilder->get_widget("treeview", this->treeView); refBuilder->get_widget("up_button", this->pUpButton); refBuilder->get_widget("check_autofocus", this->checkAutofocus); refBuilder->get_widget("DialogDerived", guiDialog); if(!guiDialog){ std::cerr << "Error: couldn't get DialogDerived" << std::endl; return -1; } this->pUpButton->signal_clicked().connect(sigc::mem_fun(*this, &AutomataGui::on_up_button_clicked)); //INIT CANAVS this->canvas = Gtk::manage(new Goocanvas::Canvas()); this->canvas->signal_item_created().connect(sigc::mem_fun(*this, &AutomataGui::on_item_created)); this->root = Goocanvas::GroupModel::create(); this->canvas->set_root_item_model(root); this->canvas->set_visible(true); this->scrolledwindow_schema->add(*(this->canvas)); //INIT TREEVIEW this->lastExpanded = ""; this->refTreeModel = Gtk::TreeStore::create(this->m_Columns); this->treeView->set_model(this->refTreeModel); this->treeView->append_column("ID", this->m_Columns.m_col_id); Gtk::CellRendererText *cell = new Gtk::CellRendererText; int column_count = treeView->append_column("Name", *cell); Gtk::TreeViewColumn *column = treeView->get_column(column_count-1); if (column) { #ifdef GLIBMM_PROPERTIES_ENABLED column->add_attribute(cell->property_background(), this->m_Columns.m_col_color); column->add_attribute(cell->property_text(), this->m_Columns.m_col_name); #else column->add_attribute(*cell, "background", this->m_Columns.m_col_color); column->add_attribute(*cell, "text", this->m_Columns.m_col_name); #endif } this->treeView->signal_row_activated().connect( sigc::mem_fun(*this, &AutomataGui::on_row_activated)); //Atach handler to the dispatcher this->dispatcher.connect(sigc::mem_fun(*this, &AutomataGui::on_notify_received)); //SETTING CANVAS BOUNDS Glib::RefPtr<Gdk::Screen> screen = this->guiDialog->get_screen(); int width = screen->get_width(); int height = screen->get_height(); Goocanvas::Bounds bounds; this->canvas->get_bounds(bounds); bounds.set_x2(width); bounds.set_y2(height * 2); this->canvas->set_bounds(bounds); return 0; }
bool ExternalPortModel::onItemMotionNotifyEvent(const Glib::RefPtr<Goocanvas::Item>& item, GdkEventMotion* event) { if(bNested) return true; if(item && _dragging && item == _dragging) { parentWindow->setModified(); double new_x = event->x ; double new_y = event->y ; item->get_parent()->translate(new_x - _drag_x, new_y - _drag_y); Goocanvas::Bounds bi = item->get_bounds(); bi = item->get_parent()->get_bounds(); if(bi.get_x1() < 0) item->get_parent()->translate(-bi.get_x1(), 0); if(bi.get_y1() < 0) item->get_parent()->translate(0, -bi.get_y1()); snapToGrid(); // updating arrows coordination updateArrowCoordination(); bool needUpdate = false; if(parentWindow->m_Canvas) { Goocanvas::Bounds bc; parentWindow->m_Canvas->get_bounds(bc); needUpdate = (bi.get_x2() > bc.get_x2()) || (bi.get_y2() > bc.get_y2()); if(needUpdate) { new_x = (bi.get_x2() > bc.get_x2()) ? bi.get_x2() : bc.get_x2(); new_y = (bi.get_y2() > bc.get_y2()) ? bi.get_y2() : bc.get_y2(); parentWindow->m_Canvas->set_bounds(0,0, new_x, new_y); if(parentWindow->m_Grid) { g_object_set(parentWindow->m_Grid, "width", new_x, NULL); g_object_set(parentWindow->m_Grid, "height", new_y, NULL); } } } } return true; }