![]() |
TinkerCell Core 1.0
TinkerCell's Core library providing all basic functionalities
|
00001 /**************************************************************************** 00002 00003 Copyright (c) 2008 Deepak Chandran 00004 Contact: Deepak Chandran (dchandran1@gmail.com) 00005 See COPYRIGHT.TXT 00006 00007 This is the header file for the connection graphics item, which is a Qt graphics path item 00008 that draws a connection between two or more nodes. 00009 00010 The connection graphics items defines a new control point item inside itself. 00011 00012 This header file also contains the arrow head item class. The arrow head item inherits from 00013 node graphics item and is used to draw the arrow heads at the end of the connection items. 00014 00015 00016 ****************************************************************************/ 00017 00018 #ifndef TINKERCELL_CONNECTIONGRAPHICSITEM_H 00019 #define TINKERCELL_CONNECTIONGRAPHICSITEM_H 00020 00021 #include <math.h> 00022 #include <QtDebug> 00023 #include <QString> 00024 #include <QColor> 00025 #include <QPointF> 00026 #include <QPainter> 00027 #include <QGraphicsEllipseItem> 00028 #include <QGraphicsItem> 00029 #include <QStyleOptionGraphicsItem> 00030 #include <QGraphicsScene> 00031 #include "NodeGraphicsItem.h" 00032 00033 namespace Tinkercell 00034 { 00035 class ItemHandle; 00036 00044 TINKERCELLCOREEXPORT QPointF pointOnEdge(const QRectF&, const QPointF&, qreal dist = 0, bool straight = false); 00052 TINKERCELLCOREEXPORT QPointF pointOnEdge(const NodeGraphicsItem&, const QPointF&, qreal dist = 0, bool straight = false); 00053 00054 class GraphicsScene; 00055 class ItemHandle; 00056 class ConnectionGraphicsItem; 00057 00060 class TINKERCELLCOREEXPORT ArrowHeadItem : public NodeGraphicsItem 00061 { 00062 public: 00064 ConnectionGraphicsItem * connectionItem; 00066 qreal angle; 00068 ArrowHeadItem(ConnectionGraphicsItem * c = 0); 00070 ArrowHeadItem(const QString&, ConnectionGraphicsItem * c = 0); 00072 ArrowHeadItem(const ArrowHeadItem&); 00076 virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option=new QStyleOptionGraphicsItem() ,QWidget *widget=0); 00080 virtual NodeGraphicsItem* clone() const; 00085 static ArrowHeadItem* cast(QGraphicsItem *); 00087 enum { Type = UserType + 6 }; 00089 virtual int type() const 00090 { 00091 // Enable the use of dynamic_cast with this item. 00092 return Type; 00093 } 00094 static const QString CLASSNAME; 00095 }; 00096 00099 class TINKERCELLCOREEXPORT ConnectionGraphicsItem : public QGraphicsItemGroup 00100 { 00101 public: 00106 static ConnectionGraphicsItem* cast(QGraphicsItem*); 00111 static QList<ConnectionGraphicsItem*> cast(const QList<QGraphicsItem*>&); 00113 static const QString CLASSNAME; 00115 static QString DefaultMiddleItemFile; 00117 static QString DefaultArrowHeadFile; 00119 QString name; 00121 QString className; 00123 QPen defaultPen; 00128 static ConnectionGraphicsItem * topLevelConnectionItem(QGraphicsItem* item,bool includeControlPoints = false); 00130 ConnectionGraphicsItem(QGraphicsItem * parent = 0 ); 00135 ConnectionGraphicsItem(const QList<NodeGraphicsItem*>&, const QList<NodeGraphicsItem*>&, QGraphicsItem * parent = 0); 00137 ConnectionGraphicsItem(const ConnectionGraphicsItem& copy); 00139 virtual ConnectionGraphicsItem& operator = (const ConnectionGraphicsItem& copy); 00141 virtual ConnectionGraphicsItem& copyPoints (const ConnectionGraphicsItem& copy); 00143 virtual ConnectionGraphicsItem* clone() const; 00145 //virtual QRectF boundingRect() const; 00147 //virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option=new QStyleOptionGraphicsItem() ,QWidget *widget=0); 00149 virtual bool isValid(); 00151 static const int numLineTypes = 2; 00153 QString groupID; 00155 typedef enum {line, bezier} LineType; 00156 00158 LineType lineType; 00159 00162 class TINKERCELLCOREEXPORT ControlPoint : public Tinkercell::ControlPoint 00163 { 00164 public: 00166 ConnectionGraphicsItem * connectionItem; 00168 ControlPoint(ConnectionGraphicsItem * reaction_ptr = 0, QGraphicsItem * parent = 0); 00170 ControlPoint(const QPointF& pos, ConnectionGraphicsItem * reaction_ptr = 0, QGraphicsItem * parent = 0); 00172 ControlPoint(const ControlPoint& copy); 00174 virtual ControlPoint& operator = (const ControlPoint& copy); 00176 enum { Type = UserType + 7 }; 00178 virtual int type() const 00179 { 00180 // Enable the use of dynamic_cast with this item. 00181 return Type; 00182 } 00184 ~ControlPoint(); 00186 //virtual void sideEffect(); 00188 virtual Tinkercell::ControlPoint* clone() const; 00190 virtual ItemHandle * handle() const; 00192 virtual void setHandle(ItemHandle *); 00193 }; 00194 00196 virtual ItemHandle * handle() const; 00197 00199 virtual void setHandle(ItemHandle *); 00200 00201 00204 class TINKERCELLCOREEXPORT CurveSegment : public QVector<ConnectionGraphicsItem::ControlPoint*> 00205 { 00206 public: 00207 CurveSegment(); 00208 CurveSegment(int); 00209 CurveSegment(int,ConnectionGraphicsItem::ControlPoint*); 00210 CurveSegment(const CurveSegment&); 00211 ArrowHeadItem *arrowStart, *arrowEnd; 00212 }; 00213 00215 QList<CurveSegment> curveSegments; 00217 qreal arrowHeadDistance; 00219 virtual QList<ControlPoint*> controlPoints(bool includeEnds = false) const; 00221 virtual QList<QGraphicsItem*> controlPointsAsGraphicsItems(bool includeEnds = false) const; 00223 virtual QPainterPath shape() const; 00227 virtual void setPath(const QPainterPath& path); 00231 virtual void clear(bool all=false); 00235 virtual void refresh(bool arrows=true); 00240 virtual void setPen(QPen pen, bool permanently=false); 00243 virtual QPen pen() const; 00247 virtual void setControlPointsVisible(bool visible = true); 00250 void showControlPoints(); 00253 void hideControlPoints(); 00256 virtual bool isModifier() const; 00259 virtual QList<NodeGraphicsItem*> nodes() const; 00262 virtual QList<NodeGraphicsItem*> nodesWithArrows() const; 00265 virtual QList<NodeGraphicsItem*> nodesWithoutArrows() const; 00268 virtual QList<NodeGraphicsItem*> nodesDisconnected() const; 00271 virtual QList<QGraphicsItem*> nodesAsGraphicsItems() const; 00274 virtual QList<ArrowHeadItem*> arrowHeads() const; 00277 virtual QList<QGraphicsItem*> arrowHeadsAsGraphicsItems() const; 00280 virtual QList<ArrowHeadItem*> modifierArrowHeads() const; 00284 virtual NodeGraphicsItem* nodeAt(int index) const; 00288 virtual int indexOf(QGraphicsItem * node) const; 00293 virtual void replaceNodeAt(int,NodeGraphicsItem*); 00298 virtual void replaceNode(NodeGraphicsItem*,NodeGraphicsItem*); 00302 virtual ArrowHeadItem* arrowAt(int index) const; 00306 virtual ArrowHeadItem* modifierArrowAt(int index) const; 00308 virtual ~ConnectionGraphicsItem(); 00310 virtual qreal slopeAtPoint(const QPointF& point); 00312 bool controlPointsVisible; 00314 virtual ControlPoint * centerPoint() const; 00316 virtual QPointF centerLocation() const; 00318 QSizeF centerRegion; 00320 ArrowHeadItem * centerRegionItem; 00322 virtual QRectF boundingRect() const; 00324 virtual QRectF sceneBoundingRect() const; 00326 enum { Type = UserType + 5 }; 00328 virtual int type() const 00329 { 00330 // Enable the use of dynamic_cast with this item. 00331 return Type; 00332 } 00333 protected: 00335 ItemHandle * itemHandle; 00337 QGraphicsPathItem * boundaryPathItem; 00339 QGraphicsPathItem * outerPathItem; 00341 QGraphicsPathItem * mainPathItem; 00343 QPainterPath pathShape; 00345 QRectF pathBoundingRect; 00347 virtual void refreshBoundaryPath(); 00350 virtual void adjustEndPoints(bool arrows=true); 00351 }; 00352 00353 } 00354 #endif 00355