X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/624231601a0f5daea9b8809993ad3503beafce4f..d111eaf49741a0a79d372445f97c314a637e331e:/Dispatcher.cpp diff --git a/Dispatcher.cpp b/Dispatcher.cpp index 10880cc..e7846b4 100644 --- a/Dispatcher.cpp +++ b/Dispatcher.cpp @@ -85,6 +85,8 @@ bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *ifac ConnectedInterface* ref1 = iface1->refInter; ConnectedInterface* ref2 = iface2->refInter; + ConnectedInterface* asso1 = iface1->refInter->getAssociatedIface(); + ConnectedInterface* asso2 = iface2->refInter->getAssociatedIface(); // connect both interface bool ok1 = false; @@ -94,12 +96,20 @@ bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *ifac 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)) { @@ -331,7 +341,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(); @@ -409,7 +419,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)) { @@ -892,7 +902,7 @@ 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); @@ -987,11 +997,12 @@ 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); + // 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; @@ -1058,7 +1069,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 @@ -1097,36 +1108,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) {