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

Private GIT Repository
added clk/rst link when creating a block
[blast.git] / ConnectionItem.cpp
index 5dcd338dc47b60392dc7520fb7287e6ac44a3c14..86d0073da3cffca8066e702197371cab325d6ae5 100644 (file)
@@ -876,18 +876,22 @@ void ConnectionItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
   /* have to check if the connection can be removed.
      If the from or to InterfaceItem is owned by a group item, and this item
      is both connected to and from, thus it is impossible to remove this connection
+     because there would be a  group interface alone and not connected and this situation is not allowed.
+
+     Nevertheless, there are 2 exceptions :
+        - a from group interface is connected to more than one input interface
+        - the connection is between a source block outside the top group and the top group
    */
   bool canRemove = true;
-  InterfaceItem* groupIfaceItem = NULL;
+
   if (fromInterfaceItem->getOwner()->isGroupItem()) {
-    groupIfaceItem = fromInterfaceItem;
-  }
-  else if (toInterfaceItem->getOwner()->isGroupItem()) {
-    groupIfaceItem = toInterfaceItem;
+    ConnectedInterface* ref = fromInterfaceItem->refInter;
+    if ((ref->isConnectedFrom()) && (ref->getConnectedTo().length() == 1)) {
+      canRemove = false;
+    }
   }
-
-  if (groupIfaceItem != NULL) {
-    ConnectedInterface* ref = groupIfaceItem->refInter;
+  else if ((toInterfaceItem->getOwner()->isGroupItem()) && (! toInterfaceItem->getOwner()->getRefBlock()->isTopGroupBlock())) {
+    ConnectedInterface* ref = toInterfaceItem->refInter;
     if ((ref->isConnectedFrom()) && (ref->isConnectedTo())) {
       canRemove = false;
     }
@@ -902,7 +906,7 @@ void ConnectionItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
     QAction * selectedAction= menu.exec(event->screenPos());
 
     if(selectedAction == removeAction){
-      dispatcher->removeConnection(this);
+      dispatcher->removeConnection(Dispatcher::Design, this);
     }
   }
 }