X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/d43174d0eb3d293b3bb5fbe76662241134e74d0d..d111eaf49741a0a79d372445f97c314a637e331e:/AbstractBoxItem.cpp?ds=inline diff --git a/AbstractBoxItem.cpp b/AbstractBoxItem.cpp index c4cdae9..391f795 100644 --- a/AbstractBoxItem.cpp +++ b/AbstractBoxItem.cpp @@ -8,6 +8,7 @@ #include "AbstractBlock.h" #include "GroupScene.h" +#include "GroupItem.h" #include "AbstractInterface.h" #include "ConnectedInterface.h" @@ -19,7 +20,7 @@ AbstractBoxItem:: AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispat QFontMetrics fmId(params->defaultBlockFont); nameWidth = fmId.width(refBlock->getName()); nameHeight = fmId.height(); - nameMargin = 10; + nameMargin = 5; ifaceMargin = 10; // the six following values will be override in subclass constructors @@ -35,6 +36,7 @@ AbstractBoxItem:: AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispat selected = false; currentInterface = NULL; rstClkVisible = false; + wishboneVisible = false; setAcceptHoverEvents(true); @@ -63,7 +65,8 @@ AbstractBoxItem::AbstractBoxItem(Dispatcher *_dispatcher, Parameters *_params, Q selected = false; currentInterface = NULL; rstClkVisible = false; - + wishboneVisible = false; + setAcceptHoverEvents(true); // NOTE : initInterfaces() is only called in subclasses @@ -84,6 +87,40 @@ bool AbstractBoxItem::isGroupItem() { return false; } +bool AbstractBoxItem::isSourceItem() { + return false; +} + +void AbstractBoxItem::setRstClkVisible(bool b) { + rstClkVisible = b; + foreach(InterfaceItem* ifaceItem, interfaces) { + if ((ifaceItem->refInter->getPurpose() == AbstractInterface::Clock) || + (ifaceItem->refInter->getPurpose() == AbstractInterface::Reset) ) { + ifaceItem->visible = b; + } + } + resetInterfacesPosition(); + updateGeometry(InterfaceMove); + update(); + getScene()->updateConnectionItemsShape(); + (getScene()->getGroupItem())->updateShape(); + +} + +void AbstractBoxItem::setWishboneVisible(bool b) { + wishboneVisible = b; + foreach(InterfaceItem* ifaceItem, interfaces) { + if (ifaceItem->refInter->getPurpose() == AbstractInterface::Wishbone) { + ifaceItem->visible = b; + } + } + resetInterfacesPosition(); + updateGeometry(InterfaceMove); + update(); + getScene()->updateConnectionItemsShape(); + (getScene()->getGroupItem())->updateShape(); +} + void AbstractBoxItem::setRefBlock(AbstractBlock* _refBlock) { refBlock = _refBlock; QFontMetrics fmId(params->defaultBlockFont); @@ -96,7 +133,10 @@ void AbstractBoxItem::initInterfaces() { int orientation = Parameters::West; foreach(AbstractInterface *inter, refBlock->getInterfaces()){ - if(inter->getPurpose() != AbstractInterface::Wishbone){ + + /* NB: does not create InterfaceItem for control interfaces. + */ + if (inter->getPurpose() != AbstractInterface::Control) { InterfaceItem *item; if(inter->getDirection() == AbstractInterface::Input){ orientation = Parameters::West; @@ -106,9 +146,9 @@ void AbstractBoxItem::initInterfaces() { orientation = Parameters::North; } item = new InterfaceItem(0.0 , orientation, (ConnectedInterface *)inter, this, params); - interfaces.append(item); + interfaces.append(item); } - } + } } InterfaceItem* AbstractBoxItem::searchInterfaceByName(QString name) { @@ -155,7 +195,7 @@ void AbstractBoxItem::resetInterfacesPosition() { foreach(InterfaceItem* inter, interfaces) { // only data interfaces and if needed time and reset - if(inter->refInter->getPurpose() == AbstractInterface::Data || inter->getOwner()->isRstClkVisible()){ + if(inter->visible) { if(inter->getOrientation() == Parameters::North){ nbNorth++; } else if(inter->getOrientation() == Parameters::South){ @@ -170,7 +210,7 @@ void AbstractBoxItem::resetInterfacesPosition() { foreach(InterfaceItem* inter, interfaces) { - if(inter->refInter->getPurpose() == AbstractInterface::Data || inter->getOwner()->isRstClkVisible()){ + if(inter->visible){ if(inter->getOrientation() == Parameters::North){ positionRatio = cntNorth/(double)(nbNorth+1); @@ -229,11 +269,26 @@ void AbstractBoxItem::moveInterfaceTo(QPointF pos) { QRectF AbstractBoxItem::boundingRect() const { // returns a QRectF that contains the block (i.e the main rectangle, interfaces, title, ...) - QPointF p = originPoint - QPointF(nameHeight,nameHeight); - QSizeF s(totalWidth+2*nameHeight,totalHeight+2*nameHeight); + QPointF p = originPoint; + QSizeF s(totalWidth,totalHeight); return QRectF(p,s); } +QRectF AbstractBoxItem::boundingRectInScene() { + /* returns a QRectF in scene coordinates, that contains the block plus + a margin of size arrowWidth+arrowLineLength + */ + int marginConn = params->arrowLineLength+params->arrowWidth; + + QPointF posBox = scenePos(); + posBox.setX(posBox.x()+originPoint.x()-marginConn); + posBox.setY(posBox.y()+originPoint.y()-marginConn); + + QSizeF sizeBox(totalWidth+2*marginConn,totalHeight+2*marginConn); + + return QRectF(posBox,sizeBox); +} + /* isInterface() : return true if there are some interfaces with the given orientation (N,S,E,O)