]> AND Private Git Repository - blast.git/blob - AbstractBoxItem.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
start modifying read/write blocks and project to take into account control ifaces
[blast.git] / AbstractBoxItem.h
1 #ifndef __ABSTRACTBOXITEM_H__
2 #define __ABSTRACTBOXITEM_H__
3
4 #include <iostream>
5
6 #include <QtCore>
7 #include <QtGui>
8 #include <QGraphicsItem>
9
10 class Dispatcher;
11 class InterfaceItem;
12 class Parameters;
13 class AbstractBlock;
14 class GroupScene;
15 class ConnectedInterface;
16
17 class AbstractBoxItem : public QGraphicsItem {
18
19 public:  
20
21   enum BorderType { NoBorder = 0, BorderEast, BorderNorth, BorderWest, BorderSouth, CornerSouthEast, Title};
22   enum ChangeType { Resize = 0, InterfaceMove };
23
24   AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem* parent = Q_NULLPTR);
25   AbstractBoxItem(Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem* parent = Q_NULLPTR);
26
27   virtual ~AbstractBoxItem();
28
29   // getters
30   inline AbstractBlock* getRefBlock() { return refBlock; }
31   inline int getWidth() { return boxWidth;}
32   inline int getHeight() { return boxHeight;}
33   inline int getTotalWidth() { return totalWidth;}
34   inline int getTotalHeight() { return totalHeight; }
35   inline QList<InterfaceItem* > getInterfaces() { return interfaces; }
36   inline InterfaceItem *getCurrentInterface() { return currentInterface; }
37   inline int getId(){ return id; }
38   inline GroupScene* getScene() { return (GroupScene*)(scene()); }
39   inline int getIfaceMargin() { return ifaceMargin; }
40   inline int getNameMargin() { return nameMargin; }
41   inline QPointF getOriginPoint() { return originPoint; }
42
43   // setters
44   void setRefBlock(AbstractBlock* _refBlock);
45   inline void setId(int _id){ id = _id; }
46   inline void setSelected(bool _selected) { selected = _selected; }  
47   void setRstClkVisible(bool b);
48   void setWishboneVisible(bool b);
49   void setDimension(int x, int y);
50   inline void setCurrentInterface(InterfaceItem* iface) { currentInterface = iface; }
51
52   // testers
53   virtual bool isBoxItem();
54   virtual bool isGroupItem();  
55   inline bool isSelected() { return selected; }
56   inline bool isRstClkVisible(){ return rstClkVisible;}
57   inline bool isWishboneVisible(){ return wishboneVisible;}
58   bool isInterfaces(int orientation) const;
59
60   // others
61
62   virtual void interfaceRenamed() = 0;
63   void addInterface(InterfaceItem* i, bool resetPosition = false);
64   void removeInterface(InterfaceItem* i);
65   void resetInterfacesPosition();
66   /*!
67    * \brief moveInterfaceTo
68    * \param pos the new position (in scene) of the interface
69    *
70    * This method is called when user moves an InterfaceItem.
71    * see BoxItem::mouseMoveEvent() and GroupItem::mouseMoveEvent()
72    */
73   void moveInterfaceTo(QPointF pos);
74   /*!
75    * \brief updateInterfacesAndConnections
76    *
77    * This method allows to recompute the absolute position of the interfaces of this box
78    * taking into account their relative position (see positionRatio atribute) in the width/height
79    * of the box border they are located on. It allows update the shape of all ConnectionItem
80    * connected to this box.
81    *
82    * CAUTION: this method supposes that before its call, a call to prepareGeometryChange() hase been
83    * done for the BoxItem that owns this InterfaceItem, so that the scene will readraw automatically
84    * the BoxItem. For the connections, the call to prepareGeometryChange() is done within setPath()
85    * that is called in this method. Thus, there is no need to call update() after the termination of
86    * this method.
87    */
88   void updateInterfacesAndConnections();
89
90   InterfaceItem *searchInterfaceByName(QString name);
91   InterfaceItem *searchInterfaceByRef(ConnectedInterface* ref);
92   InterfaceItem* getInterfaceFromCursor(qreal x, qreal y);  
93
94 protected: 
95   Dispatcher *dispatcher;
96   Parameters *params;
97   QList<InterfaceItem*> interfaces;
98   /* NOTE : the reference block may be a FunctionalBlock or a GroupBlock, depending on the fact
99   that the real instace will be of FunctionalBlock or GroupBlock
100   */
101   AbstractBlock *refBlock;
102
103   InterfaceItem* currentInterface; // currently clicked interface in ItemEdition mode
104
105   BorderType currentBorder; // which border cursor is on
106   QPointF cursorPosition;
107
108   int id;  
109   int boxWidth; // the width of the main box (without interface, title, ...)
110   int boxHeight; // the height of the main box (without interface, title, ...)
111   int minimumBoxWidth; // minimum width of the main box: may be recomputed if position/number of interface changes
112   int minimumBoxHeight; // minimum height of the main box: may be recomputed if position/number of interface changes
113   int totalWidth; // width and heigth taking into account interfaces,title, ...
114   int totalHeight;  
115   int nameWidth; // the width of the  box (group or block) name in Arial 10
116   int nameHeight; // the height of the name in Arial 10
117   int nameMargin; // the margin around each side of the name
118   int ifaceMargin; // the margin around each side of interfaces' name
119   QPointF originPoint; // the left-top point that is the origin of the bounding box
120
121   bool selected;
122   bool rstClkVisible; //! true if clock/reset interfaces are visible
123   bool wishboneVisible; //! true if wishbone interfaces are visible
124
125   QPointF currentPosition; // the start point for resize
126
127   virtual void updateMinimumSize() = 0; // modify the minimum size
128   virtual bool updateGeometry(ChangeType type) = 0; // modify the originPoint and the total dimension
129
130   QRectF boundingRect() const;
131   /* pure virtual method inherited from QGraphicsItem :
132     virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) =0;
133     virtual QRectF boundingRect() const =0;
134   */
135   void initInterfaces();
136   int nbInterfacesByOrientation(int orientation);
137 };
138
139 #endif // __ABSTRACTBOXITEM_H__