X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/d43174d0eb3d293b3bb5fbe76662241134e74d0d..0d3590739ff5a4ca9e87c052ac142f5d1d3a68ab:/Dispatcher.cpp?ds=inline diff --git a/Dispatcher.cpp b/Dispatcher.cpp index bbeb841..bbbb945 100644 --- a/Dispatcher.cpp +++ b/Dispatcher.cpp @@ -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 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,72 +164,177 @@ 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 - bool ok; - QString text = QInputDialog::getText(NULL, "Rename an interface", + GroupWidget* win = item->getOwner()->getScene()->getGroupWidget(); + + bool ok = false; + QString text = ""; + while (!ok) { + text = QInputDialog::getText(win, "Rename an interface", "New name:", QLineEdit::Normal, item->refInter->getName(), &ok); - - /* CAUTION: when renaming an interface item, there are two cases : - - it refers to a functional block interface (fbi): the fbi keeps its name - and the new name is given to item - - it refers to a group block interface (gbi) : both gbi and item store the new name - - */ - if(ok && !text.isEmpty() && text.length() < 30) { - if (item->refInter->getOwner()->isGroupBlock()) { - item->refInter->setName(text); + + if (!ok) return; + + if (text == item->refInter->getName()) return; + + if( (text.isEmpty()) || (text.length() > 30)) { + QMessageBox::warning(win,"Error in given name", + "the interface name must be shorter than 30 characters, cannot be empty", + QMessageBox::Ok); + ok = false; + } + else { + AbstractInterface* iface = item->refInter->getOwner()->getIfaceFromName(text); + if (iface != NULL) { + QMessageBox::warning(win,"Error in given name", + "the name provided is similar to that of another interface", + QMessageBox::Ok); + ok = false; + } } } - else { - QMessageBox::warning(NULL,"Error in given name", - "the interface name must be shorter than 30 characters and can't be empty!", - QMessageBox::Ok); - renameInterface(item); + item->refInter->setName(text); + AbstractInterface* assoIface = item->refInter->getAssociatedIface(); + if (assoIface != NULL) { + assoIface->setName(text+"_ctl"); } + item->updateName(text); + item->getOwner()->nameChanged(); } -void Dispatcher::duplicateBlock(BoxItem *item){ - static QString fctName = "Dispatcher::duplicateBlock()"; +void Dispatcher::duplicateBoxItem(BoxItem *item){ + static QString fctName = "Dispatcher::duplicateBoxItem()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif @@ -263,16 +348,39 @@ void Dispatcher::duplicateBlock(BoxItem *item){ // adding to the model FunctionalBlock* funBlock = (FunctionalBlock*)block; - newBlock = params->duplicateFunctionalBlock(funBlock); + newBlock = params->getGraph()->duplicateFunctionalBlock(funBlock); // adding to the view - scene->createBlockItem(newBlock); + scene->createBoxItem(newBlock); params->unsaveModif = true; } } -void Dispatcher::duplicateInterface(InterfaceItem *item) { - static QString fctName = "Dispatcher::duplicateInterface()"; +void Dispatcher::duplicateSourceItem(SourceItem *item) { + static QString fctName = "Dispatcher::duplicateSourceItem()"; +#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()->duplicateSourceBlock(funBlock); + // adding to the view + scene->createSourceItem(newBlock); + + params->unsaveModif = true; + } +} + +void Dispatcher::duplicateInterfaceItem(InterfaceItem *item) { + static QString fctName = "Dispatcher::duplicateInterfaceItem()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif @@ -284,16 +392,26 @@ void Dispatcher::duplicateInterface(InterfaceItem *item) { if(! refB->isFunctionalBlock()) return; FunctionalInterface* iface = (FunctionalInterface*)refI; - AbstractInterface *otherRef = iface->clone(); - if (otherRef == NULL) { + AbstractInterface *cloneIface = iface->clone(); + if (cloneIface == NULL) { QMessageBox::warning(NULL,"Error while cloning an interface","the interface cannot be cloned because its maximum multiplicity is reached", QMessageBox::Ok); return; } - refB->addInterface(otherRef); - - InterfaceItem *otherIface = new InterfaceItem(item->getPosition(),item->getOrientation(),(ConnectedInterface*)otherRef,item->getOwner(),params); - item->getOwner()->addInterface(otherIface,true); + refB->addInterface(cloneIface); + + InterfaceItem *cloneIfaceItem = new InterfaceItem(item->getPosition(),item->getOrientation(),(ConnectedInterface*)cloneIface,item->getOwner(),params); + item->getOwner()->addInterface(cloneIfaceItem,true); + + // creating control interface if needed + if (refI->getAssociatedIface() != NULL) { + QString ctlName = cloneIface->getName()+"_ctl"; + ReferenceInterface* ctlIface = new ReferenceInterface(refB,ctlName,"boolean","1",cloneIface->getDirection(), AbstractInterface::Control, 1); + refB->addInterface(ctlIface); + if (! ctlIface->setAssociatedIface(cloneIface)) { + cerr << "Abnormal case while cloning an interface and creating its associated control interface" << endl; + } + } } @@ -302,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; } @@ -355,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; @@ -415,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(); @@ -449,16 +582,23 @@ void Dispatcher::showRaiseWindow(BoxItem *item) { params->setCurrentScene(currentGroup->getScene()); } -void Dispatcher::showRstClkInter(AbstractBoxItem *item) { - static QString fctName = "Dispatcher::showRstClkInter()"; +void Dispatcher::showRstClkIface(AbstractBoxItem *item) { + static QString fctName = "Dispatcher::showRstClkIface()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif item->setRstClkVisible(!item->isRstClkVisible()); - item->resetInterfacesPosition(); + +} - item->getScene()->updateConnectionItemsShape(); +void Dispatcher::showWishboneIface(AbstractBoxItem *item) { + static QString fctName = "Dispatcher::showWishboneIface()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + + item->setWishboneVisible(!item->isWishboneVisible()); } void Dispatcher::addNewFullGroup() { @@ -622,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 @@ -678,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()) { @@ -689,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; @@ -708,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 @@ -723,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(); @@ -738,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(); @@ -807,7 +983,7 @@ 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->getLevel()); + GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection(),refInter->getPurpose()); groupInter->setType(refInter->getType()); groupInter->setWidth(refInter->getWidth()); groupInter->setPurpose(refInter->getPurpose()); @@ -949,7 +1125,7 @@ void Dispatcher::disconnectInterFromGroup(InterfaceItem *item) { #endif } -void Dispatcher::removeBlockInterface(InterfaceItem *item) { +void Dispatcher::removeFunctionalInterface(InterfaceItem *item) { static QString fctName = "Dispatcher::removeBlockInterface()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; @@ -999,7 +1175,7 @@ QMap 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(); @@ -1008,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(); @@ -1017,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; } @@ -1031,7 +1207,7 @@ BoxItem *Dispatcher::searchBlockItemById(int id) { return NULL; } -InterfaceItem* Dispatcher::searchInterfaceItemById(int id) { +InterfaceItem* Dispatcher::getInterfaceItemById(int id) { foreach(GroupWidget *group, groupList) { @@ -1042,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;