27 #include <QGraphicsScene>
28 #include <QGraphicsSceneMouseEvent>
31 #include <QPainterPath>
34 #include <QtAlgorithms>
36 #include <QGraphicsSimpleTextItem>
38 #include <boost/math/constants/constants.hpp>
46 connect (edge.get(), SIGNAL(changed()),
this,
48 connect (edge->to().get(), SIGNAL(widthChanged(
double)),
this, SLOT(
updatePathLayout()));
49 connect (edge->from().get(), SIGNAL(widthChanged(
double)),
this, SLOT(
updatePathLayout()));
61 QPointF RootedTreeEdgeItem::startPoint()
63 if (pointer()->dataStructure()->property(
"ShowAllPointers").isValid() && pointer()->dataStructure()->property(
"ShowAllPointers").toBool()){
66 foreach(QGraphicsItem * i, scene()->items(QPointF(pointer()->from()->x(), pointer()->from()->y()))){
67 if (qgraphicsitem_cast<RootedTreeNodeItem*>(i)){
72 if ((pointer()->property(
"TreeEdge").isValid())){
74 const qreal pointersSize = pointer()->
dataStructure()->property(
"PointersRegion").toReal();
76 const qreal size = pointer()->dataStructure()->property(
"NodeSize").toReal();
77 int p = pointer()->property(
"TreeEdge").toInt();
79 return item->mapToScene( QPointF(size/2 ,
80 size * (pointersSize/2) )) ;
82 const qreal division = ((childCount * pointersSize) > 1 ?
83 childCount * pointersSize * size:
85 return item->mapToScene(QPointF(division * (p + 0.5),
86 size * ( 1+ pointersSize + pointersSize/2)) );
92 return QPointF(pointer()->from()->x(),pointer()->from()->y());
96 QPointF RootedTreeEdgeItem::endPoint()
const
98 if (pointer()->dataStructure()->property(
"ShowAllPointers").isValid() && pointer()->dataStructure()->property(
"ShowAllPointers").toBool()){
100 const qreal size = pointer()->dataStructure()->property(
"NodeSize").toReal();
103 foreach(QGraphicsItem * i, scene()->items(QPointF(pointer()->to()->x(), pointer()->to()->y()))){
104 if (qgraphicsitem_cast<RootedTreeNodeItem*>(i)){
109 if (pointer()->property(
"TreeEdge").isValid() && pointer()->property(
"TreeEdge").toInt() != -1) {
110 return item->mapToScene( size/2, -size * 0.05);
111 }
else if (
RootedTreeNode* parentNode = qobject_cast<RootedTreeNode*>(pointer()->to().
get())) {
112 for(quint32 count = 0; count <= parentNode->numberOfChilds(); ++count) {
113 if (parentNode->child(count).get() && parentNode->child(count).get() == pointer()->from().get()) {
114 return item->mapToScene( (count+1) * size/parentNode->numberOfChilds() , size*1.65);
117 return item->mapToScene( size/2 , size*1.65);
122 return QPointF(pointer()->to()->x(), pointer()->to()->y());;
127 const qreal pi = boost::math::constants::pi<double>();
129 QPainterPath painter;
130 if (pointer()->to() && pointer()->from()) {
131 QPointF m_startPoint = startPoint();
132 QPointF m_endPoint = endPoint();
133 QLineF line(m_startPoint, m_endPoint);
134 if (!m_startPoint.isNull()) {
136 if (!pointer()->dataStructure()->property(
"ShowAllPointers").toBool()) {
137 if (pointer()->property(
"TreeEdge").toInt() == -1) {
138 return QPainterPath();
141 painter.moveTo(line.p1());
142 painter.lineTo(line.p2());
144 qreal angle = acos(line.dx() / line.length());
146 angle = pi*2.0 - angle;
148 QPointF arrowP1 = m_endPoint + QPointF(sin(angle - pi/3.0) *
ArrowSize,
150 QPointF arrowP2 = m_endPoint + QPointF(sin(angle - pi + pi/3.0) *
ArrowSize,
154 painter.addEllipse(m_startPoint, 3, 3);
156 painter.addPolygon(QPolygonF() << m_endPoint << arrowP1 << arrowP2 << m_endPoint);
163 #include "RootedTreeEdgeItem.moc"
static const qreal ArrowSize
DataStructurePtr dataStructure() const
QPainterPath createCurves()
boost::shared_ptr< Pointer > PointerPtr
RootedTreeEdgeItem(PointerPtr edge, QGraphicsItem *parent=0)
Default constructor.
virtual ~RootedTreeEdgeItem()