X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/e5af659f87bcb199d6a5f10f09b311138351d0f3..d111eaf49741a0a79d372445f97c314a637e331e:/GroupItem.cpp?ds=sidebyside diff --git a/GroupItem.cpp b/GroupItem.cpp index 5d84381..90c5574 100644 --- a/GroupItem.cpp +++ b/GroupItem.cpp @@ -5,6 +5,7 @@ #include "Dispatcher.h" #include "Parameters.h" #include "BoxItem.h" +#include "SourceItem.h" #include "AbstractBlock.h" #include "AbstractInterface.h" #include "ConnectedInterface.h" @@ -38,7 +39,7 @@ GroupItem::GroupItem(BoxItem *_parentItem, selected = false; - setZValue(-100); + setZValue(100); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges); @@ -55,7 +56,7 @@ GroupItem::GroupItem(Dispatcher *_dispatcher,Parameters *_params) throw(Exceptio parentItem = NULL; rectTitle = QRectF(0,-(nameHeight+2*nameMargin),nameWidth+2*nameMargin,nameHeight+2*nameMargin); selected = false; - setZValue(-100); + setZValue(100); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges); updateGeometry(InterfaceMove); @@ -125,7 +126,7 @@ void GroupItem::updateMinimumSize() { if (getScene() == NULL) return; - QList blocks = getScene()->getBlockItems(); + QList blocks = getScene()->getBoxItems(); if(blocks.length() > 0) { // first, search for blocks that are at (0,0) int xMaxZero = 0; @@ -259,40 +260,53 @@ bool GroupItem::updateGeometry(ChangeType type) { originPoint.setY(y); if ((boxSizeChanged) || (newSize != oldSize) || (originPoint != oldOrigin)) { - cout << "must change group item shape" << endl; + //cout << "GroupItem: must change group item shape" << endl; prepareGeometryChange(); return true; } return false; } -void GroupItem::interfaceRenamed() { - updateGeometry(InterfaceMove); +void GroupItem::nameChanged() { + + + QFontMetrics fmId(params->defaultBlockFont); + nameWidth = fmId.width(refBlock->getName()); + nameHeight = fmId.height(); + // changing the BoxItem in the upperscene + if (parentItem != NULL) { + parentItem->nameChanged(); + } + updateGeometry(InterfaceMove); + // force the update in case of the size has not changed + update(); } void GroupItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - if(params->editState == Parameters::EditGroupMove) { - QPointF absPos = currentPosition + originPoint; + if(params->editState == Parameters::EditGroupMove) { 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() << " | "; -/* - if (absPos.x()+gapX < 0) { - gapX = -absPos.x(); + bool canMove = true; + if (refBlock->isTopGroupBlock()) { + QRectF rectGroup = boundingRectInScene(); + rectGroup.moveTo(rectGroup.x()+gapX,rectGroup.y()+gapY); + foreach(SourceItem* source, getScene()->getSourceItems()) { + QRectF rectSource = source->boundingRectInScene(); + if (rectGroup.intersects(rectSource)) canMove = false; + } } - if (absPos.y()+gapY < 0) { - gapY = -absPos.y(); + + if (canMove) { + QPointF gap(gapX,gapY); + currentPosition = currentPosition+gap; + setPos(currentPosition); + + // updating all connections of the scene. + getScene()->updateConnectionItemsShape(); } - */ - //cout << "gap: " << gapX << "," << gapY << " | "; - //cout << "scene: " << getScene()->sceneRect().x() << "," << getScene()->sceneRect().y() << endl; - QPointF gap(gapX,gapY); - currentPosition = currentPosition+gap; - setPos(currentPosition); cursorPosition = event->scenePos(); } else if(params->editState == Parameters::EditGroupResize) { @@ -372,11 +386,6 @@ void GroupItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { dispatcher->setCurrentGroupWidget(getScene()->getGroupWidget()); - /* NOTE : commneted because group interface are normally - created and the connected directly to a block within - the group. Furthermore, there can be a single connection - from a groupe interface. - if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) { InterfaceItem *inter = getInterfaceFromCursor(x,y); if (inter != NULL) { @@ -395,9 +404,8 @@ void GroupItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { } } } - } - */ - if (mode == GroupScene::ItemEdition) { + } + else if (mode == GroupScene::ItemEdition) { if (params->cursorState == Parameters::CursorOnInterface) { InterfaceItem *inter = getInterfaceFromCursor(x,y); @@ -422,11 +430,6 @@ void GroupItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { int mode = getScene()->getEditionMode(); - /* NOTE : commneted because group interface are normally - created and the connected directly to a block within - the group. Furthermore, there can be a single connection - from a groupe interface. - if (mode == GroupScene::AddConnection) { if (params->editState == Parameters::EditStartConnection) { @@ -444,19 +447,25 @@ void GroupItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { } else if (params->editState == Parameters::EditCloseConnection) { InterfaceItem* iface1 = getScene()->getSelectedInterface(1); - InterfaceItem* iface2 = getScene()->getSelectedInterface(2); - bool ok = dispatcher->connect(iface1,iface2); + InterfaceItem* iface2 = getScene()->getSelectedInterface(2); + bool ok = dispatcher->createConnectionItem(iface1,iface2); if (ok) { iface1->selected = false; update(iface1->boundingRect()); + iface2->selected = false; + update(iface2->boundingRect()); getScene()->setSelectedInterface(1,NULL); getScene()->setSelectedInterface(2,NULL); params->setEditState(Parameters::EditNoOperation); } + else { + //QMessageBox::warning(NULL,"Error","Cannot connect selected interfaces", QMessageBox::Ok); + getScene()->setSelectedInterface(2,NULL); + params->setEditState(Parameters::EditStartConnection); + } } - } - */ - if (mode == GroupScene::ItemEdition) { + } + else if (mode == GroupScene::ItemEdition) { currentInterface = NULL; setFlag(ItemIsMovable, true); params->editState = Parameters::EditNoOperation; @@ -528,7 +537,8 @@ void GroupItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { } } } - QGraphicsItem::hoverMoveEvent(event); + //QGraphicsItem::hoverMoveEvent(event); + event->ignore(); } void GroupItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { @@ -577,7 +587,7 @@ void GroupItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { if(ifaceItem != NULL) dispatcher->renameInterface(ifaceItem); else - dispatcher->renameBlockOrGroup(this); + dispatcher->renameGroupBlock(this); } else if(selectedAction == showProperties){ dispatcher->showProperties(ifaceItem); @@ -587,7 +597,7 @@ void GroupItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { } else if(selectedAction == showParameters) { new ParametersWindow(refBlock, params, NULL); - } + } } InterfaceItem* GroupItem::isHoverInterface(QPointF point) {