TinkerCell Core 1.0
TinkerCell's Core library providing all basic functionalities
NodeGraphicsItem.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 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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines