• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

rocs/RocsCore

  • sources
  • kde-4.12
  • kdeedu
  • rocs
  • RocsCore
  • DataStructures
  • RootedTree
RootedTreeEdgeItem.cpp
Go to the documentation of this file.
1 /*
2  This file is part of RootedTree (Rocs Plugin).
3  Copyright 2012 Wagner Reck <wagner.reck@gmail.com>
4 
5  This program is free software; you can redistribute it and/or
6  modify it under the terms of the GNU General Public License as
7  published by the Free Software Foundation; either version 2 of
8  the License, or (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include "RootedTreeEdgeItem.h"
20 #include "RootedTreeStructure.h"
21 #include "RootedTreeNodeItem.h"
22 
23 #include "Data.h"
24 #include "Pointer.h"
25 #include "DataStructure.h"
26 
27 #include <QGraphicsScene>
28 #include <QGraphicsSceneMouseEvent>
29 #include <QPainter>
30 #include <QPen>
31 #include <QPainterPath>
32 #include <QLine>
33 #include <QPolygonF>
34 #include <QtAlgorithms>
35 #include <KDebug>
36 #include <QGraphicsSimpleTextItem>
37 #include "RootedTreeNode.h"
38 #include <boost/math/constants/constants.hpp>
39 
40 
41 static const qreal ArrowSize = 10.0;
42 
43 RootedTreeEdgeItem::RootedTreeEdgeItem(PointerPtr edge, QGraphicsItem *parent)
44  : PointerItem(edge, parent)
45 {
46  connect (edge.get(), SIGNAL(changed()), this,
47  SLOT(updatePathLayout()));
48  connect (edge->to().get(), SIGNAL(widthChanged(double)), this, SLOT(updatePathLayout()));
49  connect (edge->from().get(), SIGNAL(widthChanged(double)), this, SLOT(updatePathLayout()));
50  QTimer::singleShot(50, this, SLOT(updatePathLayout()));
51 }
52 
53 RootedTreeEdgeItem::~RootedTreeEdgeItem() {
54 }
55 
56 void RootedTreeEdgeItem::updatePathLayout() {
57  setPath(createCurves());
58  update();
59 }
60 
61 QPointF RootedTreeEdgeItem::startPoint()
62 {
63  if (pointer()->dataStructure()->property("ShowAllPointers").isValid() && pointer()->dataStructure()->property("ShowAllPointers").toBool()){
64  if (scene()){
65  RootedTreeNodeItem * item = 0;
66  foreach(QGraphicsItem * i, scene()->items(QPointF(pointer()->from()->x(), pointer()->from()->y()))){
67  if (qgraphicsitem_cast<RootedTreeNodeItem*>(i)){
68  item = qgraphicsitem_cast<RootedTreeNodeItem*>(i);
69  }
70  }
71  if(item) {
72  if ((pointer()->property("TreeEdge").isValid())){
73  RootedTreeNode* fromNode = qobject_cast<RootedTreeNode*>(pointer()->from().get());
74  const qreal pointersSize = pointer()->dataStructure()->property("PointersRegion").toReal();
75  qint16 childCount = fromNode->numberOfChilds();
76  const qreal size = pointer()->dataStructure()->property("NodeSize").toReal();
77  int p = pointer()->property("TreeEdge").toInt();
78  if (p < 0)
79  return item->mapToScene( QPointF(size/2 ,
80  size * (pointersSize/2) )) ;//Draw as Parent
81  else{
82  const qreal division = ((childCount * pointersSize) > 1 ?
83  childCount * pointersSize * size:
84  size) / childCount;
85  return item->mapToScene(QPointF(division * (p + 0.5),
86  size * ( 1+ pointersSize + pointersSize/2)) );
87  }
88  }
89  }
90  }
91  }
92  return QPointF(pointer()->from()->x(),pointer()->from()->y());
93 }
94 
95 
96 QPointF RootedTreeEdgeItem::endPoint() const
97 {
98  if (pointer()->dataStructure()->property("ShowAllPointers").isValid() && pointer()->dataStructure()->property("ShowAllPointers").toBool()){
99 
100  const qreal size = pointer()->dataStructure()->property("NodeSize").toReal();
101  if (scene()){
102  RootedTreeNodeItem * item = 0;
103  foreach(QGraphicsItem * i, scene()->items(QPointF(pointer()->to()->x(), pointer()->to()->y()))){
104  if (qgraphicsitem_cast<RootedTreeNodeItem*>(i)){
105  item = qgraphicsitem_cast<RootedTreeNodeItem*>(i);
106  }
107  }
108  if(item) {
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);
115  }
116  }
117  return item->mapToScene( size/2 , size*1.65);
118  }
119  }
120  }
121  }
122  return QPointF(pointer()->to()->x(), pointer()->to()->y());;
123 }
124 
125 QPainterPath RootedTreeEdgeItem::createCurves()
126 {
127  const qreal pi = boost::math::constants::pi<double>();
128 
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()) {
135 
136  if (!pointer()->dataStructure()->property("ShowAllPointers").toBool()) {
137  if (pointer()->property("TreeEdge").toInt() == -1) {
138  return QPainterPath();
139  }
140  }
141  painter.moveTo(line.p1());
142  painter.lineTo(line.p2());
143 
144  qreal angle = acos(line.dx() / line.length());
145  if (line.dy() >= 0){
146  angle = pi*2.0 - angle;
147  }
148  QPointF arrowP1 = m_endPoint + QPointF(sin(angle - pi/3.0) * ArrowSize,
149  cos(angle - pi/3.0) * ArrowSize);
150  QPointF arrowP2 = m_endPoint + QPointF(sin(angle - pi + pi/3.0) * ArrowSize,
151  cos(angle - pi + pi/3.0) * ArrowSize);
152 
153 
154  painter.addEllipse(m_startPoint, 3, 3);
155 
156  painter.addPolygon(QPolygonF() << m_endPoint << arrowP1 << arrowP2 << m_endPoint);
157  }
158  }
159  return painter;
160 }
161 
162 
163 #include "RootedTreeEdgeItem.moc"
RootedTreeEdgeItem::updatePathLayout
void updatePathLayout()
Definition: RootedTreeEdgeItem.cpp:56
RootedTreeStructure.h
ArrowSize
static const qreal ArrowSize
Definition: RootedTreeEdgeItem.cpp:41
Data::dataStructure
DataStructurePtr dataStructure() const
Definition: Data.cpp:150
RootedTreeEdgeItem::createCurves
QPainterPath createCurves()
Definition: RootedTreeEdgeItem.cpp:125
Data.h
RootedTreeEdgeItem.h
PointerPtr
boost::shared_ptr< Pointer > PointerPtr
Definition: CoreTypes.h:35
DataStructure.h
RootedTreeNode::numberOfChilds
quint32 numberOfChilds
Definition: RootedTreeNode.h:29
RootedTreeNodeItem
Definition: RootedTreeNodeItem.h:27
Pointer.h
PointerItem
RootedTreeEdgeItem::RootedTreeEdgeItem
RootedTreeEdgeItem(PointerPtr edge, QGraphicsItem *parent=0)
Default constructor.
Definition: RootedTreeEdgeItem.cpp:43
RootedTreeNode.h
RootedTreeEdgeItem::~RootedTreeEdgeItem
virtual ~RootedTreeEdgeItem()
Definition: RootedTreeEdgeItem.cpp:53
RootedTreeNode
Definition: RootedTreeNode.h:25
RootedTreeNodeItem.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:42:26 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

rocs/RocsCore

Skip menu "rocs/RocsCore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal