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

Private GIT Repository
1st commit of all files
[blast.git] / BoxItem.cpp
1 #include "BoxItem.h"
2 #include "GroupScene.h"
3 #include "ConnectionItem.h"
4 #include "InterfaceItem.h"
5 #include "GroupItem.h"
6 #include "Parameters.h"
7 #include "Exception.h"
8 #include "Dispatcher.h"
9 #include "FunctionalBlock.h"
10 #include "FunctionalInterface.h"
11 #include "ReferenceInterface.h"
12 #include "ReferenceBlock.h"
13 #include "ParametersWindow.h"
14 #include "BlockParameter.h"
15
16
17 BoxItem::BoxItem(AbstractBlock *_refBlock,
18                      Dispatcher *_dispatcher,
19                      Parameters *_params, GroupItem *parent) throw(Exception) : AbstractBoxItem( _refBlock, _dispatcher, _params, parent) {
20
21   /*  NOTE :
22      _refBlock : mandatory a FunctionalBlock or a GroupBlock
23   */
24   if (_refBlock->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));
25
26   childGroupItem = NULL;
27   //boxWidth = params->defaultBlockWidth;
28   //boxHeight = params->defaultBlockHeight;
29   currentBorder = NoBorder;
30   selected = false;
31
32   setZValue(100);
33   setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges);
34
35   initInterfaces();
36   updateGeometry();
37   resetInterfacesPosition();
38   QPointF initPos = QPointF(0.0,0.0) - originPoint;
39   setPos(initPos);
40   //cout << "total size of block: " << totalWidth << "," << totalHeight << endl;
41   //cout << "pos in group: " << x() << "," << y() << endl;
42 }
43
44
45 BoxItem::~BoxItem() {
46 }
47
48 void BoxItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
49   QPen pen(Qt::black, 3);
50   if(selected)
51     pen.setColor(Qt::red);
52
53   painter->setPen(pen);
54   painter->setBrush(Qt::yellow);
55
56   painter->drawRect(0,0,boxWidth, boxHeight);
57   painter->drawText(0,0,boxWidth, boxHeight,Qt::AlignCenter | Qt::TextWordWrap,QString(refBlock->getName()));
58   foreach(InterfaceItem *inter, interfaces) {
59     inter->paint(painter);
60   }
61 }
62
63 void BoxItem::moveTo(QPointF dest) {
64   setPos(dest);
65   currentPosition = dest;
66 }
67
68 bool BoxItem::isBoxItem() {
69   return true;
70 }
71
72 void BoxItem::updateMinimumSize() {
73
74   int maxSouth = 0;
75   int maxNorth = 0;
76   int maxEast = 0;
77   int maxWest = 0;
78   int nbSouth = nbInterfacesByOrientation(Parameters::South);
79   int nbNorth = nbInterfacesByOrientation(Parameters::North);
80   int nbMaxSN = nbNorth;
81   if (nbSouth > nbNorth) nbMaxSN = nbSouth;
82   int nbEast = nbInterfacesByOrientation(Parameters::East);
83   int nbWest = nbInterfacesByOrientation(Parameters::West);
84   int nbMaxEW = nbEast;
85   if (nbWest > nbEast) {
86     nbMaxEW = nbWest;
87   }
88
89   int ifaceWidth = 0;
90   int ifaceHeight = 0;
91
92   foreach(InterfaceItem* iface, interfaces) {
93     ifaceWidth = iface->getNameWidth();
94     ifaceHeight = iface->getNameHeight();
95     if (iface->getOrientation() == Parameters::South) {
96       if (ifaceWidth > maxSouth) maxSouth = ifaceWidth;
97     }
98     else if (iface->getOrientation() == Parameters::North) {
99       if (ifaceWidth > maxNorth) maxNorth = ifaceWidth;
100     }
101     else if (iface->getOrientation() == Parameters::East) {
102       if (ifaceWidth > maxEast) maxEast = ifaceWidth;
103     }
104     else if (iface->getOrientation() == Parameters::West) {
105       if (ifaceWidth > maxWest) maxWest = ifaceWidth;
106     }
107   }
108
109   /* NB: the width layout is the following
110      ifaceMargin | maxWest | nameMargin | name | nameMargin | maxEast | ifaceMargin
111    */
112   minimumBoxWidth = maxWest+maxEast+nameWidth+2*(ifaceMargin+nameMargin);
113   // if the minimum is not sufficent taking into account N/S interfaces
114   if (minimumBoxWidth < (nbMaxSN*ifaceHeight+ifaceMargin*(nbMaxSN+1))) {
115     minimumBoxWidth = (nbMaxSN*ifaceHeight+ifaceMargin*(nbMaxSN+1));
116   }
117   minimumBoxHeight = maxNorth+maxSouth+3*ifaceMargin;
118   if (minimumBoxHeight < (nbMaxEW*ifaceHeight+ifaceMargin*(nbMaxEW+1))) {
119     minimumBoxHeight = (nbMaxEW*ifaceHeight+ifaceMargin*(nbMaxEW+1));
120   }
121 }
122
123
124 /* updateGeometry() :
125
126  */
127 bool BoxItem::updateGeometry(ChangeType type) {
128
129   currentPosition = pos();
130   //cout << "current pos of block: " << currentPosition.x() << "," << currentPosition.y() << endl;
131   QPointF oldOrigin = originPoint;
132   QSize oldSize(totalWidth,totalHeight);
133
134   bool boxSizeChanged = false;
135
136   if ((type == Resize) || (type == InterfaceMove)) {
137     updateMinimumSize();
138   }
139
140   if (type == Resize) {
141     prepareGeometryChange();
142     updateInterfacesAndConnections();
143     boxSizeChanged = true;
144   }
145   if (boxWidth < minimumBoxWidth) {
146     boxWidth = minimumBoxWidth;
147     boxSizeChanged = true;
148   }
149   if (boxHeight < minimumBoxHeight) {
150     boxHeight = minimumBoxHeight;
151      boxSizeChanged = true;
152   }
153   if (boxSizeChanged) {
154     updateInterfacesAndConnections();
155   }
156
157   double x = 0.0;
158   double y = 0.0;
159   totalWidth = boxWidth;
160   totalHeight = boxHeight;
161
162   if(isInterfaces(Parameters::East)){
163     totalWidth += params->arrowWidth+params->arrowLineLength;
164   }
165   if(isInterfaces(Parameters::West)){
166     totalWidth += params->arrowWidth+params->arrowLineLength;
167     x -= params->arrowWidth+params->arrowLineLength;
168   }
169   if(isInterfaces(Parameters::South)){
170     totalHeight += params->arrowWidth+params->arrowLineLength;
171   }
172   if(isInterfaces(Parameters::North)){
173     totalHeight += params->arrowWidth+params->arrowLineLength;
174     y -= params->arrowWidth+params->arrowLineLength;
175   }
176   QSizeF newSize(totalWidth,totalHeight);
177   originPoint.setX(x);
178   originPoint.setY(y);
179
180   if ((boxSizeChanged) || (newSize != oldSize) || (originPoint != oldOrigin)) {
181     prepareGeometryChange();
182     return true;
183   }
184   return false;
185 }
186
187 void BoxItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
188
189   if(params->editState == Parameters::EditBlockMove) {
190     QPointF absPos = currentPosition + originPoint;
191     int marginConn = 2*(params->arrowWidth+params->arrowLineLength);
192     int gapX = event->scenePos().x() - cursorPosition.x();
193     int gapY = event->scenePos().y() - cursorPosition.y();
194
195     //cout << "block abs. pos: " << absPos.x() << "," << absPos.y() << " | ";
196     //cout << "block current. pos: " << currentPosition.x() << "," << currentPosition.y() << " | ";
197
198     if (absPos.x()+gapX < marginConn) {
199       gapX = marginConn-absPos.x();
200     }
201     if (absPos.y()+gapY < marginConn) {
202       gapY = marginConn-absPos.y();
203     }
204     //cout << "gap: " << gapX << "," << gapY << endl;
205     QPointF gap(gapX,gapY);
206     currentPosition = currentPosition+gap;
207     setPos(currentPosition);
208     // update all connections from/to this block
209     foreach(ConnectionItem *item, getScene()->getConnectionItems()){
210       if ((item->getFromInterfaceItem()->getOwner() == this) || (item->getToInterfaceItem()->getOwner() == this)) {
211         item->setPathes();
212       }
213     }
214     cursorPosition = event->scenePos();
215
216     // udpate the groupitem
217     (getScene()->getGroupItem())->updateShape();
218   }
219   else if(params->editState == Parameters::EditBlockResize) {
220
221     int gapX = event->scenePos().x() - cursorPosition.x();
222     int gapY = event->scenePos().y() - cursorPosition.y();
223     //cout << "gap: " << gapX << "," << gapY << endl;
224     switch(currentBorder){
225     case BorderEast: {    
226       if(boxWidth+gapX > minimumBoxWidth){
227         boxWidth += gapX;
228       }
229       break;
230     }
231     case BorderSouth: {      
232       if(boxHeight+gapY > minimumBoxHeight){
233         boxHeight += gapY;
234       }
235       break;
236     }
237     case CornerSouthEast: {
238       if(boxWidth+gapX > minimumBoxWidth){
239         boxWidth += gapX;
240       }
241       if(boxHeight+gapY > minimumBoxHeight){
242         boxHeight += gapY;
243       }
244       break;
245     }
246     case NoBorder:
247       cout << "abnormal case while resizing block" << endl;
248       break;
249     }
250     // recompute the geometry of the block and possibly the group item
251     if (updateGeometry()) {
252       (getScene()->getGroupItem())->updateShape();
253     }
254
255     cursorPosition = event->scenePos();   
256   }
257   else if(params->editState == Parameters::EditInterfaceMove) {
258     prepareGeometryChange();
259     deplaceInterface(event->pos());
260     // recompute the geometry of the block
261     if (updateGeometry()) {
262       cout << "must recompute group item geometry" << endl;
263       (getScene()->getGroupItem())->updateShape();
264     }
265     // update connection from/to the selected interface
266     foreach(ConnectionItem *item, getScene()->getConnectionItems()){
267       if ((item->getFromInterfaceItem() == currentInterface) || (item->getToInterfaceItem() == currentInterface)) {
268         item->setPathes();
269       }
270     }    
271   }
272 }
273
274 void BoxItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
275
276   QPointF pos = event->pos();
277   qreal x = pos.x();
278   qreal y = pos.y();
279
280   //QGraphicsItem::mousePressEvent(event);
281
282   if(event->button() == Qt::RightButton) return;
283
284   int mode = getScene()->getEditionMode();
285
286   dispatcher->setCurrentGroupWidget(getScene()->getGroupWindow());
287
288   if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) {
289     InterfaceItem *inter = getInterfaceFromCursor(x,y);
290     if (inter != NULL) {
291
292       if (params->editState == Parameters::EditNoOperation) {
293         getScene()->setSelectedInterface(1,inter);
294         params->setEditState(Parameters::EditStartConnection);
295       }
296       else if (params->editState == Parameters::EditStartConnection) {
297         if (inter == getScene()->getSelectedInterface(1)) {
298           params->setEditState(Parameters::EditAbortConnection);
299         }
300         else {
301           getScene()->setSelectedInterface(2,inter);
302           params->setEditState(Parameters::EditCloseConnection);
303         }
304       }
305     }
306   }
307   else if (mode == GroupScene::ItemEdition) {
308     setZValue(zValue()+100);
309     if (params->cursorState == Parameters::CursorOnInterface) {
310       InterfaceItem *inter = getInterfaceFromCursor(x,y);
311       if (inter != NULL) {
312         if (inter == currentInterface) {
313            params->setEditState(Parameters::EditInterfaceDeselect);
314         }
315         else {
316           setFlag(ItemIsMovable, false);
317           currentInterface = inter;
318           params->setEditState(Parameters::EditInterfaceMove);
319         }
320       }
321     }
322     else if (params->cursorState == Parameters::CursorInBlock) {
323       selected = !selected;
324       params->setEditState(Parameters::EditBlockMove);
325       cursorPosition = event->scenePos();
326       //cout << "cursor current pos. in scene " << cursorPosition.x() << "," << cursorPosition.y() << endl;
327       update();
328     }
329     else if (params->cursorState == Parameters::CursorOnBorder) {
330       setFlag(ItemIsMovable, false);
331       cursorPosition = event->scenePos();
332       params->setEditState(Parameters::EditBlockResize);
333     }
334   }
335 }
336
337 void BoxItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
338
339   setZValue(zValue()-100);
340
341   int mode = getScene()->getEditionMode();
342
343   if (mode == GroupScene::AddConnection) {
344
345     if (params->editState == Parameters::EditStartConnection) {
346       InterfaceItem* iface = getScene()->getSelectedInterface(1);
347       iface->selected = true;
348       update(iface->boundingRect());
349     }
350     else if (params->editState == Parameters::EditAbortConnection) {
351       InterfaceItem* iface = getScene()->getSelectedInterface(1);
352       iface->selected = false;
353       update(iface->boundingRect());
354       getScene()->setSelectedInterface(1,NULL);
355       params->setEditState(Parameters::EditNoOperation);
356     }
357     else if (params->editState == Parameters::EditCloseConnection) {
358       InterfaceItem* iface1 = getScene()->getSelectedInterface(1);
359       InterfaceItem* iface2 = getScene()->getSelectedInterface(2);
360       bool ok = dispatcher->connect(iface1,iface2);
361       if (ok) {
362         iface1->selected = false;
363         // no update needed since the whole scene will be repainted
364         getScene()->setSelectedInterface(1,NULL);
365         getScene()->setSelectedInterface(2,NULL);
366         params->setEditState(Parameters::EditNoOperation);
367       }
368       else {
369         getScene()->setSelectedInterface(2,NULL);
370         params->setEditState(Parameters::EditStartConnection);
371       }
372     }
373   }
374   else if (mode == GroupScene::ItemEdition) {
375     currentInterface = NULL;
376     params->editState = Parameters::EditNoOperation;
377     setFlag(ItemIsMovable);
378   }
379
380   QGraphicsItem::mouseReleaseEvent(event);
381 }
382
383 void BoxItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
384
385   QPointF pos = event->pos();
386   qreal x = pos.x();
387   qreal y = pos.y();
388   currentBorder = NoBorder;
389   int mode = getScene()->getEditionMode();
390
391   if (mode == GroupScene::AddConnection) {
392     InterfaceItem* iface = getInterfaceFromCursor(x,y);
393     if (iface != NULL) {
394       params->cursorState = Parameters::CursorOnInterface;
395       setCursor(Qt::PointingHandCursor);
396     }
397     else {
398       params->cursorState = Parameters::CursorNowhere;
399       setCursor(Qt::ArrowCursor);
400     }
401   }
402   else if (mode == GroupScene::ItemEdition) {
403     int marginE = 5;
404     int marginS = 5;
405
406     InterfaceItem* iface = getInterfaceFromCursor(x,y);
407     if (iface != NULL) {
408       params->cursorState = Parameters::CursorOnInterface;
409       setCursor(Qt::PointingHandCursor);
410     }
411     else if ((x>boxWidth-marginE)&&(x<boxWidth)) {
412
413       params->cursorState = Parameters::CursorOnBorder;
414
415       if ((y>boxHeight-2*marginS)&&(y<boxHeight)) {
416         currentBorder = CornerSouthEast;
417         setCursor(Qt::SizeFDiagCursor);
418       }
419       else {
420         currentBorder = BorderEast;
421         setCursor(Qt::SizeHorCursor);
422       }
423     }
424     else if ((y>boxHeight-marginS)&&(y<boxHeight)) {
425
426       params->cursorState = Parameters::CursorOnBorder;
427
428       if ((x>boxWidth-2*marginE)&&(x<boxWidth)) {
429         currentBorder = CornerSouthEast;
430         setCursor(Qt::SizeFDiagCursor);
431       }
432       else {
433         currentBorder = BorderSouth;
434         setCursor(Qt::SizeVerCursor);
435       }
436     }
437     else {
438       if ((x>0) && (x<boxWidth-marginE) && (y>0) && (y<boxHeight-marginS)) {
439         params->cursorState = Parameters::CursorInBlock;
440         setCursor(Qt::OpenHandCursor);
441       }
442       else {
443         params->cursorState = Parameters::CursorNowhere;
444         setCursor(Qt::ArrowCursor);
445       }
446     }
447   }
448   QGraphicsItem::hoverMoveEvent(event);
449 }
450
451
452 void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
453
454   QMenu menu;
455   QAction* removeAction = menu.addAction("Remove");
456   QAction* duplicateAction = menu.addAction("Duplicate");
457   QAction* renameAction = menu.addAction("Rename");
458   QAction* connectToGroup = NULL;
459   QAction* disconnectFromGroup = NULL;
460   QAction* showProperties = NULL;
461   QAction* cloneInterface = NULL;
462   QAction* openWindow = NULL;
463   QAction* showRstClkInter = NULL;
464   QAction* showParameters = NULL;
465
466   InterfaceItem* ifaceItem = getInterfaceFromCursor(event->pos().x(), event->pos().y());
467   if( ifaceItem != NULL){
468     showProperties = menu.addAction("Show properties");
469
470     ConnectedInterface* iface = ifaceItem->refInter;
471     if ((iface->getDirection() == AbstractInterface::Input) && (iface->getConnectedFrom() == NULL)) {
472         connectToGroup = menu.addAction("Connect to group input");
473     }
474     else if ((iface->getDirection() == AbstractInterface::Output) && (!iface->isConnectedTo())) {
475       connectToGroup = menu.addAction("Connect to group output");
476     }
477     else if ((iface->getConnectionFromParentGroup() != NULL) || (iface->getConnectionToParentGroup() != NULL)) {
478       disconnectFromGroup = menu.addAction("Disconnect from group");
479     }
480
481     if (iface->isFunctionalInterface()) {
482       FunctionalInterface* fi = AI_TO_FUN(ifaceItem->refInter);
483       ReferenceInterface* ri = (ReferenceInterface*)(fi->getReference());
484       if(ri->getMultiplicity() == -1 || ri->getMultiplicity() > 1){
485         cloneInterface = menu.addAction("Clone interface");
486       }
487     }
488   }
489   if(refBlock->isGroupBlock()){
490     openWindow = menu.addAction("Open/show group window");
491   } else {
492     showRstClkInter = menu.addAction("Show reset/clock interfaces");
493     showRstClkInter->setCheckable(true);
494     showRstClkInter->setChecked(rstClkVisible);
495
496     showParameters = menu.addAction("Show parameters");
497   }
498
499   QAction* selectedAction = NULL;
500   selectedAction = menu.exec(event->screenPos());
501
502   if(selectedAction == NULL) return ;
503
504   if (selectedAction == removeAction) {
505     dispatcher->removeBlock(this);
506   }
507   else if (selectedAction == duplicateAction) {
508     dispatcher->duplicateBlock(this);
509   }
510   else if(selectedAction == renameAction){
511     if(ifaceItem != NULL)
512       dispatcher->rename(ifaceItem);
513     else
514       dispatcher->rename(this);
515   }
516   else if(selectedAction == showProperties){
517     dispatcher->showProperties(ifaceItem);
518   }
519   else if (selectedAction == connectToGroup){
520     dispatcher->connectInterToGroup(ifaceItem);
521   }
522   else if (selectedAction == disconnectFromGroup) {
523     dispatcher->disconnectInterFromGroup(ifaceItem);
524   }
525   else if (selectedAction == cloneInterface){
526     dispatcher->duplicateInterface(ifaceItem);
527   }
528   else if (selectedAction == openWindow){
529     dispatcher->showRaiseWindow(this);
530   }
531   else if(selectedAction == showRstClkInter){
532     dispatcher->showRstClkInter(this);
533   }
534   else if(selectedAction == showParameters){
535     new ParametersWindow(refBlock, params, NULL);
536   }
537 }
538
539 void BoxItem::save(QXmlStreamWriter &writer) {
540   if (refBlock->isFunctionalBlock()) {
541     writer.writeStartElement("bi_functional");
542
543     writer.writeAttribute("id",QString::number(id));
544     writer.writeAttribute("ref_xml", ((FunctionalBlock*)refBlock)->getReferenceXmlFile());
545     writer.writeAttribute("ref_md5", ((FunctionalBlock*)refBlock)->getReferenceHashMd5());
546     writer.writeAttribute("name",refBlock->getName());
547     QString attrPos = QString::number(pos().x()).append(",").append(QString::number(pos().y()));
548     writer.writeAttribute("position",attrPos);
549     QString attrDim = QString::number(getWidth()).append(",").append(QString::number(getHeight()));
550     writer.writeAttribute("dimension",attrDim);
551
552     writer.writeStartElement("bif_parameters");
553     foreach(BlockParameter *param,refBlock->getParameters()){
554       writer.writeStartElement("bif_parameter");
555
556       writer.writeAttribute("name",param->getName());
557       writer.writeAttribute("value",param->getValue().toString());
558       /*
559       writer.writeAttribute("context",param->getStrContext());
560       writer.writeAttribute("type",param->getTypeString());
561       */
562       writer.writeEndElement();   //</bif_parameter>
563     }
564     writer.writeEndElement();   //</bif_parameters>
565
566     writer.writeStartElement("bif_ifaces");
567     writer.writeAttribute("count",QString::number(interfaces.length()));
568     foreach(InterfaceItem* inter, interfaces){
569       writer.writeStartElement("bif_iface");
570
571       writer.writeAttribute("id",QString::number(inter->getId()));
572       writer.writeAttribute("name",inter->getName());
573       writer.writeAttribute("ref_name",inter->refInter->getName());
574       writer.writeAttribute("orientation",inter->getStrOrientation());
575       writer.writeAttribute("position",QString::number(inter->getPositionRatio()));
576
577       writer.writeEndElement();   //</bif_iface>
578     }
579     writer.writeEndElement();   //</bif_ifaces>
580
581     writer.writeEndElement();   //</bi_functional>
582   }
583   else {
584     writer.writeStartElement("bi_group");
585
586     writer.writeAttribute("id",QString::number(id));
587     writer.writeAttribute("inside_group",QString::number(childGroupItem->getId()));
588     QString attrPos = QString::number(pos().x()).append(",").append(QString::number(pos().y()));
589     writer.writeAttribute("position",attrPos);
590     QString attrDim = QString::number(getWidth()).append(",").append(QString::number(getHeight()));
591     writer.writeAttribute("dimension",attrDim);
592
593     writer.writeStartElement("big_ifaces");
594     writer.writeAttribute("count",QString::number(interfaces.length()));
595     foreach(InterfaceItem* inter, interfaces){
596       writer.writeStartElement("big_iface");
597
598       writer.writeAttribute("id",QString::number(inter->getId()));
599       writer.writeAttribute("ref_name",inter->refInter->getName());
600       writer.writeAttribute("orientation",inter->getStrOrientation());
601       writer.writeAttribute("position",QString::number(inter->getPositionRatio()));
602
603       writer.writeEndElement(); //</big_iface>
604     }
605
606     writer.writeEndElement(); //</big_ifaces>
607     writer.writeEndElement(); //</bi_group>
608   }
609 }
610
611 QDataStream &operator <<(QDataStream &out, BoxItem &b) {
612   out.setVersion(QDataStream::Qt_4_8);
613
614   QByteArray blockData;
615   QDataStream toWrite(&blockData, QIODevice::WriteOnly);
616
617   QString refXml = ((FunctionalBlock*)b.refBlock)->getReferenceXmlFile();
618   QByteArray xmlFile = QByteArray(refXml.toStdString().c_str());
619   toWrite << xmlFile;
620
621   toWrite << b.id;
622   toWrite << (int)b.x();
623   toWrite << (int)b.y();
624   toWrite << b.boxWidth;
625   toWrite << b.boxHeight;
626   toWrite << b.getInterfaces().length();
627
628   for(int i=0; i<b.getInterfaces().length(); i++){
629     InterfaceItem *inter = b.getInterfaces().at(i);
630     toWrite << inter->getId();
631     toWrite << inter->getName();
632     toWrite << inter->getPositionRatio();
633     toWrite << inter->getOrientation();
634   }
635
636   out << blockData;
637
638   return out;
639 }
640
641 QDataStream &operator >>(QDataStream &in, BoxItem &b)
642 {
643
644   in.setVersion(QDataStream::Qt_4_8);
645
646   int x,y,nbInter;
647
648   in >> b.id;
649   in >> x;
650   in >> y;
651
652   b.setX(x);
653   b.setY(y);
654
655   in >> b.boxWidth;
656   in >> b.boxHeight;
657   in >> nbInter;
658
659   cout << "nbInter:" << nbInter << endl;
660   for(int i=0; i<nbInter; i++){
661
662     int id, orientation;
663     double positionRatio;
664     QString name;
665
666     InterfaceItem *inter = b.getInterfaces().at(i);
667     in >> id;
668     in >> name;
669     in >> positionRatio;
670     in >> orientation;
671
672     inter->setId(id);
673     inter->setName(name);
674     inter->setPositionRatio(positionRatio);
675     inter->setOrientation(orientation);
676     inter->updatePosition();
677
678   }
679
680   return in;
681 }