/*!\func * calc size * \params no * \return no */ void EdgeAssotiation::adjust() { if (!sourceNode() || !destNode()) return; prepareGeometryChange(); sourcePoint = sourceNode()->pos() + QPointF(sourceNode()->boundingRect().width()/2, sourceNode()->boundingRect().height()/2); destPoint = destNode()->pos() + QPointF(destNode()->boundingRect().width()/2, destNode()->boundingRect().height()/2); middlePoint = QPointF(destPoint.x(),sourcePoint.y()); }
/*!\func * draw edge * \params no * \return no */ void EdgeAssotiation::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { if (!sourceNode() || !destNode()) return; QColor color (Qt::black); switch (getState()) { case OFF: color = Qt::gray; break; case OK: color = Qt::green; break; case WARNING: default: color = Qt::red; } painter->setPen(QPen(color, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); float width = destNode()->boundingRect().width(); float height = destNode()->boundingRect().height(); QRectF rect(destNode()->pos().x() , destNode()->pos().y(), width, height); width = sourceNode()->boundingRect().width(); height = sourceNode()->boundingRect().height(); QRectF rects(sourceNode()->pos().x(), sourceNode()->pos().y(), width, height); painter->setBrush(color); painter->drawLine(destPoint, middlePoint); painter->drawLine(middlePoint, sourcePoint); painter->setPen(Qt::SolidLine); if(rect.contains(middlePoint)) {//arrow enter in node by left or right int sign = destPoint.x() > sourcePoint.x() ? 1 : -1; //QMessageBox::information(0,"","arrow enter in node by left or right"); QPointF destArrowP1 = QPointF(middlePoint.x() - sign*rect.width()/2, middlePoint.y()); QPointF destArrowP2 = QPointF(middlePoint.x() - sign*(rect.width()/2 + arrowSize), middlePoint.y()-arrowSize/2); QPointF destArrowP3 = QPointF(middlePoint.x() - sign*(rect.width()/2 + arrowSize), middlePoint.y()+arrowSize/2); painter->setBrush(color); painter->drawPolygon(QPolygonF() << destArrowP3 << destArrowP1 << destArrowP2); } else {//arrow enter in node by top or bottom int sign = destPoint.y() > sourcePoint.y() ? 1 : -1; //QMessageBox::information(0,"","arrow enter in node by left or right"); QPointF destArrowP1 = QPointF(destPoint.x(), destPoint.y()-sign*rect.height()/2); QPointF destArrowP2 = QPointF(destPoint.x()-arrowSize/2, destPoint.y() - sign*(rect.height()/2 + arrowSize)); QPointF destArrowP3 = QPointF(destPoint.x()+arrowSize/2, destPoint.y() - sign*(rect.height()/2 + arrowSize)); painter->setBrush(color); painter->drawPolygon(QPolygonF() << destArrowP3 << destArrowP1 << destArrowP2); } if(rects.contains(middlePoint)) name->setPos((sourcePoint + destPoint)/2); else { if(sourcePoint.x() < destPoint.x()) name->setPos(sourcePoint + QPointF(sourceNode()->boundingRect().width()/2,-name->boundingRect().height())); else name->setPos(sourcePoint + QPointF(-name->boundingRect().width()-sourceNode()->boundingRect().width()/2,-name->boundingRect().height())); } }
/*! \func * figure * \param no * \return no */ QPainterPath Edge::shape() const { QPainterPath path; path.moveTo(destNode()->pos() + QPointF(2,2)); path.lineTo(sourceNode()->pos() + QPointF(2,2)); path.lineTo(sourceNode()->pos() + QPointF(-2,-2)); path.lineTo(destNode()->pos() + QPointF(-2,-2)); return path; }
GraphicEdge::~GraphicEdge() { MainWindow* mw = dynamic_cast<MainWindow*>(graph->parent()); mw->net->remove_edge(net_edge); sourceNode()->removeEdge(this); destNode()->removeEdge(this); }
void Edge2d::adjust() { if (!source || !dest) return; QLineF line(mapFromItem(source, sourceNode()->getRadius(), sourceNode()->getRadius()), mapFromItem(dest, destNode()->getRadius(), destNode()->getRadius())); //line centre source à centre dest qreal length = line.length(); prepareGeometryChange(); //cas ou les 2 nodes se chevauchent, on n'afficher pas l'edge if (length > qreal(sourceNode()->getRadius() + destNode()->getRadius())) { // QPointF edgeOffsetSource((line.dx() * sqrt(2) * sourceNode()->getRadius()*2) / length, (line.dy() * 12) / length); //QPointF edgeOffsetDest((line.dx() * 25) / length, (line.dy() * 25) / length); sourcePoint = line.p1();// + edgeOffsetSource; destPoint = line.p2();// - edgeOffsetDest; } else { sourcePoint = destPoint = line.p1(); } }
/*! \func * rect * \params no * \return no */ QRectF EdgeAssotiation::boundingRect() const { if (!sourceNode() || !destNode()) return QRectF(); if(sourcePoint == destPoint) { return QRectF(destPoint.x() - 28, destPoint.y() - 28, 30, 30); } QPointF leftTop(qMin(sourcePoint.x(), destPoint.x())-arrowSize, qMin(sourcePoint.y(), destPoint.y())-arrowSize); QSizeF size(abs(sourcePoint.x() - destPoint.x())+2*arrowSize, abs(sourcePoint.y() - destPoint.y())+2*arrowSize); return QRectF(leftTop, size); }
/*! \func * draw all * \param * - painter - painter device * \return no */ void Edge::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { static const double Pi = 3.14159265358979323846264338327950288419717; static double TwoPi = 2.0 * Pi; if (!source || !dest) return; QColor color (Qt::black); switch (state) { case OFF: color = Qt::gray; break; case OK: color = Qt::green; break; case WARNING: default: color = Qt::red; } // Draw the line itself if(sourceNode()->getId() == destNode()->getId()) { painter->setPen(QPen(color, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter->drawEllipse(destPoint.x() - 28, destPoint.y() - 28, 30, 30); painter->setPen(Qt::black); //painter->drawText(destPoint+QPoint(-28,-14), name); } else { QLineF line(sourcePoint, destPoint); painter->setPen(QPen(color, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter->drawLine(line); // Draw the arrows if there's enough room double angle = ::acos(line.dx() / line.length()); if (line.dy() >= 0) angle = TwoPi - angle; QPointF destArrowP1 = destPoint + QPointF(sin(angle - Pi / 3) * arrowSize, cos(angle - Pi / 3) * arrowSize); QPointF destArrowP2 = destPoint + QPointF(sin(angle - Pi + Pi / 3) * arrowSize, cos(angle - Pi + Pi / 3) * arrowSize); QPointF destArrowP3 = destPoint + QPointF(sin(angle + Pi / 2) * arrowSize, cos(angle + Pi / 2) * arrowSize); painter->setBrush(color); painter->drawPolygon(QPolygonF() << destArrowP3 << destArrowP1 << destArrowP2); painter->setPen(Qt::black); //painter->drawText((destPoint + sourcePoint)/2, name); name->setPos((destPoint + sourcePoint)/2); } }
status_t copy_attributes(const entry_ref& source, const entry_ref& dest) { status_t err; unsigned char* buffer; buffer = new unsigned char[BUFFERLEN]; BNode srcNode(&source); if ((err = srcNode.InitCheck()) != B_NO_ERROR) return err; BNode destNode(&dest); if ((err = destNode.InitCheck()) != B_NO_ERROR) return err; char attrName[B_ATTR_NAME_LENGTH]; srcNode.RewindAttrs(); while ((err = srcNode.GetNextAttrName(attrName)) == B_NO_ERROR) { attr_info info; if ((err = srcNode.GetAttrInfo(attrName, &info)) != B_NO_ERROR) return err; ssize_t nRead; off_t offset = 0; while ((offset < info.size) && ((nRead = srcNode.ReadAttr(attrName, info.type, offset, buffer, BUFFERLEN)) > 0)) { err = destNode.WriteAttr(attrName, info.type, offset, buffer, nRead); if (err < 0) return err; offset += nRead; } } delete buffer; return B_OK; }
//! remove void Edge::Remove() { hide(); sourceNode()->delEdge(this); destNode()->delEdge(this); }