![]() |
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 One of the main classes in Tinkercell. 00008 00009 The NodeGraphicsItem is a group made up of Shapes. Each Shape is a polygon item. 00010 Each shape has a default color. The purpose of the default color is to allow plugins 00011 to change color temporarily and then revert back to the default. 00012 00013 00014 ****************************************************************************/ 00015 00016 #ifndef TINKERCELL_NODEGRAPHICSITEM_H 00017 #define TINKERCELL_NODEGRAPHICSITEM_H 00018 00019 #include <math.h> 00020 #include <QObject> 00021 #include <QtDebug> 00022 #include <QString> 00023 #include <QColor> 00024 #include <QPoint> 00025 #include <QPainter> 00026 #include <QGraphicsPolygonItem> 00027 #include <QAbstractGraphicsShapeItem> 00028 #include <QGraphicsItemGroup> 00029 #include <QGraphicsRectItem> 00030 #include <QStyleOptionGraphicsItem> 00031 #include <QGraphicsScene> 00032 #include <QTransform> 00033 #include <QUndoCommand> 00034 #include <QTextCursor> 00035 #include "ControlPoint.h" 00036 00037 namespace Tinkercell 00038 { 00039 class GraphicsScene; 00040 class ItemHandle; 00041 class ConnectionGraphicsItem; 00042 class NodeGraphicsItem; 00043 TINKERCELLCOREEXPORT void setHandle(QGraphicsItem*,ItemHandle*); 00044 00047 class TINKERCELLCOREEXPORT NodeGraphicsItem : public QGraphicsItemGroup 00048 { 00049 public: 00054 static NodeGraphicsItem* cast(QGraphicsItem *); 00059 static QList<NodeGraphicsItem*> cast(const QList<QGraphicsItem*>&); 00061 virtual ItemHandle * handle() const; 00063 virtual void setHandle(ItemHandle *); 00065 QString className; 00067 static const QString CLASSNAME; 00072 static NodeGraphicsItem * topLevelNodeItem(QGraphicsItem* item, bool ignoreControlPoints = false); 00074 QString name; 00076 NodeGraphicsItem(QGraphicsItem * parent = 0 ); 00078 NodeGraphicsItem(const QString& filename, QGraphicsItem * parent=0); 00080 NodeGraphicsItem(const NodeGraphicsItem& copy); 00082 virtual NodeGraphicsItem& operator = (const NodeGraphicsItem& copy); 00084 virtual NodeGraphicsItem* clone() const; 00086 virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option=new QStyleOptionGraphicsItem() ,QWidget *widget=0); 00088 bool isValid() const; 00090 static const int numShapeTypes = 4; 00092 enum ShapeType {arc, line, bezier, rectangle}; 00094 QSizeF defaultSize; 00097 class TINKERCELLCOREEXPORT ControlPoint : public Tinkercell::ControlPoint 00098 { 00099 public: 00101 NodeGraphicsItem * nodeItem; 00103 ControlPoint(NodeGraphicsItem * idrawable_ptr = 0, QGraphicsItem * parent = 0); 00105 ControlPoint(const ControlPoint& copy); 00107 virtual ControlPoint& operator = (const ControlPoint& copy); 00109 virtual Tinkercell::ControlPoint* clone() const; 00111 enum { Type = UserType + 2 }; 00113 virtual int type() const 00114 { 00115 // Enable the use of dynamic_cast with this item. 00116 return Type; 00117 } 00119 virtual void sideEffect(); 00121 virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option=new QStyleOptionGraphicsItem() ,QWidget *widget=0); 00123 virtual ItemHandle * handle() const; 00125 virtual void setHandle(ItemHandle *); 00127 ~ControlPoint(); 00128 }; 00129 00132 class TINKERCELLCOREEXPORT Shape : public QGraphicsPolygonItem 00133 { 00134 public: 00136 QBrush defaultBrush; 00138 QPen defaultPen; 00140 Shape(NodeGraphicsItem * idrawable_ptr = 0, QGraphicsItem * parent = 0, QGraphicsScene * scene = 0); 00142 Shape(const Shape & copy); 00144 virtual Shape& operator = (const Shape& copy); 00146 //void paint(QPainter *painter, const QStyleOptionGraphicsItem *option=new QStyleOptionGraphicsItem() ,QWidget *widget=0); 00148 NodeGraphicsItem *nodeItem; 00150 bool negative; 00156 void refresh(); 00158 bool isClosed() const; 00160 QVector<ControlPoint*> controlPoints; 00162 QVector<qreal> parameters; 00164 QVector<ShapeType> types; 00166 QPolygonF polygon; 00168 QPainterPath path; 00170 virtual QPainterPath shape() const; 00172 QPair<QPointF,QPointF> gradientPoints; 00174 virtual QRectF boundingRect() const; 00176 enum { Type = UserType + 3 }; 00178 virtual int type() const 00179 { 00180 // Enable the use of dynamic_cast with this item. 00181 return Type; 00182 } 00183 protected: 00185 QRectF boundingRectangle; 00187 virtual void recomputeBoundingRect(); 00188 }; 00190 virtual void addControlPoint(ControlPoint * control); 00192 virtual void addShape(Shape* shape); 00194 virtual void removeControlPoint(ControlPoint * control); 00196 virtual void removeShape(Shape* shape); 00198 virtual void setBrush(const QBrush& newBrush); 00200 virtual void setAlpha(int value); 00202 virtual void setPen(const QPen& newPen); 00204 virtual void resetBrush(); 00206 virtual void resetPen(); 00208 virtual void resetToDefaults(); 00210 virtual QPolygonF polygon() const; 00212 virtual QPainterPath shape() const; 00214 QVector<Shape*> shapes; 00216 QVector<ControlPoint*> controlPoints; 00222 virtual void refresh(); 00226 virtual void normalize(); 00230 virtual void clear(); 00232 virtual QRectF boundingRect() const; 00234 virtual ~NodeGraphicsItem(); 00236 QVector<ControlPoint*> boundaryControlPoints; 00238 virtual QList<Tinkercell::ControlPoint*> allControlPoints() const; 00240 virtual void adjustBoundaryControlPoints(); 00242 virtual void adjustToBoundaryControlPoints(); 00244 virtual void setBoundingRect(const QPointF&, const QPointF&); 00246 virtual void setBoundingBoxVisible(bool visible = true, bool controlPoints = true); 00248 void showBoundingBox(bool controlPoints = true); 00250 void hideBoundingBox(bool controlPoints = true); 00252 enum { Type = UserType + 4 }; 00254 virtual int type() const 00255 { 00256 // Enable the use of dynamic_cast with this item. 00257 return Type; 00258 } 00260 QString groupID; 00262 virtual QList<ConnectionGraphicsItem*> connections() const; 00264 virtual QList<NodeGraphicsItem*> connectedNodes() const; 00266 virtual QList<ConnectionGraphicsItem*> connectionsWithArrows() const; 00268 virtual QList<ConnectionGraphicsItem*> connectionsWithoutArrows() const; 00270 virtual QList<ConnectionGraphicsItem*> connectionsDisconnected() const; 00272 virtual QList<QGraphicsItem*> connectionsAsGraphicsItems() const; 00274 virtual QList<NodeGraphicsItem*> nodesAdjacent() const; 00279 virtual QList<NodeGraphicsItem*> nodesUpstream() const; 00284 virtual QList<NodeGraphicsItem*> nodesDownstream() const; 00286 virtual QList<NodeGraphicsItem*> nodesToLeft() const; 00288 virtual QList<NodeGraphicsItem*> nodesToRight() const; 00290 virtual QList<NodeGraphicsItem*> nodesAbove() const; 00292 virtual QList<NodeGraphicsItem*> nodesBelow() const; 00294 virtual Shape * tallestShape() const; 00296 virtual Shape * longestShape() const; 00298 virtual Shape * leftMostShape() const; 00300 virtual Shape * rightMostShape() const; 00302 virtual Shape * topMostShape() const; 00304 virtual Shape * bottomMostShape() const; 00305 protected: 00307 QRectF boundingRectangle; 00309 virtual void recomputeBoundingRect(); 00311 virtual qreal getPenWidthForBoundingRect(); 00313 ItemHandle * itemHandle; 00315 QGraphicsRectItem * boundingBoxItem; 00316 }; 00317 00318 } 00319 #endif