X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/0d3590739ff5a4ca9e87c052ac142f5d1d3a68ab..3bbc311e444c1ef9ac66dd6861fb0acb13ddb72a:/Dispatcher.cpp diff --git a/Dispatcher.cpp b/Dispatcher.cpp index bbbb945..238c7e5 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(); @@ -405,7 +423,7 @@ void Dispatcher::duplicateInterfaceItem(InterfaceItem *item) { // 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)) { @@ -888,11 +906,10 @@ void Dispatcher::removeConnection(ConnectionItem *conn) { ConnectedInterface *fromInter = fromIfaceItem->refInter; ConnectedInterface *toInter = toIfaceItem->refInter; - // process the speical case source->group apart + // process the special case source->group apart if (fromIfaceItem->getOwner()->isSourceItem()) { // remove from graph - fromInter->removeConnectedTo(toInter); - toInter->clearConnectedFrom(); + fromInter->disconnectTo(toInter); // remove from scene fromIfaceItem->removeConnectionItem(conn); toIfaceItem->removeConnectionItem(conn); @@ -917,16 +934,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 @@ -944,6 +953,10 @@ void Dispatcher::removeConnection(ConnectionItem *conn) { #endif if (groupIfaceItem != NULL) { + + bool groupInterRemove = false; + if ((groupIfaceItem->nter->isConnectedTo() == false) && (groupInter->isConnectedFrom() == false)) groupInterRemove = true; + ConnectedInterface* groupInter = groupIfaceItem->refInter; groupItem->removeInterface(groupIfaceItem); @@ -983,36 +996,18 @@ 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->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(); @@ -1054,7 +1049,7 @@ void Dispatcher::disconnectInterFromGroup(InterfaceItem *item) { else if (refInter->getDirection() == AbstractInterface::Input) { groupInter = refInter->getConnectedFrom(); refInter->clearConnectedFrom(); - groupInter->clearConnectedTo(); + groupInter->removeConnectedTo(refInter); } else if (refInter->getDirection() == AbstractInterface::InOut) { groupInter = refInter->getConnectionToParentGroup(); // must be a single connection to @@ -1093,36 +1088,43 @@ void Dispatcher::disconnectInterFromGroup(InterfaceItem *item) { 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); - parentItem->removeInterface(groupIfaceItem); // CAUTION : this deletes the interface item. + if (groupInterRemove) { + 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 + 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 ..." ; + 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); - } + + BoxItem* parent2Item = parentItem->getParentItem(); + if (parent2Item != NULL) { + InterfaceItem* group2IfaceItem = parent2Item->searchInterfaceByRef(groupInter); + parent2Item->removeInterface(group2IfaceItem); + } #ifdef DEBUG - cout << "done." << endl ; + cout << "done." << endl ; #endif - - // removing the interface group from the group + + // removing the interface group from the group #ifdef DEBUG - cout << "removing group interface ..." ; + cout << "removing group interface ..." ; #endif - parentGroup->removeInterface(groupInter); + parentGroup->removeInterface(groupInter); #ifdef DEBUG - cout << "done." << endl ; + cout << "done." << endl ; #endif + } } void Dispatcher::removeFunctionalInterface(InterfaceItem *item) {