]> 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 e7846b4545b9f2f2febed7b4ca57fdb4b3bc5e50..238c7e5ddb1a2e5efb1bd788782632c807c88467 100644 (file)
@@ -81,12 +81,12 @@ void Dispatcher::closeCurrentProject() {
   sceneCounter = 0;
 }
 
   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* ref1 = iface1->refInter;
   ConnectedInterface* ref2 = iface2->refInter;
-  ConnectedInterface* asso1 = iface1->refInter->getAssociatedIface();
-  ConnectedInterface* asso2 = iface2->refInter->getAssociatedIface();
+  ConnectedInterface* asso1 = (ConnectedInterface*)(iface1->refInter->getAssociatedIface());
+  ConnectedInterface* asso2 = (ConnectedInterface*)(iface2->refInter->getAssociatedIface());
   // connect both interface
 
   bool ok1 = false;
   // connect both interface
 
   bool ok1 = false;
@@ -95,21 +95,25 @@ bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *ifac
   // test the ref1->ref2 connection
   if ((ref1->canConnectTo(ref2)) && (ref2->canConnectFrom(ref1))) {
     ref1->connectTo(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);
     }
     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);
     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);
     }
     ref1->connectFrom(ref2);
     if ((asso1 != NULL) && (asso2 != NULL)) {
       asso1->connectFrom(asso2);
       asso2->connectTo(asso1);
     }
+    */
     ok2 = true;
   }
   if ((ok1 == true) || (ok2 == true)) {
     ok2 = true;
   }
   if ((ok1 == true) || (ok2 == true)) {
@@ -905,8 +909,7 @@ void Dispatcher::removeConnection(ConnectionItem *conn) {
   // process the special case source->group apart
   if (fromIfaceItem->getOwner()->isSourceItem()) {
     // remove from graph
   // 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);
     // remove from scene
     fromIfaceItem->removeConnectionItem(conn);
     toIfaceItem->removeConnectionItem(conn);
@@ -931,16 +934,8 @@ void Dispatcher::removeConnection(ConnectionItem *conn) {
 #ifdef DEBUG
   cout << "removing connections from graph ..." ;
 #endif  
 #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
 #ifdef DEBUG
   cout << "done." << endl ;
 #endif
@@ -958,6 +953,10 @@ void Dispatcher::removeConnection(ConnectionItem *conn) {
 #endif
 
   if (groupIfaceItem != NULL) {
 #endif
 
   if (groupIfaceItem != NULL) {
+    
+    bool groupInterRemove = false;
+    if ((groupIfaceItem->nter->isConnectedTo() == false) && (groupInter->isConnectedFrom() == false)) groupInterRemove = true;
+    
     ConnectedInterface* groupInter = groupIfaceItem->refInter;
     groupItem->removeInterface(groupIfaceItem);
 
     ConnectedInterface* groupInter = groupIfaceItem->refInter;
     groupItem->removeInterface(groupIfaceItem);
 
@@ -1002,32 +1001,13 @@ void Dispatcher::connectInterToGroup(InterfaceItem *item){
   // 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);
   // 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;
-  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;
-  }
+  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);
 
   // 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();
 
   // if groupItem is not topGroup, must also add a new interface to the parent BlockItem
   BoxItem* parent2Item = parentItem->getParentItem();