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

Private GIT Repository
changed connection process
[blast.git] / Dispatcher.cpp
index bbbb945399fec32d5221e8b6f608b3a2867dd871..238c7e5ddb1a2e5efb1bd788782632c807c88467 100644 (file)
@@ -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) {