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

Private GIT Repository
added context to dispatcher op.
authorstephane Domas <stephane.domas@univ-fcomte.fr>
Fri, 20 Apr 2018 14:47:52 +0000 (16:47 +0200)
committerstephane Domas <stephane.domas@univ-fcomte.fr>
Fri, 20 Apr 2018 14:47:52 +0000 (16:47 +0200)
31 files changed:
AbstractBlock.cpp
AbstractBoxItem.cpp
AbstractBoxItem.h
AbstractInterface.cpp
AbstractInterface.h
BlockLibraryWidget.cpp
BoxItem.cpp
BoxItem.h
ConnectionItem.cpp
Dispatcher.cpp
Dispatcher.h
FunctionalBlock.cpp
FunctionalBlock.h
FunctionalInterface.cpp
Graph.cpp
Graph.h
GroupBlock.cpp
GroupBlock.h
GroupInterface.cpp
GroupItem.cpp
GroupScene.cpp
GroupScene.h
GroupWidget.cpp
MainWindow.cpp
NewProjectDialog.cpp
NewProjectDialog.h
Parameters.cpp
Parameters.h
SourceItem.cpp
blast.creator.user
lib/implementations/#toto.txt# [deleted file]

index c1c3c38df0d9d7ab3f6e80af49070ff7121bc648..3c3dd55567143665fb453afe507fac18330e9e97 100644 (file)
@@ -59,7 +59,7 @@ bool AbstractBlock::isSourceBlock() {
 }\r
 /* NB: a generator is a block that has no data inputs\r
  * and has at least one data output.\r
- * By the way, blokcs that have no data input/output\r
+ * By the way, blocks that have no data input/output\r
  * (like clkrstgen) are not generators !\r
  */\r
 bool AbstractBlock::isGeneratorBlock() {\r
index 925cd6fa83ef1ed479163fe72077779bd2923780..9fafc8fbc4b5b7dea39e0675b5c20913af3fdd0e 100644 (file)
 #include "ConnectedInterface.h"
 
 
-AbstractBoxItem::  AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem *parent) : QGraphicsItem(parent) {
+AbstractBoxItem::  AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, LockType _lock, QGraphicsItem *parent) : QGraphicsItem(parent) {
   dispatcher = _dispatcher;
   params = _params;
   refBlock = _refBlock;  
+  lock = _lock;
   QFontMetrics fmId(params->defaultBlockFont);
   nameWidth = fmId.width(refBlock->getName());
   nameHeight = fmId.height();
@@ -43,10 +44,11 @@ AbstractBoxItem::  AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispat
   // NOTE : initInterfaces() is only called in subclasses
 }
 
-AbstractBoxItem::AbstractBoxItem(Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem* parent) : QGraphicsItem(parent) {
+AbstractBoxItem::AbstractBoxItem(Dispatcher *_dispatcher, Parameters *_params, LockType _lock, QGraphicsItem* parent) : QGraphicsItem(parent) {
   dispatcher = _dispatcher;
-  params = _params;
+  params = _params;  
   refBlock = NULL;
+  lock = _lock;
   nameWidth = 0;
   nameHeight = 0;
   nameMargin = 10;
index fb2bdcc594feb1278af6ad9635ec84f131bac452..84a4fbc354fc4fb22f39db2d2dbea76253a5facf 100644 (file)
@@ -24,9 +24,10 @@ public:
 
   enum BorderType { NoBorder = 0, BorderEast, BorderNorth, BorderWest, BorderSouth, CornerSouthEast, Title};
   enum ChangeType { Resize = 0, InterfaceMove };
+  enum LockType { NoLock = 0, Position = 1, Dimension = 2, Interfaces = 4, Names = 8};
 
-  AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem* parent = Q_NULLPTR);
-  AbstractBoxItem(Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem* parent = Q_NULLPTR);
+  AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, LockType _lock = NoLock, QGraphicsItem* parent = Q_NULLPTR);
+  AbstractBoxItem(Dispatcher *_dispatcher, Parameters *_params, LockType _lock = NoLock, QGraphicsItem* parent = Q_NULLPTR);
 
   virtual ~AbstractBoxItem();
 
@@ -52,6 +53,15 @@ public:
   void setWishboneVisible(bool b);
   void setDimension(int x, int y);
   inline void setCurrentInterface(InterfaceItem* iface) { currentInterface = iface; }
+  inline void setLock(int _lock) { lock = _lock; }
+  inline void lockPosition() { lock = lock | Position; }
+  inline void unlockPosition() { lock = (lock&Position)^lock; }
+  inline void lockDimension() { lock = lock | Dimension; }
+  inline void unlockDimension() { lock = (lock&Dimension)^lock; }
+  inline void lockInterfaces() { lock = lock | Interfaces; }
+  inline void unlockInterfaces() { lock = (lock&Interfaces)^lock; }
+  inline void lockNames() { lock = lock | Names; }
+  inline void unlockNames() { lock = (lock&Names)^lock; }
 
   // testers
   virtual bool isBoxItem();
@@ -61,7 +71,10 @@ public:
   inline bool isRstClkVisible(){ return rstClkVisible;}
   inline bool isWishboneVisible(){ return wishboneVisible;}
   bool isInterfaces(int orientation) const;
-
+  inline bool isPositionLock() { return (lock&Position)!=0?true:false; }
+  inline bool isDimensionLock() { return (lock&Dimension)!=0?true:false; }
+  inline bool isInterfacesLock() { return (lock&Interfaces)!=0?true:false; }
+  inline bool isNamesLock() { return (lock&Names)!=0?true:false; }
   // others
   QRectF boundingRectInScene();
   virtual void nameChanged() = 0; // called when an interface or box name have changed
@@ -123,6 +136,7 @@ protected:
   int ifaceMargin; // the margin around each side of interfaces' name
   QPointF originPoint; // the left-top point that is the origin of the bounding box, in the item coordinates
 
+  int lock;
   bool selected;
   bool rstClkVisible; //! true if clock/reset interfaces are visible
   bool wishboneVisible; //! true if wishbone interfaces are visible
index 39e672dbba48223eff149bb37e02a8103b446bd2..6b3d0092da463c1ec849cc05aa39d4c53feeb3c2 100644 (file)
@@ -288,7 +288,7 @@ int AbstractInterface::typeFromString(const QString &_type) {
   return ret;
 }
 
-QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) {
+QString AbstractInterface::toVHDL(IfaceVHDLContext context, int flags) throw(Exception) {
 
 
   if (isReferenceInterface()) throw(Exception(IFACE_INVALID_TYPE));
index 3a3cb25339c156906713a0c859ab990c42307a80..166fdbeb9d313b876ba33304aff88648b3dede5f 100644 (file)
@@ -78,7 +78,7 @@ public :
   
   int typeFromString(const QString &_type);
 
-  QString toVHDL(int context, int flags) throw(Exception);
+  QString toVHDL(IfaceVHDLContext context, int flags) throw(Exception);
 
 protected:
   QString name;
index 0d2636d7db1189b88cdc4baa387267327fa88646..e8f5c6da0f65d509b1b580e7d81d4cee89274bf4 100644 (file)
@@ -91,7 +91,7 @@ void BlockLibraryWidget::addClicked() {
     int idBlock = item->data(2,Qt::DisplayRole).toInt();
     QVariant v = comboScenes->currentData();
     cout << "adding block to scene " << v.toInt() << endl;
-    dispatcher->addBlock(idParent, idBlock, v.toInt());
+    dispatcher->addBlock(Dispatcher::Design, idParent, idBlock, v.toInt());
   }
 
   // only take the first selected
index 9ff42a88f7feb96f3f4d7ac413f870c2fe778e73..a7e11812a6a084683f6273901f66bfba1dec0f6f 100644 (file)
 
 BoxItem::BoxItem(AbstractBlock *_refBlock,
                      Dispatcher *_dispatcher,
-                     Parameters *_params, GroupItem *parent) throw(Exception) : AbstractBoxItem( _refBlock, _dispatcher, _params, parent) {
+                     Parameters *_params, GroupItem *parent, LockType _lock, SpanType _span, Position _hPos, Position _vPos) throw(Exception) : AbstractBoxItem( _refBlock, _dispatcher, _params, _lock, parent) {
 
   /*  NOTE :
      _refBlock : mandatory a FunctionalBlock or a GroupBlock
   */
-  if (_refBlock->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));
+  if (_refBlock->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));  
+
+  span = _span;
+  hPos = _hPos;
+  vPos = _vPos;
 
   childGroupItem = NULL;
   //boxWidth = params->defaultBlockWidth;
@@ -31,7 +35,14 @@ BoxItem::BoxItem(AbstractBlock *_refBlock,
   selected = false;
 
   setZValue(100);
-  setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges);
+  QGraphicsItem::GraphicsItemFlags flags = QGraphicsItem::ItemIsSelectable;
+  if (!isPositionLock()) {
+    flags |= QGraphicsItem::ItemIsMovable;
+  }
+  if (!isDimensionLock()) {
+    flags |= QGraphicsItem::ItemSendsGeometryChanges;
+  }
+  setFlags(flags);
 
   initInterfaceItems();
   updateGeometry(InterfaceMove);
@@ -42,7 +53,11 @@ BoxItem::BoxItem(AbstractBlock *_refBlock,
   //cout << "pos in group: " << x() << "," << y() << endl;
 }
 
-BoxItem::BoxItem(Dispatcher *_dispatcher, Parameters *_params, GroupItem *parent) throw(Exception) : AbstractBoxItem(_dispatcher, _params, parent) {
+BoxItem::BoxItem(Dispatcher *_dispatcher, Parameters *_params, GroupItem *parent, LockType _lock, SpanType _span, Position _hPos, Position _vPos) throw(Exception) : AbstractBoxItem(_dispatcher, _params, _lock, parent) {
+
+  span = _span;
+  hPos = _hPos;
+  vPos = _vPos;
 
   refBlock = NULL;
   childGroupItem = NULL;
@@ -50,7 +65,14 @@ BoxItem::BoxItem(Dispatcher *_dispatcher, Parameters *_params, GroupItem *parent
   selected = false;
 
   setZValue(100);
-  setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges);
+  QGraphicsItem::GraphicsItemFlags flags = QGraphicsItem::ItemIsSelectable;
+  if (!isPositionLock()) {
+    flags |= QGraphicsItem::ItemIsMovable;
+  }
+  if (!isDimensionLock()) {
+    flags |= QGraphicsItem::ItemSendsGeometryChanges;
+  }
+  setFlags(flags);
 
   boxWidth = params->defaultBlockWidth;
   boxHeight = params->defaultBlockHeight;
@@ -329,7 +351,7 @@ void BoxItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
 
   int mode = getScene()->getEditionMode();
 
-  dispatcher->setCurrentGroupWidget(getScene()->getGroupWidget());
+  dispatcher->setCurrentGroupWidget(Dispatcher::Design, getScene()->getGroupWidget());
 
   if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) {
     InterfaceItem *inter = getInterfaceItemFromCursor(x,y);
@@ -403,7 +425,7 @@ void BoxItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
     else if (params->editState == Parameters::EditCloseConnection) {
       InterfaceItem* iface1 = getScene()->getSelectedInterface(1);
       InterfaceItem* iface2 = getScene()->getSelectedInterface(2);
-      bool ok = dispatcher->createConnection(iface1,iface2);
+      bool ok = dispatcher->createConnection(Dispatcher::Design, iface1,iface2);
       if (ok) {
         iface1->selected = false;
         update(iface1->boundingRect());
@@ -617,60 +639,60 @@ void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
 
   if (selectedAction == removeAction) {
     if(ifaceItem != NULL) {
-     dispatcher->removeFunctionalInterface(ifaceItem);
+     dispatcher->removeFunctionalInterface(Dispatcher::Design, ifaceItem);
     }
     else {
-      dispatcher->removeBoxItem(this);
+      dispatcher->removeBoxItem(Dispatcher::Design, this);
     }
   }
   else if (selectedAction == duplicateAction) {
-    dispatcher->duplicateBoxItem(this);
+    dispatcher->duplicateBoxItem(Dispatcher::Design, this);
   }
   else if(selectedAction == renameAction){
     if(ifaceItem != NULL) {
-      dispatcher->renameInterface(ifaceItem);
+      dispatcher->renameInterface(Dispatcher::Design, ifaceItem);
     }
     else {
       if (refBlock->isFunctionalBlock()) {          
-        dispatcher->renameFunctionalBlock(this);
+        dispatcher->renameFunctionalBlock(Dispatcher::Design, this);
       }
       else if (refBlock->isGroupBlock()) {        
-        dispatcher->renameGroupBlock(childGroupItem);
+        dispatcher->renameGroupBlock(Dispatcher::Design, childGroupItem);
       }
     }   
   }
   else if(selectedAction == showProperties){
-    dispatcher->showProperties(ifaceItem);
+    dispatcher->showProperties(Dispatcher::Design, ifaceItem);
   }
   else if (selectedAction == connectToGroup){
-    dispatcher->connectInterToGroup(ifaceItem);
+    dispatcher->connectInterToGroup(Dispatcher::Design, ifaceItem);
   }
   else if (selectedAction == cloneInterface){
-    dispatcher->duplicateInterfaceItem(ifaceItem);
+    dispatcher->duplicateInterfaceItem(Dispatcher::Design, ifaceItem);
   }
   else if (selectedAction == openWindow){
-    dispatcher->showRaiseWindow(this);
+    dispatcher->showRaiseWindow(Dispatcher::Design, this);
   }
   else if(selectedAction == showRstClkIface) {
-    dispatcher->showRstClkIface(this);
+    dispatcher->showRstClkIface(Dispatcher::Design, this);
   }
   else if(selectedAction == showWishboneIface) {
-    dispatcher->showWishboneIface(this);
+    dispatcher->showWishboneIface(Dispatcher::Design, this);
   }
   else if(selectedAction == showParameters) {    
     new ParametersWindow(refBlock, params, NULL);
   }
   else if(selectedAction == showPatterns) {    
-    dispatcher->showPatterns(ifaceItem);
+    dispatcher->showPatterns(Dispatcher::Design, ifaceItem);
   }
   else if(selectedAction == removeModifier) {
-    dispatcher->removeModifier(ifaceItem);
+    dispatcher->removeModifier(Dispatcher::Design, ifaceItem);
   }
   else if(selectedAction == showModifier) {
-    dispatcher->showModifier(ifaceItem);
+    dispatcher->showModifier(Dispatcher::Design, ifaceItem);
   }
   else if(selectedAction == generateVHDL) {
-    dispatcher->generateBlockVHDL(this);
+    dispatcher->generateBlockVHDL(Dispatcher::Design, this);
   }
 
 }
index c8a942e8590a9f8c6ad6566a0516706f28dce73a..4ab2022ed8bf47d8712428654265273eb2426b1f 100644 (file)
--- a/BoxItem.h
+++ b/BoxItem.h
@@ -30,8 +30,12 @@ using namespace Qt;
 class BoxItem : public AbstractBoxItem {
 
 public:
-  BoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, GroupItem* parent) throw(Exception);
-  BoxItem(Dispatcher *_dispatcher, Parameters *_params, GroupItem* parent) throw(Exception);
+
+  enum Position { Left = 1, Right, Top, Bottom, Center};
+  enum SpanType { NoSpan = 0, HSpan = 1, VSpan = 2 };
+
+  BoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, GroupItem* parent, LockType _lock = NoLock, SpanType _span = NoSpan, Position _hPos = Center, Position _vPos = Center) throw(Exception);
+  BoxItem(Dispatcher *_dispatcher, Parameters *_params, GroupItem* parent, LockType _lock = NoLock, SpanType _span = NoSpan, Position _hPos = Center, Position _vPos = Center) throw(Exception);
   ~BoxItem();
 
   void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);  
@@ -53,6 +57,10 @@ public:
 
 protected:
 
+  SpanType span;
+  Position hPos;
+  Position vPos;
+
   void updateMinimumSize(); // modify the minimum size
   bool updateGeometry(ChangeType type); // modify the originPoint and the total dimension
 
@@ -65,9 +73,9 @@ protected:
 private:
 
   /* NOTE :
-   A BlockItem is always graphically within a GroupItem, inside the same scene.   
+   A BoxItem is always graphically within a GroupItem, inside the same scene.
 
-   A BlockItem may also be the graphical view of a GroupBlock. In this case, there exists a child scene
+   A BoxItem may also be the graphical view of a GroupBlock. In this case, there exists a child scene
    containing a GroupItem. insideGroup atribute refers to this GroupItem and thus, may be NULL if the current
    blockItem represents a functional block
    */
index 4de86cb09f28ebda9dcff07d4b888bd59e0022d5..86d0073da3cffca8066e702197371cab325d6ae5 100644 (file)
@@ -906,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);
     }
   }
 }
