X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/d111eaf49741a0a79d372445f97c314a637e331e..df84660fd98b39737692d57b68c8b2c2d34af0f1:/Dispatcher.cpp?ds=inline diff --git a/Dispatcher.cpp b/Dispatcher.cpp index e7846b4..a416f95 100644 --- a/Dispatcher.cpp +++ b/Dispatcher.cpp @@ -81,12 +81,10 @@ void Dispatcher::closeCurrentProject() { sceneCounter = 0; } -bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) { +bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2) { ConnectedInterface* ref1 = iface1->refInter; - ConnectedInterface* ref2 = iface2->refInter; - ConnectedInterface* asso1 = iface1->refInter->getAssociatedIface(); - ConnectedInterface* asso2 = iface2->refInter->getAssociatedIface(); + ConnectedInterface* ref2 = iface2->refInter; // connect both interface bool ok1 = false; @@ -94,22 +92,12 @@ bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *ifac // test the ref1->ref2 connection if ((ref1->canConnectTo(ref2)) && (ref2->canConnectFrom(ref1))) { - ref1->connectTo(ref2); - ref2->connectFrom(ref1); - if ((asso1 != NULL) && (asso2 != NULL)) { - asso1->connectTo(asso2); - asso2->connectFrom(asso1); - } + ref1->connectTo(ref2); ok1 = true; } // if the frist one did not work, test ref2->ref1 if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) { - ref2->connectTo(ref1); - ref1->connectFrom(ref2); - if ((asso1 != NULL) && (asso2 != NULL)) { - asso1->connectFrom(asso2); - asso2->connectTo(asso1); - } + ref2->connectTo(ref1); ok2 = true; } if ((ok1 == true) || (ok2 == true)) { @@ -118,6 +106,7 @@ bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *ifac unselectAllItems(); params->unsaveModif = true; + cout << "created a connection from " << qPrintable(ref1->getName()) << " to " << qPrintable(ref2->getName()) << endl; return true; } return false; @@ -347,6 +336,18 @@ void Dispatcher::renameInterface(InterfaceItem *item) { item->getOwner()->nameChanged(); } +void Dispatcher::showPatterns(InterfaceItem *item) { + static QString fctName = "Dispatcher::showPatterns()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + ConnectedInterface* iface = AI_TO_CON(item->refInter->getAssociatedIface()); + foreach(char c, *(iface->getOutputPattern())) { + cout << (int)c; + } + cout << endl; +} + void Dispatcher::duplicateBoxItem(BoxItem *item){ static QString fctName = "Dispatcher::duplicateBoxItem()"; #ifdef DEBUG_FCTNAME @@ -415,12 +416,12 @@ void Dispatcher::duplicateInterfaceItem(InterfaceItem *item) { refB->addInterface(cloneIface); InterfaceItem *cloneIfaceItem = new InterfaceItem(item->getPosition(),item->getOrientation(),(ConnectedInterface*)cloneIface,item->getOwner(),params); - item->getOwner()->addInterface(cloneIfaceItem,true); + item->getOwner()->addInterfaceItem(cloneIfaceItem,true); // creating control interface if needed if (refI->getAssociatedIface() != NULL) { QString ctlName = cloneIface->getName()+"_enb"; - ReferenceInterface* ctlIface = new ReferenceInterface(refB,ctlName,"boolean","1",cloneIface->getDirection(), AbstractInterface::Control, 1); + ReferenceInterface* ctlIface = new ReferenceInterface(refB,ctlName,cloneIface->getDirection(), AbstractInterface::Control,"boolean","1", AbstractInterface::LittleEndian, 1); refB->addInterface(ctlIface); if (! ctlIface->setAssociatedIface(cloneIface)) { cerr << "Abnormal case while cloning an interface and creating its associated control interface" << endl; @@ -438,7 +439,7 @@ void Dispatcher::addBlock(int idCategory, int idBlock, int idScene) { GroupScene *scene = getSceneById(idScene); ReferenceBlock* ref = params->getReferenceBlock(idCategory,idBlock); // if block has no inputs, propose to add it as a source to top scene - if ((scene->isTopScene()) && (ref->getDataInputs().isEmpty())) { + if ((scene->isTopScene()) && (ref->isGeneratorBlock())) { int ret = QMessageBox::question(NULL,"Adding a block to top scene","Selected block may be used as a source for the top scene. Do you want to add it as a source ?"); if (ret == QMessageBox::Yes) { newSource = true; @@ -830,8 +831,7 @@ void Dispatcher::removeBoxItem(BoxItem *item) { removeAllBlockConnections(item); if (item->getRefBlock()->isFunctionalBlock()) { - FunctionalBlock* block = AB_TO_FUN(item->getRefBlock()); - GroupBlock* group = AB_TO_GRP(block->getParent()); + FunctionalBlock* block = AB_TO_FUN(item->getRefBlock()); item->getScene()->removeBoxItem(item); params->getGraph()->removeFunctionalBlock(block); } @@ -885,43 +885,32 @@ void Dispatcher::removeSourceItem(SourceItem *item) { } -void Dispatcher::removeConnection(ConnectionItem *conn) { +void Dispatcher::removeConnection(ConnectionItem *connItem) { static QString fctName = "Dispatcher::removeConnection()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif - InterfaceItem* fromIfaceItem = conn->getFromInterfaceItem(); - InterfaceItem* toIfaceItem = conn->getToInterfaceItem(); + InterfaceItem* fromIfaceItem = connItem->getFromInterfaceItem(); + InterfaceItem* toIfaceItem = connItem->getToInterfaceItem(); #ifdef DEBUG cout << "remove connection from " << qPrintable(fromIfaceItem->refInter->getName()) << " to " << qPrintable(toIfaceItem->refInter->getName()) << endl; #endif - InterfaceItem* groupIfaceItem = NULL; // in case of one of the two interface belongs to the GroupItem - GroupItem* groupItem = NULL; + InterfaceItem* groupIfaceItem = NULL; // in case of one of the two interface belongs to the GroupItem, and stays NULL if not + GroupItem* groupItem = NULL; // the GroupItem of the scene that contains connItem ConnectedInterface *fromInter = fromIfaceItem->refInter; - ConnectedInterface *toInter = toIfaceItem->refInter; - // process the special case source->group apart - if (fromIfaceItem->getOwner()->isSourceItem()) { - // remove from graph - fromInter->removeConnectedTo(toInter); - toInter->clearConnectedFrom(); - // remove from scene - fromIfaceItem->removeConnectionItem(conn); - toIfaceItem->removeConnectionItem(conn); - groupItem->getScene()->removeConnectionItem(conn); - return; - } - + ConnectedInterface *toInter = toIfaceItem->refInter; + // test if one of the interface bounded to item is owned by a GroupItem if (fromIfaceItem->getOwner()->isGroupItem()) { - groupIfaceItem = fromIfaceItem; - groupItem = toIfaceItem->getOwner()->getScene()->getGroupItem(); + groupItem = ABI_TO_GI(fromIfaceItem->getOwner()); + groupIfaceItem = fromIfaceItem; } else if (toIfaceItem->getOwner()->isGroupItem()) { - groupIfaceItem = toIfaceItem; - groupItem = fromIfaceItem->getOwner()->getScene()->getGroupItem(); + groupItem = ABI_TO_GI(toIfaceItem->getOwner()); + groupIfaceItem = toIfaceItem; } else { groupItem = fromIfaceItem->getOwner()->getScene()->getGroupItem(); @@ -931,16 +920,8 @@ void Dispatcher::removeConnection(ConnectionItem *conn) { #ifdef DEBUG cout << "removing connections from graph ..." ; #endif - if (fromInter->getDirection() == AbstractInterface::InOut) { - fromInter->clearConnectedTo(); - fromInter->clearConnectedFrom(); - toInter->clearConnectedTo(); - toInter->clearConnectedFrom(); - } - else { - fromInter->removeConnectedTo(toInter); - toInter->clearConnectedFrom(); - } + fromInter->disconnectTo(toInter); + #ifdef DEBUG cout << "done." << endl ; #endif @@ -948,25 +929,35 @@ void Dispatcher::removeConnection(ConnectionItem *conn) { // removing the connection from scene #ifdef DEBUG cout << "removing connections from scene ..." ; -#endif - fromIfaceItem->removeConnectionItem(conn); - toIfaceItem->removeConnectionItem(conn); - groupItem->getScene()->removeConnectionItem(conn); +#endif + groupItem->getScene()->removeConnectionItem(connItem); #ifdef DEBUG cout << "done." << endl ; #endif - + + // if one of the interface bounded to connItem is owned by the GroupItem of the scene if (groupIfaceItem != NULL) { - ConnectedInterface* groupInter = groupIfaceItem->refInter; - groupItem->removeInterface(groupIfaceItem); - - BoxItem* parent2Item = groupItem->getParentItem(); - if (parent2Item != NULL) { - InterfaceItem* group2IfaceItem = parent2Item->searchInterfaceByRef(groupInter); - parent2Item->removeInterface(group2IfaceItem); + + // determine if the interface must be removed since it has no more connections. + bool groupInterRemove = false; + if ((groupIfaceItem->refInter->isConnectedTo() == false) && (groupIfaceItem->refInter->isConnectedFrom() == false)) groupInterRemove = true; + + if (groupInterRemove) { + // get the GroupInterface from interface item + ConnectedInterface* groupInter = groupIfaceItem->refInter; + // remove interface from GroupItem, and delete it. + groupItem->removeInterfaceItem(groupIfaceItem); + // get the parent BoxItem of GroupItem if it exists. + BoxItem* parent2Item = groupItem->getParentItem(); + if (parent2Item != NULL) { + InterfaceItem* group2IfaceItem = parent2Item->searchInterfaceItemByRef(groupInter); + // remove interface intem in parent BoxItem + parent2Item->removeInterfaceItem(group2IfaceItem); + } + // remove GroupInterface in the graph. + groupInter->getOwner()->removeInterface(groupInter); } - groupInter->getOwner()->removeInterface(groupInter); } } @@ -976,8 +967,7 @@ void Dispatcher::showBlocksLibrary(){ mainWindow->getLibrary()->raise(); } -void Dispatcher::showProperties(InterfaceItem *inter) -{ +void Dispatcher::showProperties(InterfaceItem *inter) { new InterfacePropertiesWindow(inter); } @@ -1002,151 +992,27 @@ void Dispatcher::connectInterToGroup(InterfaceItem *item){ // creating/adding the group control interface in the graph model GroupInterface *groupCtlInter = new GroupInterface(parentBlock,refInter->getName()+"_group_enb",refInter->getDirection(),AbstractInterface::Control); groupCtlInter->setAssociatedIface(groupInter); - parentItem->getRefBlock()->addInterface(groupCtlInter); - - // connect both interface - bool ok = true; - if (refInter->getDirection() == AbstractInterface::Output) { - ok = refInter->connectTo(groupInter); - ok = ok & groupInter->connectFrom(refInter); - } - else if (refInter->getDirection() == AbstractInterface::Input) { - ok = groupInter->connectTo(refInter); - ok = ok & refInter->connectFrom(groupInter); - } - else if (refInter->getDirection() == AbstractInterface::InOut) { - ok = refInter->connectTo(groupInter); - ok = ok & groupInter->connectFrom(refInter); - ok = ok & groupInter->connectTo(refInter); - ok = ok & refInter->connectFrom(groupInter); - } - if (!ok) { - cerr << "abnormal case while connecting a block iface to its parent group" << endl; - } + parentItem->getRefBlock()->addInterface(groupCtlInter); // creating/adding the group interface in the current scene model, and connection item InterfaceItem *groupIfaceItem = new InterfaceItem(0,item->getOrientation(),groupInter,parentItem,params); - parentItem->addInterface(groupIfaceItem,true); + parentItem->addInterfaceItem(groupIfaceItem,true); - parentItem->getScene()->createConnectionItem(item, groupIfaceItem); + // creating the connection, in graph and with an item + createConnection(item, groupIfaceItem); // if groupItem is not topGroup, must also add a new interface to the parent BlockItem BoxItem* parent2Item = parentItem->getParentItem(); if(parent2Item != NULL){ InterfaceItem *blockIfaceItem = new InterfaceItem(0,item->getOrientation(),groupInter,parent2Item,params); - parent2Item->addInterface(blockIfaceItem,true); + parent2Item->addInterfaceItem(blockIfaceItem,true); } parentItem->getScene()->updateConnectionItemsShape(); unselectAllItems(); params->unsaveModif = true; - - } -void Dispatcher::disconnectInterFromGroup(InterfaceItem *item) { - static QString fctName = "Dispatcher::disconnectInterFromGroup()"; -#ifdef DEBUG_FCTNAME - cout << "call to " << qPrintable(fctName) << endl; -#endif - - // getting the GroupBlock and GroupItem that are parent of the block that owns item - ConnectedInterface *refInter = item->refInter; - ConnectedInterface *groupInter = NULL; - GroupBlock* parentGroup = AB_TO_GRP(refInter->getOwner()->getParent()); - GroupItem *parentItem = item->getOwner()->getScene()->getGroupItem(); - - // removing the connection from graph -#ifdef DEBUG - cout << "removing connections from graph ..." ; -#endif - - if (refInter->getDirection() == AbstractInterface::Output) { - groupInter = refInter->getConnectionToParentGroup(); // must be a single connection to - refInter->removeConnectedTo(groupInter); - groupInter->clearConnectedFrom(); - } - else if (refInter->getDirection() == AbstractInterface::Input) { - groupInter = refInter->getConnectedFrom(); - refInter->clearConnectedFrom(); - groupInter->removeConnectedTo(refInter); - } - else if (refInter->getDirection() == AbstractInterface::InOut) { - groupInter = refInter->getConnectionToParentGroup(); // must be a single connection to - refInter->clearConnectedTo(); - refInter->clearConnectedFrom(); - groupInter->clearConnectedTo(); - groupInter->clearConnectedFrom(); - } -#ifdef DEBUG - cout << "done." << endl ; -#endif - - if (groupInter == NULL) { - cerr << "abnormal case 1 while removing an interface item of a block, linked to a parent group" << endl; - } - -#ifdef DEBUG - cout << "getting group interface item, and connection item ..." ; -#endif - - - InterfaceItem* groupIfaceItem = parentItem->searchInterfaceByRef(groupInter); - if (groupIfaceItem == NULL) { - cerr << "abnormal case 2 while removing an interface item of a block, linked to a parent group" << endl; - } - ConnectionItem* conn = parentItem->getScene()->searchConnectionItem(item,groupIfaceItem); - if (conn == NULL) { - cerr << "abnormal case 3 while removing an interface item of a block, linked to a parent group" << endl; - } -#ifdef DEBUG - cout << "done." << endl ; -#endif - - // removing the interface group item from the group item, and the connection item -#ifdef DEBUG - cout << "removing group interface item, and connection item ..." ; -#endif - - bool groupInterRemove = false; - if ((groupInter->isConnectedTo() == false) && (groupInter->isConnectedFrom() == false)) groupInterRemove = true; - - item->removeConnectionItem(conn); - groupIfaceItem->removeConnectionItem(conn); - if (groupInterRemove) { - parentItem->removeInterface(groupIfaceItem); // CAUTION : this deletes the interface item. - } - parentItem->getScene()->removeConnectionItem(conn); -#ifdef DEBUG - cout << "done." << endl ; -#endif - - if (groupInterRemove) { - // removing the interface box item in the parent scene -#ifdef DEBUG - cout << "removing the inteeface item of box item in parent scene if needed ..." ; -#endif - - BoxItem* parent2Item = parentItem->getParentItem(); - if (parent2Item != NULL) { - InterfaceItem* group2IfaceItem = parent2Item->searchInterfaceByRef(groupInter); - parent2Item->removeInterface(group2IfaceItem); - } -#ifdef DEBUG - cout << "done." << endl ; -#endif - - // removing the interface group from the group -#ifdef DEBUG - cout << "removing group interface ..." ; -#endif - parentGroup->removeInterface(groupInter); -#ifdef DEBUG - cout << "done." << endl ; -#endif - } - -} void Dispatcher::removeFunctionalInterface(InterfaceItem *item) { static QString fctName = "Dispatcher::removeBlockInterface()"; #ifdef DEBUG_FCTNAME @@ -1165,7 +1031,7 @@ void Dispatcher::removeFunctionalInterface(InterfaceItem *item) { } ConnectedInterface* ref = item->refInter; - item->getOwner()->removeInterface(item); + item->getOwner()->removeInterfaceItem(item); FunctionalBlock* fun = AB_TO_FUN(ref->getOwner()); fun->removeInterface(ref); } @@ -1176,15 +1042,11 @@ void Dispatcher::removeGroupInterface(InterfaceItem *item) { cout << "call to " << qPrintable(fctName) << endl; #endif - /* NB: there is a single connection between item and another one that is owned - by a BoxItem. Thus, we just have to find it and to call disconnectInterFromGroup(); + /* NB: just remove all connections from/to this item, since when there are no more + ones to a GroupItem, it is automatically deleted. */ - ConnectionItem* conn = item->connections.at(0); - if (conn->getFromInterfaceItem() == item) { - disconnectInterFromGroup(conn->getToInterfaceItem()); - } - else { - disconnectInterFromGroup(conn->getFromInterfaceItem()); + foreach(ConnectionItem* conn, item->connections) { + removeConnection(conn); } }