TinkerCell Core 1.0
TinkerCell's Core library providing all basic functionalities
ConnectionGraphicsItem.h
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines