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

Private GIT Repository
finished testbench generation
[blast.git] / AbstractBoxItem.h
index 6eeb46c011f04b5d313df596c58338a5da850bd3..e028728f05c0af97156de53ebce686d2ca62f7d7 100644 (file)
@@ -9,19 +9,31 @@
 
 class Dispatcher;
 class InterfaceItem;
+#include "Parameters.h"
 class Parameters;
 class AbstractBlock;
 class GroupScene;
 class ConnectedInterface;
 
+#define ABI_TO_BI(ptr) ((BoxItem*)ptr)
+#define ABI_TO_GI(ptr) ((GroupItem*)ptr)
+#define ABI_TO_SI(ptr) ((StimuliItem*)ptr)
+
 class AbstractBoxItem : public QGraphicsItem {
 
 public:  
 
   enum BorderType { NoBorder = 0, BorderEast, BorderNorth, BorderWest, BorderSouth, CornerSouthEast, Title};
-  enum ChangeType { Resize = 0, InterfaceMove };
+  enum ChangeType { Creation = 0, Resize, InterfaceMove };
+
+  static int NoLock;
+  static int Position;
+  static int Dimension;
+  static int Interfaces;
+  static int Names;
 
-  AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem* parent = Q_NULLPTR);
+  AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, int _lock = NoLock, QGraphicsItem* parent = Q_NULLPTR);
+  AbstractBoxItem(Dispatcher *_dispatcher, Parameters *_params, int _lock = NoLock, QGraphicsItem* parent = Q_NULLPTR);
 
   virtual ~AbstractBoxItem();
 
@@ -38,32 +50,78 @@ public:
   inline int getIfaceMargin() { return ifaceMargin; }
   inline int getNameMargin() { return nameMargin; }
   inline QPointF getOriginPoint() { return originPoint; }
+  inline int getMinimumBoxWidth() { return minimumBoxWidth; }
+  inline int getMinimumBoxHeight() { return minimumBoxHeight; }
 
   // setters
-  inline void setId(int id){ this->id = id; }
+  void setRefBlock(AbstractBlock* _refBlock);
+  inline void setId(int _id){ id = _id; }
   inline void setSelected(bool _selected) { selected = _selected; }  
-  inline void setRstClkVisible(bool b){ rstClkVisible = b;}
+  inline void setVisible(bool state) { visible = state; }
+  void setRstClkVisible(bool b);
+  void setWishboneVisible(bool b);
   void setDimension(int x, int y);
+  inline void setWidth(int width) { boxWidth = width; }
+  inline void setHeight(int height) {boxHeight = height; }
   inline void setCurrentInterface(InterfaceItem* iface) { currentInterface = iface; }
+  inline void setLock(int _lock) { lock = _lock; }
+  inline void lockPosition() { lock = lock | Position; }
+  inline void unlockPosition() { lock = (lock&Position)^lock; }
+  inline void lockDimension() { lock = lock | Dimension; }
+  inline void unlockDimension() { lock = (lock&Dimension)^lock; }
+  inline void lockInterfaces() { lock = lock | Interfaces; }
+  inline void unlockInterfaces() { lock = (lock&Interfaces)^lock; }
+  inline void lockNames() { lock = lock | Names; }
+  inline void unlockNames() { lock = (lock&Names)^lock; }
 
   // testers
   virtual bool isBoxItem();
-  virtual bool isGroupItem();  
+  virtual bool isGroupItem();
+  virtual bool isStimuliItem();
+  inline bool isVisible() { return visible; }
   inline bool isSelected() { return selected; }
   inline bool isRstClkVisible(){ return rstClkVisible;}
+  inline bool isWishboneVisible(){ return wishboneVisible;}
   bool isInterfaces(int orientation) const;
