X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/0d3590739ff5a4ca9e87c052ac142f5d1d3a68ab..2bdaa0aa3fab52f0808f60d9bbdabcd56d0efae9:/SourceItem.cpp diff --git a/SourceItem.cpp b/SourceItem.cpp index 82a41b0..0229e7f 100644 --- a/SourceItem.cpp +++ b/SourceItem.cpp @@ -30,9 +30,9 @@ SourceItem::SourceItem(AbstractBlock *_refBlock, setZValue(100); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges); - initInterfaces(); + createInterfaceItems(); updateGeometry(InterfaceMove); - resetInterfacesPosition(); + resetInterfaceItemsPosition(); QPointF initPos = QPointF(0.0,0.0) - originPoint; setPos(initPos); //cout << "total size of block: " << totalWidth << "," << totalHeight << endl; @@ -142,6 +142,7 @@ void SourceItem::updateMinimumSize() { if (minimumBoxHeight < (nbMaxEW*ifaceHeight+ifaceMargin*(nbMaxEW+1))) { minimumBoxHeight = (nbMaxEW*ifaceHeight+ifaceMargin*(nbMaxEW+1)); } + cout << "source minimum size = " << minimumBoxWidth << "x" << minimumBoxHeight << endl; } @@ -176,7 +177,7 @@ bool SourceItem::updateGeometry(ChangeType type) { } } if (boxSizeChanged) { - updateInterfacesAndConnections(); + updateInterfaceAndConnectionItems(); } @@ -203,6 +204,7 @@ bool SourceItem::updateGeometry(ChangeType type) { originPoint.setX(x); originPoint.setY(y); + cout << "source size = " << totalWidth << "x" << totalHeight << endl; if ((boxSizeChanged) || (newSize != oldSize) || (originPoint != oldOrigin)) { prepareGeometryChange(); return true; @@ -217,32 +219,34 @@ void SourceItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { int gapX = event->scenePos().x() - cursorPosition.x(); int gapY = event->scenePos().y() - cursorPosition.y(); - - //cout << "block abs. pos: " << absPos.x() << "," << absPos.y() << " | "; - //cout << "block current. pos: " << currentPosition.x() << "," << currentPosition.y() << " | "; - + + bool canMove = true; + + QRectF rectSource = boundingRectInScene(); + rectSource.moveTo(rectSource.x()+gapX,rectSource.y()+gapY); + GroupItem* group = getScene()->getGroupItem(); + QRectF rectGroup = group->boundingRectInScene(); + if (rectSource.intersects(rectGroup)) canMove = false; /* - if (absPos.x()+gapX < marginConn) { - gapX = marginConn-absPos.x(); - } - if (absPos.y()+gapY < marginConn) { - gapY = marginConn-absPos.y(); + if (canMove) { + foreach(SourceItem* source, getScene()->getSourceItems()) { + QRectF rectOther = source->boundingRectInScene(); + if ((source != this) && (rectSource.intersects(rectOther))) canMove = false; + } } */ - //cout << "gap: " << gapX << "," << gapY << endl; - QPointF gap(gapX,gapY); - currentPosition = currentPosition+gap; - setPos(currentPosition); - // update all connections from/to this block - foreach(ConnectionItem *item, getScene()->getConnectionItems()){ - if ((item->getFromInterfaceItem()->getOwner() == this) || (item->getToInterfaceItem()->getOwner() == this)) { - item->setPath(); - } + if (canMove) { + QPointF gap(gapX,gapY); + currentPosition = currentPosition+gap; + setPos(currentPosition); + // update all connections from/to this block + foreach(ConnectionItem *item, getScene()->getConnectionItems()){ + if ((item->getFromInterfaceItem()->getOwner() == this) || (item->getToInterfaceItem()->getOwner() == this)) { + item->setPath(); + } + } } cursorPosition = event->scenePos(); - - // udpate the groupitem - (getScene()->getGroupItem())->updateShape(); } else if(params->editState == Parameters::EditBlockResize) { @@ -284,7 +288,7 @@ void SourceItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { } else if(params->editState == Parameters::EditInterfaceMove) { prepareGeometryChange(); - moveInterfaceTo(event->pos()); + moveInterfaceItemTo(event->pos()); // recompute the geometry of the block if (updateGeometry(InterfaceMove)) { //cout << "must recompute group item geometry" << endl; @@ -311,10 +315,10 @@ void SourceItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { int mode = getScene()->getEditionMode(); - dispatcher->setCurrentGroupWidget(getScene()->getGroupWidget()); + dispatcher->setCurrentGroupWidget(Dispatcher::Design, getScene()->getGroupWidget()); if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) { - InterfaceItem *inter = getInterfaceFromCursor(x,y); + InterfaceItem *inter = getInterfaceItemFromCursor(x,y); if (inter != NULL) { if (params->editState == Parameters::EditNoOperation) { @@ -333,9 +337,9 @@ void SourceItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { } } else if (mode == GroupScene::ItemEdition) { - setZValue(zValue()+100); + //setZValue(zValue()+100); if (params->cursorState == Parameters::CursorOnInterface) { - InterfaceItem *inter = getInterfaceFromCursor(x,y); + InterfaceItem *inter = getInterfaceItemFromCursor(x,y); if (inter != NULL) { if (inter == currentInterface) { params->setEditState(Parameters::EditInterfaceDeselect); @@ -364,7 +368,7 @@ void SourceItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { void SourceItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { - setZValue(zValue()-100); + //setZValue(zValue()-100); int mode = getScene()->getEditionMode(); @@ -385,10 +389,12 @@ void SourceItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { else if (params->editState == Parameters::EditCloseConnection) { InterfaceItem* iface1 = getScene()->getSelectedInterface(1); InterfaceItem* iface2 = getScene()->getSelectedInterface(2); - bool ok = dispatcher->createConnectionItem(iface1,iface2); + bool ok = dispatcher->createConnection(Dispatcher::Design, iface1,iface2); if (ok) { iface1->selected = false; - // no update needed since the whole scene will be repainted + update(iface1->boundingRect()); + iface2->selected = false; + update(iface2->boundingRect()); getScene()->setSelectedInterface(1,NULL); getScene()->setSelectedInterface(2,NULL); params->setEditState(Parameters::EditNoOperation); @@ -418,7 +424,7 @@ void SourceItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) { int mode = getScene()->getEditionMode(); if (mode == GroupScene::AddConnection) { - InterfaceItem* iface = getInterfaceFromCursor(x,y); + InterfaceItem* iface = getInterfaceItemFromCursor(x,y); if (iface != NULL) { params->cursorState = Parameters::CursorOnInterface; setCursor(Qt::PointingHandCursor); @@ -432,7 +438,7 @@ void SourceItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) { int marginE = 5; int marginS = 5; - InterfaceItem* iface = getInterfaceFromCursor(x,y); + InterfaceItem* iface = getInterfaceItemFromCursor(x,y); if (iface != NULL) { params->cursorState = Parameters::CursorOnInterface; setCursor(Qt::PointingHandCursor); @@ -474,7 +480,8 @@ void SourceItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) { } } } - QGraphicsItem::hoverMoveEvent(event); + //QGraphicsItem::hoverMoveEvent(event); + event->ignore(); } @@ -489,12 +496,14 @@ void SourceItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) { QAction* renameAction = NULL; QAction* showProperties = NULL; QAction* showParameters = NULL; + QAction* showPatterns = NULL; - - InterfaceItem* ifaceItem = getInterfaceFromCursor(event->pos().x(), event->pos().y()); + InterfaceItem* ifaceItem = getInterfaceItemFromCursor(event->pos().x(), event->pos().y()); // menu for interface if( ifaceItem != NULL){ + ConnectedInterface* iface = ifaceItem->refInter; + titleAction = menu.addAction("Interface operations"); titleAction->setEnabled(false); menu.addSeparator(); @@ -503,6 +512,11 @@ void SourceItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) { showProperties = menu.addAction("Show properties"); renameAction = menu.addAction("Rename"); + if (iface->getAssociatedIface() != NULL) { + if (iface->getDirection() == AbstractInterface::Output) { + showPatterns = menu.addAction("Show output pattern"); + } + } } // menu for block else { @@ -525,25 +539,28 @@ void SourceItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) { if(selectedAction == NULL) return ; if (selectedAction == removeAction) { - dispatcher->removeSourceItem(this); + dispatcher->removeSourceItem(Dispatcher::Design, this); } else if (selectedAction == duplicateAction) { - dispatcher->duplicateSourceItem(this); + dispatcher->duplicateSourceItem(Dispatcher::Design, this); } else if(selectedAction == renameAction){ if(ifaceItem != NULL) { - dispatcher->renameInterface(ifaceItem); + dispatcher->renameInterface(Dispatcher::Design, ifaceItem); } else { - dispatcher->renameSourceBlock(this); + dispatcher->renameSourceBlock(Dispatcher::Design, this); } } else if(selectedAction == showProperties){ - dispatcher->showProperties(ifaceItem); + dispatcher->showProperties(Dispatcher::Design, ifaceItem); } else if(selectedAction == showParameters){ new ParametersWindow(refBlock, params, NULL); } + else if(selectedAction == showPatterns) { + dispatcher->showPatterns(Dispatcher::Design, ifaceItem); + } } void SourceItem::load(QDomElement funcElement) throw(Exception) { @@ -591,15 +608,14 @@ void SourceItem::load(QDomElement funcElement) throw(Exception) { throw(Exception(PROJECTFILE_CORRUPTED)); } if (referenceMd5 != referenceXml) { - throw(Exception(PROJECTFILE_CORRUPTED)); + reference = referenceXml; } else { reference = referenceMd5; } - - GroupBlock* parentGroupBlock = AB_TO_GRP(((GroupItem *)parentItem())->getRefBlock()); - FunctionalBlock* functionalBlock = params->getGraph()->createFunctionalBlock(parentGroupBlock, reference); - /* NB: addFunctionalBlock creates all interfaces from the reference, which is annoying when + + FunctionalBlock* functionalBlock = params->getGraph()->createSourceBlock(reference); + /* NB: createSourceBlock creates all interfaces from the reference, which is annoying when reading bif_iface tags. Thus interface are all removed. */ functionalBlock->setName(name); @@ -610,7 +626,7 @@ void SourceItem::load(QDomElement funcElement) throw(Exception) { setId(id); - QDomNodeList blockParamNodes = funcElement.elementsByTagName("bif_parameter"); + QDomNodeList blockParamNodes = funcElement.elementsByTagName("source_parameter"); // setting parameters value for(int i=0; igetParameterFromName(name); if (blockParam == NULL) throw(Exception(PROJECTFILE_CORRUPTED)); - blockParam->setValue(value); + blockParam->setValue(value); } // recreate all (non-control) interfaces because of some may have a multiplicity>1 with several examplars functionalBlock->removeAllInterfaces(); - QDomNodeList interfaceNodes = funcElement.elementsByTagName("bif_iface"); + QDomNodeList interfaceNodes = funcElement.elementsByTagName("source_iface"); // setting interfaces (user name, and for multiplicity>1 may be create some new ones) for(int i=0; iaddInterface(functionalInterface); // searching for control interface - QString ctlRefName = refName+"_ctl"; + QString ctlRefName = refName+"_enb"; ReferenceInterface* ctlRefIface = AI_TO_REF(reference->getIfaceFromName(ctlRefName)); if (ctlRefIface != NULL) { @@ -657,13 +673,13 @@ void SourceItem::load(QDomElement funcElement) throw(Exception) { if (! ctlIface->setAssociatedIface(functionalInterface)) { throw(Exception(PROJECTFILE_CORRUPTED)); } - ctlIface->setName(name+"_ctl"); + ctlIface->setName(name+"_enb"); functionalBlock->addInterface(ctlIface); } } // creating InterfaceItem - initInterfaces(); + createInterfaceItems(); // setting them with saved values for(int i=0; isetId(id); interfaceItem->setOrientation(orientation); interfaceItem->setPositionRatio(position);