X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/0d3590739ff5a4ca9e87c052ac142f5d1d3a68ab..8d3e09e430e829b9d847847334cbfe37790baca3:/Dispatcher.cpp?ds=sidebyside diff --git a/Dispatcher.cpp b/Dispatcher.cpp index bbbb945..9035183 100644 --- a/Dispatcher.cpp +++ b/Dispatcher.cpp @@ -81,22 +81,40 @@ 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 = (ConnectedInterface*)(iface1->refInter->getAssociatedIface()); + ConnectedInterface* asso2 = (ConnectedInterface*)(iface2->refInter->getAssociatedIface()); // connect both interface bool ok1 = false; bool ok2 = false; - if (ref1->canConnectTo(ref2)) { - ok1 = ref1->connectTo(ref2); - ok1 = ok1 & ref2->connectFrom(ref1); - } - if (ref2->canConnectTo(ref1)) { - ok2 = ref2->connectTo(ref1); - ok2 = ok2 & ref1->connectFrom(ref2); + // 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); + } + */ + 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); + } + */ + ok2 = true; } if ((ok1 == true) || (ok2 == true)) { @@ -327,7 +345,7 @@ void Dispatcher::renameInterface(InterfaceItem *item) { item->refInter->setName(text); AbstractInterface* assoIface = item->refInter->getAssociatedIface(); if (assoIface != NULL) { - assoIface->setName(text+"_ctl"); + assoIface->setName(text+"_enb"); } item->updateName(text); item->getOwner()->nameChanged(); @@ -401,11 +419,11 @@ 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()+"_ctl"; + QString ctlName = cloneIface->getName()+"_enb"; ReferenceInterface* ctlIface = new ReferenceInterface(refB,ctlName,"boolean","1",cloneIface->getDirection(), AbstractInterface::Control, 1); refB->addInterface(ctlIface); if (! ctlIface->setAssociatedIface(cloneIface)) { @@ -424,7 +442,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; @@ -871,43 +889,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 speical 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(); @@ -917,16 +924,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 @@ -934,25 +933,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); } } @@ -962,8 +971,7 @@ void Dispatcher::showBlocksLibrary(){ mainWindow->getLibrary()->raise(); } -void Dispatcher::showProperties(InterfaceItem *inter) -{ +void Dispatcher::showProperties(InterfaceItem *inter) { new InterfacePropertiesWindow(inter); } @@ -983,148 +991,32 @@ void Dispatcher::connectInterToGroup(InterfaceItem *item){ GroupItem *parentItem = item->getOwner()->getScene()->getGroupItem(); // creating/adding the group interface in the graph model - GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection(),refInter->getPurpose()); - groupInter->setType(refInter->getType()); - groupInter->setWidth(refInter->getWidth()); - groupInter->setPurpose(refInter->getPurpose()); + GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection(),refInter->getPurpose()); parentItem->getRefBlock()->addInterface(groupInter); - - // 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; - } + // 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); // 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->clearConnectedTo(); - } - 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 - - item->removeConnectionItem(conn); - groupIfaceItem->removeConnectionItem(conn); - parentItem->removeInterface(groupIfaceItem); // CAUTION : this deletes the interface item. - parentItem->getScene()->removeConnectionItem(conn); -#ifdef DEBUG - cout << "done." << endl ; -#endif - - // 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 @@ -1143,7 +1035,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); } @@ -1154,15 +1046,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); } }