index cdf8ee3b1c281ba5381bb56b605440f2de7a698e..da4bae2b5ad8a3c4e0d0e4bb2bcebec0d565892c 100644 (file)
@@ -37,8 +37,8 @@ Dispatcher::Dispatcher(Parameters* _params, MainWindow* _window) {
   params = _params;
   mainWindow =_window;
   params->setDispatcher(this);
-  currentGroup = NULL;
-  topGroup = NULL;    
+  currentGroupWidget = NULL;
+  topGroupWidget = NULL;
 }
 
 GroupWidget *Dispatcher::loadProject(const QString& filename) {
@@ -62,7 +62,7 @@ GroupWidget *Dispatcher::loadProject(const QString& filename) {
   params->setCurrentScene(scene);
 */
   try {   
-    topGroup = params->loadProject(root);
+    topGroupWidget = params->loadProject(root);
   }
   catch(Exception e){
     cerr << qPrintable(e.getDefaultMessage()) << endl;
@@ -75,8 +75,8 @@ GroupWidget *Dispatcher::loadProject(const QString& filename) {
   params->projectPath = info.absolutePath();
   params->projectName = info.baseName();
   cout << "project path = " << qPrintable(params->projectPath) << endl;
-  groupList.append(topGroup);
-  return topGroup;
+  groupList.append(topGroupWidget);
+  return topGroupWidget;
 }
 
 void Dispatcher::closeCurrentProject() {
@@ -86,12 +86,18 @@ void Dispatcher::closeCurrentProject() {
   }
   groupList.clear();
   params->destroyGraph();
-  topGroup = NULL;
-  currentGroup = NULL;
+  topGroupWidget = NULL;
+  currentGroupWidget = NULL;
   sceneCounter = 0;
 }
 
-bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2, bool visible) {
+void Dispatcher::setSceneCounter(Context context, int value) {
+
+  if (context != Load) return;
+  sceneCounter = value;
+}
+
+bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, InterfaceItem *iface2, bool visible) {
     
   ConnectedInterface* ref1 = iface1->refInter;
   ConnectedInterface* ref2 = iface2->refInter;  
@@ -114,7 +120,7 @@ bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2,
 
     iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible);
 
-    unselectAllItems();
+    unselectAllItems(context);
     params->unsaveModif = true;
     cout << "created a connection from " << qPrintable(ref1->getName()) << " to " << qPrintable(ref2->getName()) << endl;
     return true;
@@ -123,7 +129,7 @@ bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2,
 }
 
 
-void Dispatcher::unselectAllItems(int direction){
+void Dispatcher::unselectAllItems(Context context, int direction){
 
   GroupScene *scene = params->getCurrentScene();
 
@@ -135,14 +141,14 @@ void Dispatcher::unselectAllItems(int direction){
   scene->update();
 }
 
-void Dispatcher::setCurrentGroupWidget(GroupWidget *win){
+void Dispatcher::setCurrentGroupWidget(Context context, GroupWidget *win){
   win->setFocus();
   win->changeConnectionMode(-1);
-  currentGroup = win;
+  currentGroupWidget = win;
   params->setCurrentScene(win->getScene());
 }
 
-void Dispatcher::changeConnectionMode(int mode){
+void Dispatcher::changeConnectionMode(Context context, int mode){
 
   /*
   foreach(GroupWidget* win, groupList){
@@ -177,7 +183,7 @@ void Dispatcher::changeConnectionMode(int mode){
   */
 }
 
-void Dispatcher::generateVHDL() throw(Exception) {
+void Dispatcher::generateVHDL(Context context) throw(Exception) {
   static QString fctName = "Dispatcher::generateVHDL()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -271,7 +277,7 @@ void Dispatcher::generateVHDL() throw(Exception) {
 
 }
 
-void Dispatcher::generateBlockVHDL(BoxItem *item){
+void Dispatcher::generateBlockVHDL(Context context, BoxItem *item){
   static QString fctName = "Dispatcher::generateBlockVHDL()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -288,7 +294,7 @@ void Dispatcher::generateBlockVHDL(BoxItem *item){
   }
 }
 
-void Dispatcher::renameFunctionalBlock(BoxItem *item){
+void Dispatcher::renameFunctionalBlock(Context context, BoxItem *item){
   static QString fctName = "Dispatcher::renameFunctionalBlock()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -327,7 +333,7 @@ void Dispatcher::renameFunctionalBlock(BoxItem *item){
   item->nameChanged();
 }
 
-void Dispatcher::renameGroupBlock(GroupItem *item){
+void Dispatcher::renameGroupBlock(Context context, GroupItem *item){
   static QString fctName = "Dispatcher::renameGroupBlock()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -373,7 +379,7 @@ void Dispatcher::renameGroupBlock(GroupItem *item){
   mainWindow->getLibrary()->updateComboScene();   
 }
 
-void Dispatcher::renameSourceBlock(SourceItem *item){
+void Dispatcher::renameSourceBlock(Context context, SourceItem *item){
   static QString fctName = "Dispatcher::renameSourceBlock()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -413,7 +419,7 @@ void Dispatcher::renameSourceBlock(SourceItem *item){
 }
 
 
-void Dispatcher::renameInterface(InterfaceItem *item) {
+void Dispatcher::renameInterface(Context context, InterfaceItem *item) {
   static QString fctName = "Dispatcher::renameInterface()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -457,7 +463,7 @@ void Dispatcher::renameInterface(InterfaceItem *item) {
   item->getOwner()->nameChanged();  
 }
 
-void Dispatcher::showPatterns(InterfaceItem *item) {
+void Dispatcher::showPatterns(Context context, InterfaceItem *item) {
   static QString fctName = "Dispatcher::showPatterns()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -501,7 +507,7 @@ void Dispatcher::showPatterns(InterfaceItem *item) {
   QMessageBox::information(NULL,"Interface pattern",msg,QMessageBox::Ok,QMessageBox::Ok);
 }
 
-void Dispatcher::showModifier(InterfaceItem *item) {
+void Dispatcher::showModifier(Context context, InterfaceItem *item) {
   static QString fctName = "Dispatcher::showModifier()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -522,7 +528,7 @@ void Dispatcher::showModifier(InterfaceItem *item) {
   QMessageBox::information(NULL,"Interface pattern",msg,QMessageBox::Ok,QMessageBox::Ok);
 }
 
-void Dispatcher::removeModifier(InterfaceItem *item) {
+void Dispatcher::removeModifier(Context context, InterfaceItem *item) {
   static QString fctName = "Dispatcher::showModifier()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -533,7 +539,7 @@ void Dispatcher::removeModifier(InterfaceItem *item) {
 }
 
 
-void Dispatcher::duplicateBoxItem(BoxItem *item){
+void Dispatcher::duplicateBoxItem(Context context, BoxItem *item){
   static QString fctName = "Dispatcher::duplicateBoxItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -556,7 +562,7 @@ void Dispatcher::duplicateBoxItem(BoxItem *item){
   }
 }
 
-void Dispatcher::duplicateSourceItem(SourceItem *item) {
+void Dispatcher::duplicateSourceItem(Context context, SourceItem *item) {
   static QString fctName = "Dispatcher::duplicateSourceItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -579,7 +585,7 @@ void Dispatcher::duplicateSourceItem(SourceItem *item) {
   }
 }
 
-void Dispatcher::duplicateInterfaceItem(InterfaceItem *item) {
+void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) {
   static QString fctName = "Dispatcher::duplicateInterfaceItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -615,82 +621,95 @@ void Dispatcher::duplicateInterfaceItem(InterfaceItem *item) {
 }
 
 
-BoxItem* Dispatcher::addBlock(int idCategory, int idBlock, int idScene) {
+BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene) {
   static QString fctName = "Dispatcher::addBlock()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
   bool newSource = false;
   BoxItem* item = NULL;
-  GroupScene *scene = getSceneById(idScene);
-  ReferenceBlock* ref = params->getReferenceBlock(idCategory,idBlock);
-  // if block has no inputs, propose to add it as a source to top scene
-  if ((scene->isTopScene()) && (ref->isGeneratorBlock())) {
-    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);
-    item = scene->createBoxItem(newOne);
-    params->blockToItem.insert(newOne,item);
+
+  /* For now, this method is only used while designing and not loading */
+  if (context == Design) {
+    GroupScene *scene = getSceneById(idScene);
+    ReferenceBlock* ref = params->getReferenceBlock(idCategory,idBlock);
+    // if block has no inputs, propose to add it as a source to top scene
+    if ((scene->isTopScene()) && (ref->isGeneratorBlock())) {
+      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, true);
+      scene->createSourceItem(newOne);
+    }
+    else {
+      GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
+      FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true);
+      item = scene->createBoxItem(newOne);
+      params->blockToItem.insert(newOne,item);
+    }
+    params->unsaveModif = true;
   }
-  params->unsaveModif = true;
+
   return item;
 }
 
 
-GroupWidget *Dispatcher::createTopScene(){
+GroupWidget *Dispatcher::createTopScene(Context context){
   static QString fctName = "Dispatcher::createTopScene()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 
-  // creating the model part of the group
-  Graph* graph = params->createGraph();
+  bool createIfaces = true;
+  if (context == Load) {
+    createIfaces = false;
+  }
+  // creating the graph and thus, the topgroup
+  Graph* graph = params->createGraph(createIfaces);
+  // get the top group
   GroupBlock *topBlock = graph->getTopGroup();
-  // creating the clkrstgen block
-  ReferenceBlock* ref = params->getHiddenReferenceBlock("clkrstgen");
-  FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(topBlock, ref);  
-  ConnectedInterface* fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_clk"));
-  ConnectedInterface* toIface = AI_TO_CON(newOne->getIfaceFromName("ext_clk"));
-  fromIface->connectTo(toIface);
-  fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_reset"));
-  toIface = AI_TO_CON(newOne->getIfaceFromName("ext_reset"));
-  fromIface->connectTo(toIface);
-
-  // creating a fake and not connected interface
-  //AbstractInterface* iface = new GroupInterface(refBlock,"grp_iface",AbstractInterface::Input,AbstractInterface::Top);
-
-  // creating the group widget
-  topGroup = new GroupWidget(NULL,this,params);
-  currentGroup = topGroup;
+  // creating the top group widget
+  topGroupWidget = new GroupWidget(NULL,this,params);
+  currentGroupWidget = topGroupWidget;
   // getting the newly created scene
-  GroupScene *scene = topGroup->getScene();
+  GroupScene *scene = topGroupWidget->getScene();
   scene->setId(sceneCounter++);
   params->setTopScene(scene);
   params->setCurrentScene(scene);
   // creating the view part of the group
   GroupItem *group = new GroupItem(NULL,topBlock,this,params);
-
+  // associate the top scene to the top group iten
+  scene->setGroupItem(group);
 
   // adding the fake interface to the top group item
   //InterfaceItem* item = new InterfaceItem(0.0 , Parameters::West, (ConnectedInterface*)iface, group, params);
   //group->addInterface(item,true);
 
-  scene->setGroupItem(group);
 
-  groupList.append(topGroup);
-  return topGroup;
+  if (context == Design) {
+    // creating the clkrstgen block
+    ReferenceBlock* ref = params->getHiddenReferenceBlock("clkrstgen");
+    FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(topBlock, ref, true);
+    ConnectedInterface* fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_clk"));
+    ConnectedInterface* toIface = AI_TO_CON(newOne->getIfaceFromName("ext_clk"));
+    fromIface->connectTo(toIface);
+    fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_reset"));
+    toIface = AI_TO_CON(newOne->getIfaceFromName("ext_reset"));
+    fromIface->connectTo(toIface);
+    // create the clkrstgen boxitem
+    BoxItem* item = scene->createBoxItem(newOne, GroupScene::Left, GroupScene::Top, AbstractBoxItem::Position, BoxItem::HSpan);
+    params->blockToItem.insert(newOne,item);
+  }
+
+
+  groupList.append(topGroupWidget);
+  return topGroupWidget;
 }
 
-GroupWidget* Dispatcher::addNewEmptyGroup(GroupScene* scene, bool show) {
+GroupWidget* Dispatcher::addNewEmptyGroup(Context context, GroupScene* scene, bool show) {
   static QString fctName = "Dispatcher::addNewEmptyGroup();";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -706,13 +725,13 @@ GroupWidget* Dispatcher::addNewEmptyGroup(GroupScene* scene, bool show) {
 
   params->unsaveModif = true;
 
-  GroupWidget* child = createChildScene(scene->getGroupWidget(),newItem);
+  GroupWidget* child = createChildScene(context, scene->getGroupWidget(),newItem);
   if (show) child->show();
   return child;
 
 }
 
-GroupWidget *Dispatcher::createChildScene(GroupWidget* parentWidget, BoxItem *upperItemOfGroupItem) {
+GroupWidget *Dispatcher::createChildScene(Context context, GroupWidget* parentWidget, BoxItem *upperItemOfGroupItem) {
   static QString fctName = "Dispatcher::createChildScene()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -754,9 +773,9 @@ GroupWidget *Dispatcher::createChildScene(GroupWidget* parentWidget, BoxItem *up
   return group;
 }
 
-void Dispatcher::destroyScene(GroupScene *scene) {
+void Dispatcher::destroyScene(Context context, GroupScene *scene) {
   foreach(GroupScene* s, scene->getChildrenScene()) {
-    destroyScene(s);
+    destroyScene(context, s);
   }
 
   if (scene->getNbChildScene() == 0) {
@@ -773,7 +792,7 @@ void Dispatcher::destroyScene(GroupScene *scene) {
   }
 }
 
-void Dispatcher::showRaiseWindow(BoxItem *item) {
+void Dispatcher::showRaiseWindow(Context context, BoxItem *item) {
   static QString fctName = "Dispatcher::showRaiseWindow()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -792,11 +811,11 @@ void Dispatcher::showRaiseWindow(BoxItem *item) {
   win->raise();
   win->activateWindow();
 
-  currentGroup = win;
-  params->setCurrentScene(currentGroup->getScene());
+  currentGroupWidget = win;
+  params->setCurrentScene(currentGroupWidget->getScene());
 }
 
-void Dispatcher::showRstClkIface(AbstractBoxItem *item) {
+void Dispatcher::showRstClkIface(Context context, AbstractBoxItem *item) {
   static QString fctName = "Dispatcher::showRstClkIface()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -806,7 +825,7 @@ void Dispatcher::showRstClkIface(AbstractBoxItem *item) {
   
 }
 
-void Dispatcher::showWishboneIface(AbstractBoxItem *item) {
+void Dispatcher::showWishboneIface(Context context, AbstractBoxItem *item) {
   static QString fctName = "Dispatcher::showWishboneIface()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -815,7 +834,7 @@ void Dispatcher::showWishboneIface(AbstractBoxItem *item) {
   item->setWishboneVisible(!item->isWishboneVisible());  
 }
 
-void Dispatcher::addNewFullGroup() {
+void Dispatcher::addNewFullGroup(Context context) {
   static QString fctName = "Dispatcher::addNewFullGroup()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -976,12 +995,14 @@ void Dispatcher::addNewFullGroup() {
 #endif
 }
 
-void Dispatcher::removeBoxItem(BoxItem *item) {
+void Dispatcher::removeBoxItem(Context context, BoxItem *item) {
   static QString fctName = "Dispatcher::removeBoxItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 
+  if (context != Design) return;
+
   /* a BoxItem (group of func) can be removed only if none of its
      interfaces is connected to a group interface that is itself
      connected to another one.
@@ -1027,7 +1048,7 @@ void Dispatcher::removeBoxItem(BoxItem *item) {
   if (ret == QMessageBox::Cancel) {
     return;
   }
-  removeAllBlockConnections(item);
+  removeAllBlockConnections(context, item);
 
   if (item->getRefBlock()->isFunctionalBlock()) {
     FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());    
@@ -1042,7 +1063,7 @@ void Dispatcher::removeBoxItem(BoxItem *item) {
 
     // remove all child scenes recursively
     GroupItem* subgroup = item->getChildGroupItem();
-    destroyScene(subgroup->getScene());
+    destroyScene(context, subgroup->getScene());
     // remove the BoxItem
     item->getScene()->removeBoxItem(item);
     // remove the group from the graph
@@ -1050,7 +1071,7 @@ void Dispatcher::removeBoxItem(BoxItem *item) {
   }
 }
 
-void Dispatcher::removeAllBlockConnections(AbstractBoxItem *item) {
+void Dispatcher::removeAllBlockConnections(Context context, AbstractBoxItem *item) {
   static QString fctName = "Dispatcher::removeAllBlockConnection()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -1058,12 +1079,12 @@ void Dispatcher::removeAllBlockConnections(AbstractBoxItem *item) {
 
   foreach(InterfaceItem* ifaceItem, item->getInterfaces()) {
     foreach(ConnectionItem* conn, ifaceItem->connections) {
-      removeConnection(conn);
+      removeConnection(context, conn);
     }
   }
 }
 
-void Dispatcher::removeSourceItem(SourceItem *item) {
+void Dispatcher::removeSourceItem(Context context, SourceItem *item) {
   static QString fctName = "Dispatcher::removeSourceItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -1078,7 +1099,7 @@ void Dispatcher::removeSourceItem(SourceItem *item) {
   if (ret == QMessageBox::Cancel) {
     return;
   }
-  removeAllBlockConnections(item);
+  removeAllBlockConnections(context, item);
   
   FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());  
   item->getScene()->removeSourceItem(item);
@@ -1086,7 +1107,7 @@ void Dispatcher::removeSourceItem(SourceItem *item) {
 }
 
 
-void Dispatcher::removeConnection(ConnectionItem *connItem) {
+void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) {
   static QString fctName = "Dispatcher::removeConnection()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -1168,7 +1189,7 @@ void Dispatcher::showBlocksLibrary(){
   mainWindow->getLibrary()->raise();
 }
 
-void Dispatcher::showProperties(InterfaceItem *inter) {
+void Dispatcher::showProperties(Context context, InterfaceItem *inter) {
   new InterfacePropertiesWindow(inter);
 }
 
@@ -1178,7 +1199,7 @@ void Dispatcher::showProperties(InterfaceItem *inter) {
    That action will create a new InterfaceItem on the GroupItem and a connectionItem between the
    interfaces.
 */
-void Dispatcher::connectInterToGroup(InterfaceItem *item){
+void Dispatcher::connectInterToGroup(Context context, InterfaceItem *item){
 
   // getting the GroupBlock and GroupItem that are parent of the block that owns item
   ConnectedInterface *refInter = item->refInter;
@@ -1201,7 +1222,7 @@ void Dispatcher::connectInterToGroup(InterfaceItem *item){
   parentItem->addInterfaceItem(groupIfaceItem,true);
 
   // creating the connection, in graph and with an item
-  createConnection(item, groupIfaceItem);
+  createConnection(context, item, groupIfaceItem);
 
   // if groupItem is not topGroup, must also add a new interface to the parent BlockItem
   BoxItem* parent2Item = parentItem->getParentItem();
@@ -1212,11 +1233,11 @@ void Dispatcher::connectInterToGroup(InterfaceItem *item){
 
 
   parentItem->getScene()->updateConnectionItemsShape();
-  unselectAllItems();
+  unselectAllItems(context);
   params->unsaveModif = true;
 }
 
-void Dispatcher::removeFunctionalInterface(InterfaceItem *item) {
+void Dispatcher::removeFunctionalInterface(Context context, InterfaceItem *item) {
   static QString fctName = "Dispatcher::removeBlockInterface()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -1230,7 +1251,7 @@ void Dispatcher::removeFunctionalInterface(InterfaceItem *item) {
      that allows to remove an interface.
    */
   foreach(ConnectionItem* conn, item->connections) {
-    removeConnection(conn);
+    removeConnection(context, conn);
   }
 
   ConnectedInterface* ref = item->refInter;
@@ -1239,7 +1260,7 @@ void Dispatcher::removeFunctionalInterface(InterfaceItem *item) {
   fun->removeInterface(ref);
 }
 
-void Dispatcher::removeGroupInterface(InterfaceItem *item) {
+void Dispatcher::removeGroupInterface(Context context, InterfaceItem *item) {
   static QString fctName = "Dispatcher::removeGroupInterface()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -1249,7 +1270,7 @@ void Dispatcher::removeGroupInterface(InterfaceItem *item) {
      ones to a GroupItem, it is automatically deleted.
    */
   foreach(ConnectionItem* conn, item->connections) {
-    removeConnection(conn);
+    removeConnection(context, conn);
   }
 }
 
@@ -1317,7 +1338,7 @@ InterfaceItem* Dispatcher::getInterfaceItemById(int id) {
   return NULL;
 }
 
-void Dispatcher::findGraphModifications(FunctionalBlock *block) {
+void Dispatcher::findGraphModifications(Context context, FunctionalBlock *block) {
   static QString fctName = "Dispatcher::findGraphModifications()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
index 807c3bb1b7139fc099e5940dec698f44d1df14cf..4354466f7db5acd80329b85225a034e5d87614d6 100644 (file)
@@ -36,57 +36,73 @@ using namespace Qt;
 class Dispatcher {
 
 public:
+  /*!
+   * \brief The Context enum
+   * Some methods are called while creating a design from scratch or when loading
+   * a desgin from a project file previously saved. Thus, their behavior may change
+   * according to the situation. Context is used to specifiy the situation.
+   * Must be always specified.
+   */
+  enum Context {AnyContext = 0, Design = 1, Load = 2 };
+
   Dispatcher(Parameters* _params,             
              MainWindow* _window);
 
   GroupWidget* loadProject(const QString& filename);
 
-  inline int getNumberOfScenes() { return groupList.length(); }
-  
-  void unselectAllItems(int direction=0);
-  void setCurrentGroupWidget(GroupWidget *win);
-  void changeConnectionMode(int mode = -1);
-
-
-  GroupWidget* createTopScene();
-  GroupWidget* createChildScene(GroupWidget* parentWidget, BoxItem* upperItemOfGroupItem = NULL);
-  void destroyScene(GroupScene* scene);
-  void showRaiseWindow(BoxItem *item);
-  void showRstClkIface(AbstractBoxItem *item);
-  void showWishboneIface(AbstractBoxItem *item);
-  GroupWidget *addNewEmptyGroup(GroupScene *scene, bool show = true);
-  void addNewFullGroup();  
 
-  inline GroupWidget* getCurrentGroup() { return currentGroup; }
-
-  inline void setSceneCounter(int value) { sceneCounter = value;}
 
   bool isCurrentProject;
 
-public slots:
-
-  // graph ops
-  QMap<int, QString> getAllGroupNames();
-  void generateVHDL() throw(Exception);
-
-  // scene ops
+  /**************************
+   *  scene ops
+   *************************/
+  // getters
   GroupScene* getSceneById(int id);
   GroupScene* getSceneByName(QString name);
   BoxItem* getBoxItemById(int id);
   GroupItem* getGroupItemById(int id);
   InterfaceItem* getInterfaceItemById(int id);
-
-
-  // block ops
-  BoxItem* addBlock(int idCategory, int idBlock, int idScene);
-  void removeBoxItem(BoxItem* item);
-  void duplicateBoxItem(BoxItem* item);
-  void renameFunctionalBlock(BoxItem* item);
-  void generateBlockVHDL(BoxItem* item);
-  void renameGroupBlock(GroupItem* item);
-  void renameSourceBlock(SourceItem* item);
-  void removeSourceItem(SourceItem* item);
-  void duplicateSourceItem(SourceItem* item);
+  inline GroupWidget* getCurrentGroup() { return currentGroupWidget; }
+  inline int getNumberOfScenes() { return groupList.length(); }
+  // setters
+  void showRaiseWindow(Context context, BoxItem *item);
+  void showRstClkIface(Context context, AbstractBoxItem *item);
+  void showWishboneIface(Context context, AbstractBoxItem *item);
+  void unselectAllItems(Context context, int direction=0);
+  void setCurrentGroupWidget(Context context, GroupWidget *win);
+  void changeConnectionMode(Context context, int mode = -1);
+  void setSceneCounter(Context context, int value);
+  // testers
+  // others
+  GroupWidget* createTopScene(Context context);
+  GroupWidget* createChildScene(Context context, GroupWidget* parentWidget, BoxItem* upperItemOfGroupItem = NULL);
+  void destroyScene(Context context, GroupScene* scene);
+  GroupWidget *addNewEmptyGroup(Context context, GroupScene *scene, bool show = true);
+  void addNewFullGroup(Context context);
+
+  /**************************
+   *  graph ops
+   *************************/
+  // getters
+  QMap<int, QString> getAllGroupNames();
+  // setters
+  // testers
+  // others
+  void generateVHDL(Context context) throw(Exception);
+
+  /**************************
+   *  block ops
+   *************************/
+  BoxItem* addBlock(Context context, int idCategory, int idBlock, int idScene);
+  void removeBoxItem(Context context, BoxItem* item);
+  void duplicateBoxItem(Context context, BoxItem* item);
+  void renameFunctionalBlock(Context context, BoxItem* item);
+  void generateBlockVHDL(Context context, BoxItem* item);
+  void renameGroupBlock(Context context, GroupItem* item);
+  void renameSourceBlock(Context context, SourceItem* item);
+  void removeSourceItem(Context context, SourceItem* item);
+  void duplicateSourceItem(Context context, SourceItem* item);
 
 
   // interface ops
@@ -99,7 +115,7 @@ public slots:
    * connect to group in the contextual menu.
    * Thus, parameter item is always owned by a BoxItem
    */
-  void connectInterToGroup(InterfaceItem* item);  
+  void connectInterToGroup(Context context, InterfaceItem* item);
   /*!
    * \brief removeFunctionalInterface
    * \param item item is always owned by a BoxItem
@@ -108,7 +124,7 @@ public slots:
    * to a BoxItem that represents a functional block and has a multiplicity > 1) and chooses remove in the contextual menu.
    * Thus, parameter item is always owned by a BoxItem
    */
-  void removeFunctionalInterface(InterfaceItem* item);
+  void removeFunctionalInterface(Context context, InterfaceItem* item);
   /*!
    * \brief removeGroupInterface
    * \param item item is always owned by a GroupItem
@@ -117,22 +133,22 @@ public slots:
    * to a GroupItem and if it is connected only to an inner interface) and chooses remove in the contextual menu.
    * Thus, parameter item is always owned by a GroupItem
    */
-  void removeGroupInterface(InterfaceItem* item);
-  void duplicateInterfaceItem(InterfaceItem* item);
-  void showProperties(InterfaceItem *inter);
-  void renameInterface(InterfaceItem* item);
-  void showPatterns(InterfaceItem* item);
-  void showModifier(InterfaceItem* item);
-  void removeModifier(InterfaceItem* item);
+  void removeGroupInterface(Context context, InterfaceItem* item);
+  void duplicateInterfaceItem(Context context, InterfaceItem* item);
+  void showProperties(Context context, InterfaceItem *inter);
+  void renameInterface(Context context, InterfaceItem* item);
+  void showPatterns(Context context, InterfaceItem* item);
+  void showModifier(Context context, InterfaceItem* item);
+  void removeModifier(Context context, InterfaceItem* item);
 
   // connection ops
-  bool createConnection(InterfaceItem *iface1, InterfaceItem *iface2, bool visible = true);
-  void removeAllBlockConnections(AbstractBoxItem *item);
-  void removeConnection(ConnectionItem *conn);
+  bool createConnection(Context context, InterfaceItem *iface1, InterfaceItem *iface2, bool visible = true);
+  void removeAllBlockConnections(Context context, AbstractBoxItem *item);
+  void removeConnection(Context context, ConnectionItem *conn);
 
 
   // analysis ops
-  void findGraphModifications(FunctionalBlock* block); // find modif so that block has compatible inputs
+  void findGraphModifications(Context context, FunctionalBlock* block); // find modif so that block has compatible inputs
 
   // others
   void showBlocksLibrary();
@@ -148,8 +164,8 @@ private:
   // attributes that corresponds to the views
   MainWindow* mainWindow;
   QList<GroupWidget*> groupList;
-  GroupWidget* currentGroup;
-  GroupWidget *topGroup;
+  GroupWidget* currentGroupWidget;
+  GroupWidget *topGroupWidget;
 
   static int sceneCounter;
 };
index 1fe756929ee739a0e45252d1fad79fa6a3d1813b..65c8df81206466a06f0e7cb9eefe7c00f33305ae 100644 (file)
@@ -8,7 +8,7 @@
 #include "ArithmeticEvaluator.h"\r
 \r
 \r
-FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference) throw(Exception) :  AbstractBlock() {\r
+FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference, bool createIfaces) throw(Exception) :  AbstractBlock() {\r
   //if (! _reference->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));\r
   //if (! _group->isGroupBlock()) throw(Exception(BLOCK_INVALID_TYPE));\r
   reference = _reference;\r
@@ -30,6 +30,10 @@ FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference
   delta = -1;\r
   evaluator = NULL;\r
 \r
+  if (createIfaces) {\r
+    populate();\r
+  }\r
+\r
 }\r
 \r
 FunctionalBlock::~FunctionalBlock() {\r
index 99f8a80aa2d4ec9335e64c54bb316ed9ed09a2b7..8e0e2ed9b79a051192a8baa00f040341d0bc88de 100644 (file)
@@ -26,7 +26,7 @@ using namespace Qt;
 class FunctionalBlock : public AbstractBlock {\r
 public:\r
 \r
-  FunctionalBlock(GroupBlock* _parent, ReferenceBlock* _reference) throw(Exception);\r
+  FunctionalBlock(GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces = true) throw(Exception);\r
   ~FunctionalBlock();\r
   // getters\r
   inline ReferenceBlock* getReference() { return reference; }\r
index 1237e744a9416423d2972d5823a7991672052c17..eec7ea8e1249746285f271cb355063022eb0fa01 100644 (file)
@@ -108,16 +108,16 @@ bool FunctionalInterface::canConnectTo(AbstractInterface *iface) {
   // first case: interface of blocks within the same group\r
   if (getOwner()->getParent() == iface->getOwner()->getParent()) {\r
 \r
-    if ((direction == Output) && (iface->getDirection() == Input)) return true;\r
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;\r
+    if ((direction == Output) && (iface->getDirection() == Input) && (purpose == iface->getPurpose())) return true;\r
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;\r
   }\r
   // second case: iface = interface of the group that contains owner of this\r
   else if (getOwner()->getParent() == iface->getOwner()) {\r
-    if ((direction == Output) && (iface->getDirection() == Output)) return true;\r
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;\r
+    if ((direction == Output) && (iface->getDirection() == Output) && (purpose == iface->getPurpose())) return true;\r
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;\r
   }\r
   else if ((getOwner()->isSourceBlock()) && (iface->getOwner()->isTopGroupBlock())) {\r
-    if ((direction == Output) && (iface->getDirection() == Input)) return true;\r
+    if ((direction == Output) && (iface->getDirection() == Input) && (purpose == iface->getPurpose())) return true;\r
   }\r
 \r
   return false;\r
@@ -146,12 +146,12 @@ bool FunctionalInterface::canConnectFrom(AbstractInterface *iface) {
 \r
   if (getOwner()->getParent() == iface->getOwner()->getParent()) {\r
 \r
-    if ((direction == Input) && (iface->getDirection() == Output)) return true;\r
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;\r
+    if ((direction == Input) && (iface->getDirection() == Output) && (purpose == iface->getPurpose())) return true;\r
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;\r
   }\r
   else if (getOwner()->getParent() == iface->getOwner()) {\r
-    if ((direction == Input) && (iface->getDirection() == Input)) return true;\r
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;\r
+    if ((direction == Input) && (iface->getDirection() == Input) && (purpose == iface->getPurpose())) return true;\r
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;\r
   }\r
 \r
   return false;\r
index 46159ff39538f56b127d340171b62c40384d88bd..a64d8aa7dd16a1279f670758ce95d3bf6542e7a9 100644 (file)
--- a/Graph.cpp
+++ b/Graph.cpp
@@ -3,8 +3,8 @@
 #include "ReferenceBlock.h"
 #include "FunctionalBlock.h"
 
-Graph::Graph() {
-  topGroup = new GroupBlock(NULL);
+Graph::Graph(bool createTopGroupIface) {
+  topGroup = new GroupBlock(NULL, createTopGroupIface);
   topGroup->setName("top group");
   groups.append(topGroup);
 }
@@ -18,8 +18,8 @@ QList<AbstractInterface *> Graph::getOutsideInterfaces() {
   return topGroup->getInterfaces();
 }
 
-GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent) {
-  GroupBlock* b = new GroupBlock(parent);
+GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent, bool createGroupIface) {
+  GroupBlock* b = new GroupBlock(parent, createGroupIface);
   groups.append(b);
   return b;
 }
@@ -38,10 +38,9 @@ GroupBlock* Graph::getGroupBlockByName(QString name) {
   return NULL;
 }
 
-FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock* ref) {
+FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock* ref, bool createIfaces) {
 
-  FunctionalBlock* newBlock = new FunctionalBlock(group,ref);
-  newBlock->populate();
+  FunctionalBlock* newBlock = new FunctionalBlock(group,ref, createIfaces);
   group->addBlock(newBlock);
 
   return newBlock;
@@ -53,7 +52,7 @@ FunctionalBlock* Graph::duplicateFunctionalBlock(FunctionalBlock *block) {
   GroupBlock* group = AB_TO_GRP(block->getParent());
 
   // adding to the graph
-  FunctionalBlock* newBlock = createFunctionalBlock(group,ref);
+  FunctionalBlock* newBlock = createFunctionalBlock(group,ref, true);
   return newBlock;
 }
 
@@ -78,10 +77,9 @@ FunctionalBlock* Graph::getFunctionalBlockByName(QString name, GroupBlock* paren
   return block;
 }
 
-FunctionalBlock* Graph::createSourceBlock(ReferenceBlock* ref) {
+FunctionalBlock* Graph::createSourceBlock(ReferenceBlock* ref, bool createIfaces) {
 
-  FunctionalBlock* newBlock = new FunctionalBlock(NULL,ref);
-  newBlock->populate();
+  FunctionalBlock* newBlock = new FunctionalBlock(NULL,ref, createIfaces);
   sources.append(newBlock);
   return newBlock;
 }
@@ -91,7 +89,7 @@ FunctionalBlock* Graph::duplicateSourceBlock(FunctionalBlock *block) {
   ReferenceBlock* ref = block->getReference();  
 
   // adding to the graph
-  FunctionalBlock* newBlock = createSourceBlock(ref);
+  FunctionalBlock* newBlock = createSourceBlock(ref, true);
   return newBlock;
 }
 
diff --git a/Graph.h b/Graph.h
index 8b2015fdb736c769c9022ba7d05cff2168961406..a9b90aaf0198cd9941dc66ee0711a4bd3eb7d507 100644 (file)
--- a/Graph.h
+++ b/Graph.h
@@ -19,7 +19,7 @@ using namespace Qt;
 class Graph {
 
 public:
-  Graph();
+  Graph(bool createTopGroupIface = true);
   ~Graph();
 
   // getters  
@@ -27,18 +27,18 @@ public:
   inline QList<GroupBlock*> getAllGroups() { return groups; }
   
   // methods for group blocks
-  GroupBlock* createChildGroupBlock(GroupBlock* parent);
+  GroupBlock* createChildGroupBlock(GroupBlock* parent, bool createGroupIface = true);
   void removeGroupBlock(GroupBlock *group);
   GroupBlock* getGroupBlockByName(QString name);
   
   // methods for functional blocks
-  FunctionalBlock* createFunctionalBlock(GroupBlock *group, ReferenceBlock *ref);
+  FunctionalBlock* createFunctionalBlock(GroupBlock *group, ReferenceBlock *ref, bool createIfaces = true);
   FunctionalBlock* duplicateFunctionalBlock(FunctionalBlock *block);
   bool removeFunctionalBlock(FunctionalBlock* block);
   FunctionalBlock* getFunctionalBlockByName(QString name, GroupBlock* parent = NULL); //! if parent = NULL, search in the whole graph
 
   // methods for source blocks
-  FunctionalBlock* createSourceBlock(ReferenceBlock *ref);
+  FunctionalBlock* createSourceBlock(ReferenceBlock *ref, bool createIfaces = true);
   FunctionalBlock* duplicateSourceBlock(FunctionalBlock *block);
   FunctionalBlock* getSourceBlockByName(QString name);
   bool removeSourceBlock(FunctionalBlock* block);
index ab76563048265cd375aabeaeecff9a6d0f606f7b..7945ee75e0c8f991538f07eecb732dc9adc78428 100644 (file)
@@ -10,7 +10,7 @@
 
 int GroupBlock::counter = 1;
 
-GroupBlock::GroupBlock(GroupBlock *_parent) throw(Exception) :  AbstractBlock() {
+GroupBlock::GroupBlock(GroupBlock *_parent, bool createIfaces) throw(Exception) :  AbstractBlock() {
 
   GroupInterface* clk = NULL;
   GroupInterface* rst = NULL;
index c3b6f9cf5a72fa26505445ced26a7ab68316039c..63104def7d2b08ca88e330b474e71cfa890b37a5 100644 (file)
@@ -17,7 +17,7 @@ using namespace Qt;
 class GroupBlock : public AbstractBlock {
 public:
 
-  GroupBlock(GroupBlock* _parent) throw(Exception);
+  GroupBlock(GroupBlock* _parent, bool createIfaces = true) throw(Exception);
   virtual ~GroupBlock();
 
   // getters
index c611ecfbb22f03796fc4aec3d097d9a424bfd8f8..5f292b6aad1a94488dd809206f78b7802059a5a0 100644 (file)
@@ -70,17 +70,17 @@ bool GroupInterface::canConnectTo(AbstractInterface *iface) {
   if (connIface->getConnectedFrom() != NULL) return false;
 
   if (this->getOwner() == iface->getOwner()->getParent()) {
-    if ((direction == Input) && (iface->getDirection() == Input)) return true;
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
+    if ((direction == Input) && (iface->getDirection() == Input) && (purpose == iface->getPurpose())) return true;
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;
 
   }
   else if (this->getOwner()->getParent() == iface->getOwner()->getParent()) {
-    if ((direction == Output) && (iface->getDirection() == Input)) return true;
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
+    if ((direction == Output) && (iface->getDirection() == Input) && (purpose == iface->getPurpose())) return true;
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;
   }
   else if (this->getOwner()->getParent() == iface->getOwner()) {
-    if ((direction == Output) && (iface->getDirection() == Output)) return true;
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
+    if ((direction == Output) && (iface->getDirection() == Output) && (purpose == iface->getPurpose())) return true;
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;
   }
   
 
@@ -110,20 +110,20 @@ bool GroupInterface::canConnectFrom(AbstractInterface *iface) {
   if (getConnectedFrom() != NULL) return false;
 
   if (this->getOwner() == iface->getOwner()->getParent()) {
-    if ((direction == Output) && (iface->getDirection() == Output)) return true;
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
+    if ((direction == Output) && (iface->getDirection() == Output) && (purpose == iface->getPurpose())) return true;
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;
 
   }
   else if (this->getOwner()->getParent() == iface->getOwner()->getParent()) {
-    if ((direction == Input) && (iface->getDirection() == Output)) return true;
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
+    if ((direction == Input) && (iface->getDirection() == Output) && (purpose == iface->getPurpose())) return true;
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;
   }
   else if (this->getOwner()->getParent() == iface->getOwner()) {
-    if ((direction == Input) && (iface->getDirection() == Input)) return true;
-    if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
+    if ((direction == Input) && (iface->getDirection() == Input) && (purpose == iface->getPurpose())) return true;
+    if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;
   }
   else if ((getOwner()->isTopGroupBlock()) && (iface->getOwner()->isSourceBlock())) {
-    if ((direction == Input) && (iface->getDirection() == Output)) return true;
+    if ((direction == Input) && (iface->getDirection() == Output) && (purpose == iface->getPurpose())) return true;
   }
 
   return false;
index 3286c14a9ae5e9d74863cab1c4f6e92ea7e05d40..ebef87ca47501f5b8d3bc6d3bae616bbcbdc5844 100644 (file)
@@ -384,7 +384,7 @@ void GroupItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
 
   int mode = getScene()->getEditionMode();
 
-  dispatcher->setCurrentGroupWidget(getScene()->getGroupWidget());
+  dispatcher->setCurrentGroupWidget(Dispatcher::Design, getScene()->getGroupWidget());
 
   if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) {
     InterfaceItem *inter = getInterfaceItemFromCursor(x,y);
@@ -448,7 +448,7 @@ void GroupItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
     else if (params->editState == Parameters::EditCloseConnection) {
       InterfaceItem* iface1 = getScene()->getSelectedInterface(1);
       InterfaceItem* iface2 = getScene()->getSelectedInterface(2);      
-      bool ok = dispatcher->createConnection(iface1,iface2);     
+      bool ok = dispatcher->createConnection(Dispatcher::Design, iface1,iface2);
       if (ok) {
         iface1->selected = false;
         update(iface1->boundingRect());
@@ -585,15 +585,15 @@ void GroupItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
 
   if(selectedAction == renameAction){
     if(ifaceItem != NULL)
-      dispatcher->renameInterface(ifaceItem);
+      dispatcher->renameInterface(Dispatcher::Design, ifaceItem);
     else
-      dispatcher->renameGroupBlock(this);
+      dispatcher->renameGroupBlock(Dispatcher::Design, this);
   }
   else if(selectedAction == showProperties){
-    dispatcher->showProperties(ifaceItem);
+    dispatcher->showProperties(Dispatcher::Design, ifaceItem);
   }  
   else if (selectedAction == removeAction) {
-    dispatcher->removeGroupInterface(ifaceItem);
+    dispatcher->removeGroupInterface(Dispatcher::Design, ifaceItem);
   }
   else if(selectedAction == showParameters) {
     new ParametersWindow(refBlock, params, NULL);
index 2ceb21fdc2b63264b6c937cb65566bb149b5aabc..0eaa8a1dc8435587cbd5d4ebe70da8e921ab71b1 100644 (file)
@@ -103,16 +103,35 @@ int GroupScene::setInterfacesId(int countInit) {
   return counter;
 }
 
-BoxItem *GroupScene::createBoxItem(AbstractBlock *block) {
+BoxItem *GroupScene::createBoxItem(AbstractBlock *block, BoxItem::Position hPos, BoxItem::Position vPos, AbstractBoxItem::LockType lock, BoxItem::SpanType span) {
 
-  BoxItem* item = new BoxItem(block,dispatcher,params,groupItem);
+  BoxItem* item = new BoxItem(block,dispatcher,params,groupItem, lock, span);
   item->setZValue(1);
   // add item from the QList
   boxItems.append(item);
   // repainting the group
   groupItem->updateShape();
   // center the new block
-  QPointF newPos((groupItem->getWidth()-item->getTotalWidth())/2.0, (groupItem->getHeight()-item->getTotalHeight())/2.0);
+  double x,y;
+  if (hPos == BoxItem::Left) {
+    x = 0;
+  }
+  else if (hPos == BoxItem::Center) {
+    x = (groupItem->getWidth()-item->getTotalWidth())/2.0;
+  }
+  else if (hPos == BoxItem::Right) {
+    x = groupItem->getWidth()-item->getTotalWidth();
+  }
+  if (vPos == BoxItem::Top) {
+    y = 0;
+  }
+  else if (vPos == BoxItem::Center) {
+    y = (groupItem->getHeight()-item->getTotalHeight())/2.0;
+  }
+  else if (vPos == BoxItem::Bottom) {
+    y = groupItem->getHeight()-item->getTotalHeight();
+  }
+  QPointF newPos(x,y);
   newPos = newPos-item->getOriginPoint();
   item->moveTo(newPos);
 
index e2e47633ef8d842ea277df0fc2074426379d24a8..bcaa79904765642a563ded9aff6bb6d10a822035 100644 (file)
@@ -10,6 +10,7 @@ class Parameters;
 class AbstractBlock;
 class GroupWidget;
 class GroupItem;
+#include "BoxItem.h"
 class BoxItem;
 class SourceItem;
 class AbstractBoxItem;
@@ -44,6 +45,7 @@ public:
    */
   enum EditMode { InitState, AddConnection, ItemEdition };
 
+
   GroupScene(GroupScene* _parentScene, GroupWidget* _window, Dispatcher* _dispatcher, Parameters* _params, bool topScene = false, QObject *parent = 0);
   ~GroupScene();
 
@@ -74,7 +76,7 @@ public:
   // others  
   
   // BoxItem related
-  BoxItem* createBoxItem(AbstractBlock* block); //! create a new BoxItem and place it at the center of the scene
+  BoxItem* createBoxItem(AbstractBlock* block, BoxItem::Position hPos = Center, BoxItem::Position vPos = Center, AbstractBoxItem::LockType lock = AbstractBoxItem::NoLock, BoxItem::SpanType span = BoxItem::NoSpan); //! create a new BoxItem and place it at the center of the scene
   void addBoxItem(BoxItem* item); //! add an already configured BoxItem in the scene.
   void removeBoxItem(BoxItem* item);
   
index 54cdfc13dd62d31465e0d6a747c9e44d9bf5b7ab..c530c2bd7985ec7d856fafef18146512a19f9de6 100644 (file)
@@ -21,7 +21,7 @@ GroupWidget::GroupWidget(GroupWidget *_upperGroup, Dispatcher *_dispatcher,
     scene = new GroupScene(NULL, this, dispatcher, params, true);
   }
   else {
-    topGroup = true;
+    topGroup = false;
     scene = new GroupScene(upperGroup->getScene(), this, dispatcher, params, false);
   }
 
@@ -85,7 +85,7 @@ void GroupWidget::enableGroupButton(bool b) {
 
 
 void GroupWidget::mousePressEvent(QMouseEvent *e) {
-  dispatcher->setCurrentGroupWidget(this);
+  dispatcher->setCurrentGroupWidget(Dispatcher::Design, this);
   QWidget::mousePressEvent(e);
 }
 
@@ -179,7 +179,7 @@ void GroupWidget::createToolbar() {
 }
 
 void GroupWidget::slotEdit() {
-  dispatcher->unselectAllItems();
+  dispatcher->unselectAllItems(Dispatcher::Design);
   getScene()->setEditionMode(GroupScene::ItemEdition);
   updateBlockButton();
 }
@@ -187,13 +187,13 @@ void GroupWidget::slotEdit() {
 void GroupWidget::slotCopyBlock() {
   foreach (BoxItem *item, params->getCurrentScene()->getBoxItems()) {
     if(item->isSelected()){
-      dispatcher->duplicateBoxItem(item);
+      dispatcher->duplicateBoxItem(Dispatcher::Design, item);
     }
   }
 }
 
 void GroupWidget::slotAddConnection() {
-  dispatcher->unselectAllItems();
+  dispatcher->unselectAllItems(Dispatcher::Design);
   getScene()->setEditionMode(GroupScene::AddConnection);
   updateBlockButton();
 }
@@ -229,24 +229,24 @@ void GroupWidget::updateBlockButton() {
 
 void GroupWidget::slotNewEmptyGroup() {
 
-  dispatcher->addNewEmptyGroup(scene);
+  dispatcher->addNewEmptyGroup(Dispatcher::Design, scene);
 
 }
 
 void GroupWidget::slotNewGroup()
 {
-  dispatcher->addNewFullGroup();
+  dispatcher->addNewFullGroup(Dispatcher::Design );
 }
 
 void GroupWidget::slotDeleteItems() {
   foreach (BoxItem *item, scene->getBoxItems()) {
     if(item->isSelected()){
-      dispatcher->removeBoxItem(item);
+      dispatcher->removeBoxItem(Dispatcher::Design, item);
     }
   }
   foreach (ConnectionItem *item, scene->getConnectionItems()) {
     if(item->isSelected()){
-      dispatcher->removeConnection(item);
+      dispatcher->removeConnection(Dispatcher::Design, item);
     }
   }
 }
index 166dfa29511d591682f0769da801aa776297cd82..2b8584fc9820779b448edc90bd2965030b0acf33 100644 (file)
@@ -344,7 +344,7 @@ void MainWindow::slotNewProject(){
   if (ret == 1) {
     enableProjectActions(true, PROJECT_CLOSE | PROJECT_SAVE | PROJECT_SAVEAS | PROJECT_LIB, OP_RAZ);
     enableAnalysisActions(true, ANALYSIS_ANALYZE | ANALYSIS_GENERATE, OP_RAZ);
-    GroupWidget* topGroup = dispatcher->createTopScene();
+    GroupWidget* topGroup = dispatcher->createTopScene(Dispatcher::Design);
     addTopGroup(topGroup);
     library->updateComboScene();
     library->show();
@@ -443,7 +443,7 @@ void MainWindow::slotGraphAnalysis() {
       msg += " is not compatible with its input pattern.\nDo you want to launch automatic modification process to ensure the compatibility ?";
       int ret = QMessageBox::question(this,tr("Building references library"),msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
       if (ret == QMessageBox::Ok) {
-        dispatcher->findGraphModifications(toBlock);
+        dispatcher->findGraphModifications(Dispatcher::Design, toBlock);
       }
     }
   }
@@ -452,7 +452,7 @@ void MainWindow::slotGraphAnalysis() {
 void MainWindow::slotGenerateVHDL() {
 
   try {
-    dispatcher->generateVHDL();
+    dispatcher->generateVHDL(Dispatcher::Design);
   }
   catch(Exception e) {
     cerr << qPrintable(e.getMessage()) << endl;
@@ -486,7 +486,7 @@ void MainWindow::closeEvent(QCloseEvent *event) {
 void MainWindow::mousePressEvent(QMouseEvent *e) {
 
   if (dispatcher->getCurrentGroup() != NULL) {
-    dispatcher->setCurrentGroupWidget(dispatcher->getCurrentGroup());
+    dispatcher->setCurrentGroupWidget(Dispatcher::Design, dispatcher->getCurrentGroup());
   }
   QMainWindow::mousePressEvent(e);
 }
index 033b686a15d455317e2e5d5d7dbac1309ad4f88a..d98d04aeac9b7ae574805b7aedf5d01e5aa776d2 100644 (file)
@@ -25,32 +25,61 @@ NewProjectDialog::NewProjectDialog(Parameters *_params, QWidget *parent) : Custo
   layDirProj->addWidget(dirProjEdit);
   layDirProj->addWidget(dirProjButton);
 
+  QHBoxLayout *layClk = new QHBoxLayout;
+  QLabel* clkLab1 = new QLabel(tr("Main clock freq."));
+  QLabel* clkLab2 = new QLabel(tr("MHz"));
+  clkEdit = new QLineEdit("100");
+  layClk->addWidget(clkLab1);
+  layClk->addWidget(clkEdit);
+  layClk->addWidget(clkLab2);
+
+  QHBoxLayout *layAuto = new QHBoxLayout;
+  autoConnClkCheck = new QCheckBox("Auto-connect blocks to main clock");
+  autoConnClkCheck->setChecked(true);
+
 
   QVBoxLayout *layAll = new QVBoxLayout;
   layAll->addLayout(layNameProj);
   layAll->addLayout(layDirProj);
+  layAll->addLayout(layClk);
+  layAll->addLayout(layAuto);
 
   setContent(layAll);   
 
   connect(dirProjButton,SIGNAL(clicked()),this,SLOT(chooseProjectPath()));
   connect(nameProjEdit,SIGNAL(textChanged(QString)),this,SLOT(checkProjectName(QString)));
   connect(dirProjEdit,SIGNAL(textChanged(QString)),this,SLOT(checkProjectPath(QString)));
-
 }
 
+
 void NewProjectDialog::checkBeforeAccept() {
 
-  if ((!nameProjEdit->text().isEmpty()) && (pathOk)) {
-    //cout << "all ok" << endl;
-    params->projectPath = dirProjEdit->text();
-    params->projectFile = params->projectPath + "/" + params->projectName + ".xml";
+  if ((nameProjEdit->text().isEmpty()) || (!pathOk)) {
 
-    accept();
+      int ret = QMessageBox::warning(this,"Cannot create the project","Invalid project path");
+      return;
+  }
+  double freq;
+  bool ok = false;
+  freq = clkEdit->text().toDouble(&ok);
+  if (!ok) {
+    int ret = QMessageBox::warning(this,"Cannot create the project","Invalid main clock frequency (in MHz)");
+    return;
   }
-  else {
-    int ret = QMessageBox::warning(this,"Cannot create the project","Invalid project path");
 
+  //cout << "all ok" << endl;
+  params->projectPath = dirProjEdit->text();
+  params->projectFile = params->projectPath + "/" + params->projectName + ".xml";
+  params->clocks.append(freq);
+  if (autoConnClkCheck->isChecked()) {
+    params->autoConnMainClk = true;
+  }
+  else {
+    params->autoConnMainClk = false;
   }
+
+  accept();
+
 }
 
 void NewProjectDialog::chooseProjectPath() {
index cad5c060b6abd9e9b9e55c045ef1f45cd69dc4c0..2ac70b3457af75455cf92b327218722fa5bbc077 100644 (file)
@@ -28,14 +28,16 @@ private:
   QLineEdit *nameProjEdit;  
   QLineEdit *dirProjEdit;
   QPushButton *dirProjButton;
+  QCheckBox *autoConnClkCheck;
+  QLineEdit *clkEdit;
+
   bool pathOk;
 
 private slots:
   void checkBeforeAccept();
   void chooseProjectPath();
   void checkProjectPath(QString name);
-  void checkProjectName(QString name);
-
+  void checkProjectName(QString name);  
 
 };
 
index 2ee625592f4e0f36f19a63ac33e4da397d7d4f61..60d7971c07e228dc849b2f7875f652b77a0dc696 100644 (file)
@@ -69,8 +69,8 @@ void Parameters::clear() {
   refPathes.clear();\r
 }\r
 \r
-Graph* Parameters::createGraph() {\r
-  graph = new Graph();\r
+Graph* Parameters::createGraph(bool createTopGroupIfaces) {\r
+  graph = new Graph(createTopGroupIfaces);\r
   return graph;\r
 }\r
 \r
@@ -272,7 +272,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
 \r
     if (idUpperScene == -1) {\r
-      topGroup = dispatcher->createTopScene();\r
+      topGroup = dispatcher->createTopScene(Dispatcher::Load);\r
       topScene->setId(idScene);\r
       groupItem = topScene->getGroupItem();      \r
       cout << "top group added to scene n°" << idScene << endl;\r
@@ -280,7 +280,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     else {\r
       cout << "trying to create scene n°" << idScene << " with upper scene n°" <<idUpperScene << endl;\r
       GroupScene* upperScene = searchSceneById(idUpperScene, topScene);\r
-      groupWidget = dispatcher->addNewEmptyGroup(upperScene,false);\r
+      groupWidget = dispatcher->addNewEmptyGroup(Dispatcher::Load, upperScene,false);\r
       groupWidget->getScene()->setId(idScene);\r
       groupItem = groupWidget->getScene()->getGroupItem();      \r
     }\r
@@ -302,7 +302,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
       cout << qPrintable(groupItem->getRefBlock()->getName()) << " has upper box item in " << qPrintable(groupItem->getParentItem()->getScene()->getGroupItem()->getRefBlock()->getName()) << endl;\r
     }    \r
   }\r
-  dispatcher->setSceneCounter(maxIdScene+1);\r
+  dispatcher->setSceneCounter(Dispatcher::Load, maxIdScene+1);\r
   cout << "groupItems loaded and windows created succefully!" << endl;\r
 \r
   /**********************************************************\r
@@ -457,7 +457,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     InterfaceItem *iface2 = searchInterfaceItemById(to,topScene);\r
 \r
     if(iface1 != NULL && iface2 != NULL){\r
-      dispatcher->createConnection(iface1,iface2);\r
+      dispatcher->createConnection(Dispatcher::Load, iface1,iface2);\r
     } else {\r
       cout << "interfaces not found, connect canceled!" << endl;\r
     }\r
index 9b4ee1bc64d7cf04a6b5b46c4017a09d01c2f07b..a541ee66461ac87bb9994169c91853b0db820377 100644 (file)
@@ -138,8 +138,10 @@ public :
   QString projectPath;\r
   QString projectName;\r
   QString projectFile; // equals to projectPath/projectName.xml\r
+  bool autoConnMainClk; // true if auto-connection to main clock (i.e. ext_clk)\r
+  QList<double> clocks; // clocks[0] is the main clock.\r
 \r
-  Graph* createGraph();\r
+  Graph* createGraph(bool createTopGroupIfaces = true);\r
   void destroyGraph();\r
   inline Graph* getGraph() { return graph; }  \r
   ReferenceBlock* getReferenceBlock(int idCategory, int idBlock); // get the reference block from its category and index\r
index 89413b0de8c01a08cd15c273afd239d4a7d9bba7..d12284774bd426cddd9279284340bffef9384a11 100644 (file)
@@ -315,7 +315,7 @@ void SourceItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
 
   int mode = getScene()->getEditionMode();
 
-  dispatcher->setCurrentGroupWidget(getScene()->getGroupWidget());
+  dispatcher->setCurrentGroupWidget(Dispatcher::Design, getScene()->getGroupWidget());
 
   if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) {
     InterfaceItem *inter = getInterfaceItemFromCursor(x,y);
@@ -389,7 +389,7 @@ void SourceItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
     else if (params->editState == Parameters::EditCloseConnection) {
       InterfaceItem* iface1 = getScene()->getSelectedInterface(1);
       InterfaceItem* iface2 = getScene()->getSelectedInterface(2);
-      bool ok = dispatcher->createConnection(iface1,iface2);
+      bool ok = dispatcher->createConnection(Dispatcher::Design, iface1,iface2);
       if (ok) {
         iface1->selected = false;
         update(iface1->boundingRect());
@@ -539,27 +539,27 @@ void SourceItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
   if(selectedAction == NULL) return ;
 
   if (selectedAction == removeAction) {    
-    dispatcher->removeSourceItem(this);    
+    dispatcher->removeSourceItem(Dispatcher::Design, this);
   }
   else if (selectedAction == duplicateAction) {
-    dispatcher->duplicateSourceItem(this);
+    dispatcher->duplicateSourceItem(Dispatcher::Design, this);
   }
   else if(selectedAction == renameAction){
     if(ifaceItem != NULL) {
-      dispatcher->renameInterface(ifaceItem);
+      dispatcher->renameInterface(Dispatcher::Design, ifaceItem);
     }
     else {      
-      dispatcher->renameSourceBlock(this);      
+      dispatcher->renameSourceBlock(Dispatcher::Design, this);
     }   
   }
   else if(selectedAction == showProperties){
-    dispatcher->showProperties(ifaceItem);
+    dispatcher->showProperties(Dispatcher::Design, ifaceItem);
   }  
   else if(selectedAction == showParameters){
     new ParametersWindow(refBlock, params, NULL);
   }      
   else if(selectedAction == showPatterns) {
-    dispatcher->showPatterns(ifaceItem);
+    dispatcher->showPatterns(Dispatcher::Design, ifaceItem);
   }
 }
 
index 0c8b1dc1ca63b79411088f2b8679bfbe0662a26a..0cdb79801a825344f8ab50e1961273ded5b5fb3c 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.2.0, 2018-04-13T16:44:04. -->
+<!-- Written by QtCreator 4.2.0, 2018-04-20T16:47:23. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
diff --git a/lib/implementations/#toto.txt# b/lib/implementations/#toto.txt#
deleted file mode 100644 (file)
index 02b0815..0000000
+++ /dev/null
@@ -1 +0,0 @@
-((1{$group_size}0{$group_delay-1}){($item_per_line-1)|$group_size}1{1+(($item_per_line-1)%$group_size)}0{$line_delay-1}){$nb_lines}
\ No newline at end of file