]> AND Private Git Repository - blast.git/blobdiff - Dispatcher.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
correct relative positionning of source/group
[blast.git] / Dispatcher.cpp
index bbbb945399fec32d5221e8b6f608b3a2867dd871..e7846b4545b9f2f2febed7b4ca57fdb4b3bc5e50 100644 (file)
@@ -82,21 +82,35 @@ void Dispatcher::closeCurrentProject() {
 }
 
 bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
-
+    
   ConnectedInterface* ref1 = iface1->refInter;
   ConnectedInterface* ref2 = iface2->refInter;
+  ConnectedInterface* asso1 = iface1->refInter->getAssociatedIface();
+  ConnectedInterface* asso2 = 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 +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();  
@@ -405,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)) {
@@ -888,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);
@@ -983,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;
@@ -1054,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
@@ -1093,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) {