-
+  inline bool isPositionLock() { return (lock&Position)!=0?true:false; }
+  inline bool isDimensionLock() { return (lock&Dimension)!=0?true:false; }
+  inline bool isInterfacesLock() { return (lock&Interfaces)!=0?true:false; }
+  inline bool isNamesLock() { return (lock&Names)!=0?true:false; }
   // others
+  QRectF boundingRectInScene();
+  virtual void nameChanged() = 0; // called when an interface or box name have changed
+  void addInterfaceItem(InterfaceItem* i, bool resetPosition = false);
+  void removeInterfaceItem(InterfaceItem* i);
+  void resetInterfaceItemsPosition();
+  /*!
+   * \brief moveInterfaceTo
+   * \param pos the new position (in scene) of the interface
+   *
+   * This method is called when user moves an InterfaceItem.
+   * see BoxItem::mouseMoveEvent() and GroupItem::mouseMoveEvent()
+   */
+  void moveInterfaceItemTo(QPointF pos);
+  /*!
+   * \brief updateInterfacesAndConnections
+   *
+   * This method allows to recompute the absolute position of the interfaces of this box
+   * taking into account their relative position (see positionRatio atribute) in the width/height
+   * of the box border they are located on. It allows update the shape of all ConnectionItem
+   * connected to this box.
+   *
+   * CAUTION: this method supposes that before its call, a call to prepareGeometryChange() hase been
+   * done for the BoxItem that owns this InterfaceItem, so that the scene will readraw automatically
+   * the BoxItem. For the connections, the call to prepareGeometryChange() is done within setPath()
+   * that is called in this method. Thus, there is no need to call update() after the termination of
+   * this method.
+   */
+  void updateInterfaceAndConnectionItems();
+
+  InterfaceItem *searchInterfaceItemByName(QString name);
+  InterfaceItem *searchInterfaceItemByRef(ConnectedInterface* ref);
+  InterfaceItem* getInterfaceItemFromCursor(qreal x, qreal y);  
 
-  void addInterface(InterfaceItem* i, bool resetPosition = false);
-  void removeInterface(InterfaceItem* i);
-  void resetInterfacesPosition();
-  void deplaceInterface(QPointF pos);
-  void updateInterfacesAndConnections();
-
-  InterfaceItem *searchInterfaceByName(QString name);
-  InterfaceItem *searchInterfaceByRef(ConnectedInterface* ref);
-  InterfaceItem* getInterfaceFromCursor(qreal x, qreal y);  
+  QRectF boundingRect() const;
 
 protected: 
   Dispatcher *dispatcher;
@@ -90,22 +148,26 @@ protected:
   int nameHeight; // the height of the name in Arial 10
   int nameMargin; // the margin around each side of the name
   int ifaceMargin; // the margin around each side of interfaces' name
-  QPointF originPoint; // the left-top point that is the origin of the bounding box
+  QPointF originPoint; // the left-top point that is the origin of the bounding box, in the item coordinates
 
+  int lock;
   bool selected;
-  bool rstClkVisible;
+  bool visible; //! true if the box is shown
+  bool rstClkVisible; //! true if clock/reset interfaces are visible
+  bool wishboneVisible; //! true if wishbone interfaces are visible
 
-  QPointF currentPosition; // the start point for resize
+  QPointF currentPosition; // the start point for resize, i.e. the position of the lef-top corner of the box, in the scene coordinates
 
   virtual void updateMinimumSize() = 0; // modify the minimum size
   virtual bool updateGeometry(ChangeType type) = 0; // modify the originPoint and the total dimension
 
-  QRectF boundingRect() const;
+
   /* pure virtual method inherited from QGraphicsItem :
     virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) =0;
     virtual QRectF boundingRect() const =0;
-  */
-  void initInterfaces();
+  */   
+  
+  void createInterfaceItems(Parameters::Direction posInputs = Parameters::West, Parameters::Direction posOutputs = Parameters::East, Parameters::Direction posBidirs = Parameters::South);
   int nbInterfacesByOrientation(int orientation);
 };