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

Private GIT Repository
added source items
[blast.git] / Dispatcher.cpp
index ac0862ca64a60e8508b411643a8c3b08f3e0b49a..bbbb945399fec32d5221e8b6f608b3a2867dd871 100644 (file)
@@ -16,6 +16,7 @@
 #include "GroupScene.h"
 #include "GroupItem.h"
 #include "BoxItem.h"
+#include "SourceItem.h"
 #include "InterfaceItem.h"
 #include "ConnectionItem.h"
 
@@ -80,7 +81,7 @@ void Dispatcher::closeCurrentProject() {
   sceneCounter = 0;
 }
 
-bool Dispatcher::connect(InterfaceItem *iface1, InterfaceItem *iface2) {
+bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
 
   ConnectedInterface* ref1 = iface1->refInter;
   ConnectedInterface* ref2 = iface2->refInter;
@@ -108,33 +109,12 @@ bool Dispatcher::connect(InterfaceItem *iface1, InterfaceItem *iface2) {
   return false;
 }
 
-void Dispatcher::checkSelection(){
-  InterfaceItem *iface1 = NULL;
-  InterfaceItem *iface2 = NULL;
-
-  GroupScene *scene = params->getCurrentScene();
-  QList<AbstractBoxItem*> list = scene->getGroupAndBlocks();
-  foreach(AbstractBoxItem *block, list){
-    InterfaceItem *tmp = block->getCurrentInterface();
-    if (tmp != NULL) {
-      if (iface1 == NULL) {
-        iface1 = tmp;
-      }
-      else {
-        iface2 = tmp;
-      }
-    }
-  }
-  if(iface1 != NULL && iface2 != NULL){
-    connect(iface1,iface2);
-  }
-}
 
 void Dispatcher::unselectAllItems(int direction){
 
   GroupScene *scene = params->getCurrentScene();
 
-  foreach(BoxItem* block, scene->getBlockItems()) {
+  foreach(BoxItem* block, scene->getBoxItems()) {
     block->setSelected(false);
     block->setCurrentInterface(NULL);
   }
@@ -184,50 +164,143 @@ void Dispatcher::changeConnectionMode(int mode){
   */
 }
 
-void Dispatcher::renameBlockOrGroup(AbstractBoxItem *item){
-  static QString fctName = "Dispatcher::renameBlockOrGroup()";
+void Dispatcher::renameFunctionalBlock(BoxItem *item){
+  static QString fctName = "Dispatcher::renameFunctionalBlock()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
-
-  bool ok;
-  QString text = QInputDialog::getText(NULL, "Rename an block/group",
+    
+  GroupWidget* win = item->getScene()->getGroupWidget();
+  
+  bool ok = false;
+  QString text = "";  
+  while (!ok) {  
+    text = QInputDialog::getText(win, "Rename a functional block",
                                        "New name:", QLineEdit::Normal,
                                        item->getRefBlock()->getName(), &ok);
-
-  if(ok){
-    if(!text.isEmpty() && text.length() < 30){
-      item->getRefBlock()->setName(text);
-      if(item->isGroupItem()){
-        if (currentGroup->isTopGroup()) {
-          mainWindow->setWindowTitle("blast - "+text);
-        }
-        else {
-          currentGroup->setWindowTitle("blast - "+text);
-        }
+    if (!ok) return;
+    
+    if (text == item->getRefBlock()->getName()) return;
+    
+    if( (text.isEmpty()) || (text.length() > 30)) {
+      QMessageBox::warning(win,"Error in given name",
+                           "the block name must be shorter than 30 characters, cannot be empty",
+                           QMessageBox::Ok);
+      ok = false;
+    }
+    else {
+      FunctionalBlock* block = params->getGraph()->getFunctionalBlockByName(text, AB_TO_GRP(item->getRefBlock()->getParent()));
+      if (block != NULL) {
+        QMessageBox::warning(win,"Error in given name",
+                             "the name provided is similar to that of another functional block within the group",
+                             QMessageBox::Ok);
+        ok = false;
       }
+    }    
+  }  
+
+  item->getRefBlock()->setName(text);
+  item->nameChanged();
+}
 
-      mainWindow->getLibrary()->updateComboScene();
+void Dispatcher::renameGroupBlock(GroupItem *item){
+  static QString fctName = "Dispatcher::renameGroupBlock()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+  
+  GroupWidget* win = item->getScene()->getGroupWidget();
+  
+  bool ok = false;
+  QString text = "";
+  while (!ok) {  
+    text = QInputDialog::getText(win, "Rename a group",
+                                       "New name:", QLineEdit::Normal,
+                                       item->getRefBlock()->getName(), &ok);
+    if (!ok) return;
+    
+    if (text == item->getRefBlock()->getName()) return;
+    
+    if( (text.isEmpty()) || (text.length() > 30)) {
+      QMessageBox::warning(win,"Error in given name",
+                           "the block name must be shorter than 30 characters, cannot be empty",
+                           QMessageBox::Ok);
+      ok = false;
     }
     else {
-      QMessageBox::warning(NULL,"Error in given name",
-                           "the element name must be shorter than 30 characters and can't be empty!",
+      GroupBlock* block = params->getGraph()->getGroupBlockByName(text);
+      if (block != NULL) {
+        QMessageBox::warning(win,"Error in given name",
+                             "the name provided is similar to that of another group",
+                             QMessageBox::Ok);
+        ok = false;
+      }
+    }    
+  }
+  
+  item->getRefBlock()->setName(text);
+  if(item->getScene()->getGroupWidget()->isTopGroup()) {
+    mainWindow->setWindowTitle("blast - "+text);
+  }
+  else {
+    item->getScene()->getGroupWidget()->setWindowTitle("blast - "+text);
+  }
+  item->nameChanged();
+  mainWindow->getLibrary()->updateComboScene();   
+}
+
+void Dispatcher::renameSourceBlock(SourceItem *item){
+  static QString fctName = "Dispatcher::renameSourceBlock()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+    
+  GroupWidget* win = item->getScene()->getGroupWidget();
+  
+  bool ok = false;
+  QString text = "";  
+  while (!ok) {  
+    text = QInputDialog::getText(win, "Rename a source",
+                                       "New name:", QLineEdit::Normal,
+                                       item->getRefBlock()->getName(), &ok);
+    if (!ok) return;
+    
+    if (text == item->getRefBlock()->getName()) return;
+    
+    if( (text.isEmpty()) || (text.length() > 30)) {
+      QMessageBox::warning(win,"Error in given name",
+                           "the block name must be shorter than 30 characters, cannot be empty",
                            QMessageBox::Ok);
-      renameBlockOrGroup(item);
+      ok = false;
     }
-  }
+    else {
+      FunctionalBlock* block = params->getGraph()->getSourceBlockByName(text);
+      if (block != NULL) {
+        QMessageBox::warning(win,"Error in given name",
+                             "the name provided is similar to that of another source block within the top group",
+                             QMessageBox::Ok);
+        ok = false;
+      }
+    }    
+  }  
+
+  item->getRefBlock()->setName(text);
+  item->nameChanged();
 }
 
+
 void Dispatcher::renameInterface(InterfaceItem *item) {
   static QString fctName = "Dispatcher::renameInterface()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 
+  GroupWidget* win = item->getOwner()->getScene()->getGroupWidget();
+  
   bool ok = false;
   QString text = "";
   while (!ok) {
-    text = QInputDialog::getText(NULL, "Rename an interface",
+    text = QInputDialog::getText(win, "Rename an interface",
                                        "New name:", QLineEdit::Normal,
                                        item->refInter->getName(), &ok);
    
@@ -236,7 +309,7 @@ void Dispatcher::renameInterface(InterfaceItem *item) {
     if (text == item->refInter->getName()) return;
     
     if( (text.isEmpty()) || (text.length() > 30)) {
-      QMessageBox::warning(NULL,"Error in given name",
+      QMessageBox::warning(win,"Error in given name",
                            "the interface name must be shorter than 30 characters, cannot be empty",
                            QMessageBox::Ok);
       ok = false;
@@ -244,7 +317,7 @@ void Dispatcher::renameInterface(InterfaceItem *item) {
     else {
       AbstractInterface* iface = item->refInter->getOwner()->getIfaceFromName(text);
       if (iface != NULL) {
-        QMessageBox::warning(NULL,"Error in given name",
+        QMessageBox::warning(win,"Error in given name",
                              "the name provided is similar to that of another interface",
                              QMessageBox::Ok);
         ok = false;
@@ -257,11 +330,34 @@ void Dispatcher::renameInterface(InterfaceItem *item) {
     assoIface->setName(text+"_ctl");
   }
   item->updateName(text);
-  item->getOwner()->interfaceRenamed();  
+  item->getOwner()->nameChanged();  
+}
+
+void Dispatcher::duplicateBoxItem(BoxItem *item){
+  static QString fctName = "Dispatcher::duplicateBoxItem()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+  GroupScene *scene = item->getScene();
+  AbstractBlock* block = item->getRefBlock();  
+  AbstractBlock *newBlock;
+
+  // only duplicate functional blocks
+  if(block->isFunctionalBlock()) {
+
+    // adding to the model
+    FunctionalBlock* funBlock = (FunctionalBlock*)block;
+    newBlock = params->getGraph()->duplicateFunctionalBlock(funBlock);
+    // adding to the view
+    scene->createBoxItem(newBlock);
+
+    params->unsaveModif = true;
+  }
 }
 
-void Dispatcher::duplicateBlock(BoxItem *item){
-  static QString fctName = "Dispatcher::duplicateBlock()";
+void Dispatcher::duplicateSourceItem(SourceItem *item) {
+  static QString fctName = "Dispatcher::duplicateSourceItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
@@ -275,16 +371,16 @@ void Dispatcher::duplicateBlock(BoxItem *item){
 
     // adding to the model
     FunctionalBlock* funBlock = (FunctionalBlock*)block;
-    newBlock = params->duplicateFunctionalBlock(funBlock);
+    newBlock = params->getGraph()->duplicateSourceBlock(funBlock);
     // adding to the view
-    scene->createBlockItem(newBlock);
+    scene->createSourceItem(newBlock);
 
     params->unsaveModif = true;
   }
 }
 
-void Dispatcher::duplicateInterface(InterfaceItem *item) {
-  static QString fctName = "Dispatcher::duplicateInterface()";
+void Dispatcher::duplicateInterfaceItem(InterfaceItem *item) {
+  static QString fctName = "Dispatcher::duplicateInterfaceItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
@@ -324,12 +420,25 @@ void Dispatcher::addBlock(int idCategory, int idBlock, int idScene) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
-
-  GroupScene *scene = searchSceneById(idScene);
+  bool newSource = false;
+  GroupScene *scene = getSceneById(idScene);
   ReferenceBlock* ref = params->getReferenceBlock(idCategory,idBlock);
-  GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
-  FunctionalBlock* newOne = params->getGraph()->addFunctionalBlock(group, ref);
-  scene->createBlockItem(newOne);
+  // if block has no inputs, propose to add it as a source to top scene
+  if ((scene->isTopScene()) && (ref->getDataInputs().isEmpty())) {
+    int ret = QMessageBox::question(NULL,"Adding a block to top scene","Selected block may be used as a source for the top scene. Do you want to add it as a source ?");
+    if (ret == QMessageBox::Yes) {
+      newSource = true;      
+    }   
+  }
+  if (newSource) {
+    FunctionalBlock* newOne = params->getGraph()->createSourceBlock(ref);
+    scene->createSourceItem(newOne);
+  }
+  else {
+    GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
+    FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref);
+    scene->createBoxItem(newOne);
+  }
   params->unsaveModif = true;
 }
 
@@ -377,10 +486,10 @@ GroupWidget* Dispatcher::addNewEmptyGroup(GroupScene* scene, bool show) {
   // getting the parent block in the graph
   GroupBlock* parent = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
   cout << "new group : parent = "<< qPrintable(parent->getName()) << endl;
-  GroupBlock* groupBlock = params->getGraph()->createChildBlock(parent);
+  GroupBlock* groupBlock = params->getGraph()->createChildGroupBlock(parent);
   cout << "new group : child = "<< qPrintable(groupBlock->getName()) << ", child of " << qPrintable(groupBlock->getParent()->getName()) << endl;
   // creating the BlockItem in the scene
-  BoxItem* newItem = scene->createBlockItem(groupBlock);
+  BoxItem* newItem = scene->createBoxItem(groupBlock);
 
   params->unsaveModif = true;
 
@@ -437,8 +546,10 @@ void Dispatcher::destroyScene(GroupScene *scene) {
   }
 
   if (scene->getNbChildScene() == 0) {
-    // remove scene from the parent list
-    scene->getParentScene()->removeChildScene(scene);
+    // remove scene from the parent list, if possible
+    if (scene->getParentScene() != NULL) {
+      scene->getParentScene()->removeChildScene(scene);
+    }
     // destroy the GroupWidget
     groupList.removeAll(scene->getGroupWidget());
     scene->getGroupWidget()->deleteLater();
@@ -651,8 +762,8 @@ void Dispatcher::addNewFullGroup() {
 #endif
 }
 
-void Dispatcher::removeBlock(BoxItem *item) {
-  static QString fctName = "Dispatcher::removeBlock()";
+void Dispatcher::removeBoxItem(BoxItem *item) {
+  static QString fctName = "Dispatcher::removeBoxItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
@@ -707,8 +818,8 @@ void Dispatcher::removeBlock(BoxItem *item) {
   if (item->getRefBlock()->isFunctionalBlock()) {
     FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());
     GroupBlock* group = AB_TO_GRP(block->getParent());
-    item->getScene()->removeBlockItem(item);
-    params->getGraph()->removeFunctionalBlock(block,group);
+    item->getScene()->removeBoxItem(item);
+    params->getGraph()->removeFunctionalBlock(block);
   }
   else if (item->getRefBlock()->isGroupBlock()) {
 
@@ -718,13 +829,13 @@ void Dispatcher::removeBlock(BoxItem *item) {
     GroupItem* subgroup = item->getChildGroupItem();
     destroyScene(subgroup->getScene());
     // remove the BoxItem
-    item->getScene()->removeBlockItem(item);
+    item->getScene()->removeBoxItem(item);
     // remove the group from the graph
     params->getGraph()->removeGroupBlock(group);
   }
 }
 
-void Dispatcher::removeAllBlockConnections(BoxItem *item) {
+void Dispatcher::removeAllBlockConnections(AbstractBoxItem *item) {
   static QString fctName = "Dispatcher::removeAllBlockConnection()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -737,6 +848,29 @@ void Dispatcher::removeAllBlockConnections(BoxItem *item) {
   }
 }
 
+void Dispatcher::removeSourceItem(SourceItem *item) {
+  static QString fctName = "Dispatcher::removeSourceItem()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+  
+  QString msg = "Removing source ";
+  
+  msg += item->getRefBlock()->getName();
+  msg += " and all its connections.\n\nAre you sure ?";
+
+  int ret = QMessageBox::question(NULL,"Removing source block",msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
+  if (ret == QMessageBox::Cancel) {
+    return;
+  }
+  removeAllBlockConnections(item);
+  
+  FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());  
+  item->getScene()->removeSourceItem(item);
+  params->getGraph()->removeSourceBlock(block);  
+}
+
+
 void Dispatcher::removeConnection(ConnectionItem *conn) {
   static QString fctName = "Dispatcher::removeConnection()";
 #ifdef DEBUG_FCTNAME
@@ -752,6 +886,21 @@ void Dispatcher::removeConnection(ConnectionItem *conn) {
   InterfaceItem* groupIfaceItem = NULL; // in case of one of the two interface belongs to the GroupItem
   GroupItem* groupItem = NULL;
 
+  ConnectedInterface *fromInter = fromIfaceItem->refInter;
+  ConnectedInterface *toInter = toIfaceItem->refInter;
+  // process the speical case source->group apart
+  if (fromIfaceItem->getOwner()->isSourceItem()) {
+    // remove from graph
+    fromInter->removeConnectedTo(toInter);
+    toInter->clearConnectedFrom();
+    // remove from scene
+    fromIfaceItem->removeConnectionItem(conn);
+    toIfaceItem->removeConnectionItem(conn);
+    groupItem->getScene()->removeConnectionItem(conn);
+    return;
+  }
+  
+  
   if (fromIfaceItem->getOwner()->isGroupItem()) {
     groupIfaceItem = fromIfaceItem;
     groupItem = toIfaceItem->getOwner()->getScene()->getGroupItem();
@@ -767,9 +916,7 @@ void Dispatcher::removeConnection(ConnectionItem *conn) {
   // removing the connection from graph
 #ifdef DEBUG
   cout << "removing connections from graph ..." ;
-#endif
-  ConnectedInterface *fromInter = fromIfaceItem->refInter;
-  ConnectedInterface *toInter = toIfaceItem->refInter;
+#endif  
   if (fromInter->getDirection() == AbstractInterface::InOut) {
     fromInter->clearConnectedTo();
     fromInter->clearConnectedFrom();
@@ -1028,7 +1175,7 @@ QMap<int, QString> Dispatcher::getAllGroupNames() {
   return list;
 }
 
-GroupScene* Dispatcher::searchSceneById(int id) {
+GroupScene* Dispatcher::getSceneById(int id) {
   foreach(GroupWidget *group, groupList){
     if(group->getScene()->getId() == id)
       return group->getScene();
@@ -1037,7 +1184,7 @@ GroupScene* Dispatcher::searchSceneById(int id) {
   return NULL;
 }
 
-GroupItem *Dispatcher::searchGroupItemById(int id) {
+GroupItem *Dispatcher::getGroupItemById(int id) {
   foreach(GroupWidget *group, groupList) {
     GroupScene* scene = group->getScene();
     if (scene->getGroupItem()->getId() == id) return scene->getGroupItem();
@@ -1046,11 +1193,11 @@ GroupItem *Dispatcher::searchGroupItemById(int id) {
   return NULL;
 }
 
-BoxItem *Dispatcher::searchBlockItemById(int id) {
+BoxItem *Dispatcher::getBoxItemById(int id) {
   foreach(GroupWidget *group, groupList) {
 
     GroupScene* scene = group->getScene();
-    foreach(BoxItem *item, scene->getBlockItems()){
+    foreach(BoxItem *item, scene->getBoxItems()){
       if(item->getId() == id){
           return item;
       }
@@ -1060,7 +1207,7 @@ BoxItem *Dispatcher::searchBlockItemById(int id) {
   return NULL;
 }
 
-InterfaceItem* Dispatcher::searchInterfaceItemById(int id) {
+InterfaceItem* Dispatcher::getInterfaceItemById(int id) {
 
   foreach(GroupWidget *group, groupList) {
 
@@ -1071,7 +1218,7 @@ InterfaceItem* Dispatcher::searchInterfaceItemById(int id) {
         return item;
       }
     }
-    foreach(BoxItem *block, scene->getBlockItems()){
+    foreach(BoxItem *block, scene->getBoxItems()){
       foreach(InterfaceItem *item, block->getInterfaces()){
         if(item->getId() == id){
           return item;