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

Private GIT Repository
adding show/hide wb ifaces
[blast.git] / AbstractBoxItem.cpp
1 #include "AbstractBoxItem.h"
2
3 #include "Parameters.h"
4
5 #include "Dispatcher.h"
6 #include "InterfaceItem.h"
7 #include "ConnectionItem.h"
8
9 #include "AbstractBlock.h"
10 #include "GroupScene.h"
11 #include "GroupItem.h"
12 #include "AbstractInterface.h"
13 #include "ConnectedInterface.h"
14
15
16 AbstractBoxItem::  AbstractBoxItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem *parent) : QGraphicsItem(parent) {
17   dispatcher = _dispatcher;
18   params = _params;
19   refBlock = _refBlock;  
20   QFontMetrics fmId(params->defaultBlockFont);
21   nameWidth = fmId.width(refBlock->getName());
22   nameHeight = fmId.height();
23   nameMargin = 10;
24   ifaceMargin = 10;
25
26   // the six following values will be override in subclass constructors
27   minimumBoxWidth = 0;
28   minimumBoxHeight = 0;
29   boxWidth = 0;
30   boxHeight = 0;
31   totalWidth = 0;
32   totalHeight = 0;
33
34   originPoint = QPointF(0.0,0.0);
35
36   selected = false;
37   currentInterface = NULL;
38   rstClkVisible = false;
39   wishboneVisible = false;
40
41   setAcceptHoverEvents(true);
42
43   // NOTE : initInterfaces() is only called in subclasses
44 }
45
46 AbstractBoxItem::AbstractBoxItem(Dispatcher *_dispatcher, Parameters *_params, QGraphicsItem* parent) : QGraphicsItem(parent) {
47   dispatcher = _dispatcher;
48   params = _params;
49   refBlock = NULL;
50   nameWidth = 0;
51   nameHeight = 0;
52   nameMargin = 10;
53   ifaceMargin = 10;
54
55   // the six following values will be override in subclass constructors
56   minimumBoxWidth = 0;
57   minimumBoxHeight = 0;
58   boxWidth = 0;
59   boxHeight = 0;
60   totalWidth = 0;
61   totalHeight = 0;
62
63   originPoint = QPointF(0.0,0.0);
64
65   selected = false;
66   currentInterface = NULL;
67   rstClkVisible = false;
68   wishboneVisible = false;
69   
70   setAcceptHoverEvents(true);
71
72   // NOTE : initInterfaces() is only called in subclasses
73 }
74
75 AbstractBoxItem::~AbstractBoxItem() {
76   foreach(InterfaceItem* inter, interfaces) {
77     delete inter;
78   }
79   interfaces.clear();
80 }
81
82 bool AbstractBoxItem::isBoxItem() {
83   return false;
84 }
85
86 bool AbstractBoxItem::isGroupItem() {
87   return false;
88 }
89 void AbstractBoxItem::setRstClkVisible(bool b) { 
90   rstClkVisible = b;
91   foreach(InterfaceItem* ifaceItem, interfaces) {
92     if ((ifaceItem->refInter->getPurpose() == AbstractInterface::Clock) ||
93         (ifaceItem->refInter->getPurpose() == AbstractInterface::Reset) ) {
94       ifaceItem->visible = b;
95     }
96   }
97   resetInterfacesPosition();
98   updateGeometry(InterfaceMove);
99   update();
100   getScene()->updateConnectionItemsShape();
101   (getScene()->getGroupItem())->updateShape();
102   
103 }
104
105 void AbstractBoxItem::setWishboneVisible(bool b) { 
106   wishboneVisible = b;
107   foreach(InterfaceItem* ifaceItem, interfaces) {
108     if (ifaceItem->refInter->getPurpose() == AbstractInterface::Wishbone) {
109       ifaceItem->visible = b;
110     }
111   }
112   resetInterfacesPosition();
113   updateGeometry(InterfaceMove);
114   update();
115   getScene()->updateConnectionItemsShape();
116   (getScene()->getGroupItem())->updateShape();
117 }
118
119 void AbstractBoxItem::setRefBlock(AbstractBlock* _refBlock) {
120   refBlock = _refBlock;
121   QFontMetrics fmId(params->defaultBlockFont);
122   nameWidth = fmId.width(refBlock->getName());
123   nameHeight = fmId.height();
124 }
125
126 void AbstractBoxItem::initInterfaces() {
127   /* TO DO : creating all needed InterfaceItem, with by default, input at west and output at east */
128   int orientation = Parameters::West;
129
130   foreach(AbstractInterface *inter, refBlock->getInterfaces()){
131     
132     InterfaceItem *item;
133     if(inter->getDirection() == AbstractInterface::Input){
134       orientation = Parameters::West;
135     } else if(inter->getDirection() == AbstractInterface::Output){
136       orientation = Parameters::East;
137     } else if(inter->getDirection() == AbstractInterface::InOut){
138       orientation = Parameters::North;
139     }
140     item = new InterfaceItem(0.0 , orientation, (ConnectedInterface *)inter, this, params);
141     interfaces.append(item);    
142   }  
143 }
144
145 InterfaceItem* AbstractBoxItem::searchInterfaceByName(QString name) {
146   foreach(InterfaceItem *inter, interfaces){
147     if(inter->getName() == name)
148       return inter;
149   }
150   return NULL;
151 }
152
153 InterfaceItem* AbstractBoxItem::searchInterfaceByRef(ConnectedInterface *ref) {
154   foreach(InterfaceItem *inter, interfaces){
155     if(inter->refInter == ref) {
156       return inter;
157     }
158   }
159   return NULL;
160 }
161
162 void AbstractBoxItem::addInterface(InterfaceItem *i, bool resetPosition) {
163   interfaces.append(i);
164   if (resetPosition) resetInterfacesPosition();
165   updateGeometry(InterfaceMove);
166   update();
167 }
168
169 void AbstractBoxItem::removeInterface(InterfaceItem *i) {
170   // NB : removing from model is done in dispatcher
171   interfaces.removeOne(i);
172   delete i;
173
174   //resetInterfacesPosition();
175   updateGeometry(InterfaceMove);
176   update();
177 }
178
179
180 void AbstractBoxItem::resetInterfacesPosition() {
181
182   int nbNorth=0, nbSouth=0, nbEast=0, nbWest=0;
183   double cntNorth=1.0,cntSouth=1.0,cntEast=1.0,cntWest=1.0;
184   double positionRatio = 1.0;
185
186
187   foreach(InterfaceItem* inter, interfaces) {
188     // only data interfaces and if needed time and reset
189     if(inter->visible) {
190       if(inter->getOrientation() == Parameters::North){
191         nbNorth++;
192       } else if(inter->getOrientation() == Parameters::South){
193         nbSouth++;
194       } else if(inter->getOrientation() == Parameters::East){
195         nbEast++;
196       } else if(inter->getOrientation() == Parameters::West){
197         nbWest++;
198       }
199     }
200   }
201
202   foreach(InterfaceItem* inter, interfaces) {
203
204     if(inter->visible){
205
206       if(inter->getOrientation() == Parameters::North){
207         positionRatio = cntNorth/(double)(nbNorth+1);
208         cntNorth += 1.0;
209       } else if(inter->getOrientation() == Parameters::South){
210         positionRatio = cntSouth/(double)(nbSouth+1);
211         cntSouth += 1.0;
212       } else if(inter->getOrientation() == Parameters::East){
213         positionRatio = cntEast/(double)(nbEast+1);
214         cntEast += 1.0;
215       } else if(inter->getOrientation() == Parameters::West){
216         positionRatio = cntWest/(double)(nbWest+1);
217         cntWest += 1.0;
218       }
219       inter->setPositionRatio(positionRatio);
220       inter->updatePosition();
221     }
222   }
223 }
224
225 void AbstractBoxItem::moveInterfaceTo(QPointF pos) {
226   double positionRatio;
227   if(currentInterface->getOrientation() == Parameters::North || currentInterface->getOrientation() == Parameters::South){
228     if(pos.x() < 0){
229       positionRatio = 0;
230       if(pos.y() > 0 && pos.y() < boxHeight){
231         currentInterface->setOrientation(Parameters::West);
232       }
233     } else if(pos.x() > boxWidth){
234       positionRatio = 1;
235       if(pos.y() > 0 && pos.y() < boxHeight){
236         currentInterface->setOrientation(Parameters::East);
237       }
238     } else {
239       positionRatio = ((double) pos.x())/boxWidth;
240     }
241   } else {
242
243     if(pos.y() < 0){
244       positionRatio = 0;
245       if(pos.x() > 0 && pos.x() < boxWidth){
246         currentInterface->setOrientation(Parameters::North);
247       }
248     } else if(pos.y() > boxHeight){
249       positionRatio = 1;
250       if(pos.x() > 0 && pos.x() < boxWidth){
251         currentInterface->setOrientation(Parameters::South);
252       }
253     } else {
254       positionRatio = ((double) pos.y())/boxHeight;
255     }
256   }
257   currentInterface->setPositionRatio(positionRatio);
258   currentInterface->updatePosition();
259 }
260
261 QRectF AbstractBoxItem::boundingRect() const {
262   // returns a QRectF that contains the block (i.e the main rectangle, interfaces, title, ...)
263   QPointF p = originPoint - QPointF(nameHeight,nameHeight);
264   QSizeF s(totalWidth+2*nameHeight,totalHeight+2*nameHeight);
265   return QRectF(p,s);
266 }
267
268
269 /* isInterface() : return true if there are some interfaces
270    with the given orientation (N,S,E,O)
271 */
272 bool AbstractBoxItem::isInterfaces(int orientation) const {
273   foreach(InterfaceItem* inter, interfaces) {
274     if (inter->getOrientation() == orientation) return true;
275   }
276   return false;
277 }
278
279 int AbstractBoxItem::nbInterfacesByOrientation(int orientation) {
280   int nb = 0;
281   foreach(InterfaceItem* inter, interfaces) {
282     if ((inter->visible) && (inter->getOrientation() == orientation)) nb++;
283   }
284   return nb;
285 }
286
287 void AbstractBoxItem::updateInterfacesAndConnections() {
288
289   // update all interfaces positions
290   foreach(InterfaceItem *item, interfaces){
291     item->updatePosition();
292   }
293   // NB: dunno the utility of this test !!
294   if (getScene() != NULL) {
295     // update all connections from/to this block
296     foreach(ConnectionItem *item, getScene()->getConnectionItems()){
297       if ((item->getFromInterfaceItem()->getOwner() == this) || (item->getToInterfaceItem()->getOwner() == this)) {
298         item->setPath();
299       }
300     }
301   }
302 }
303
304 void AbstractBoxItem::setDimension(int x, int y) {
305   boxWidth = x;
306   boxHeight = y;
307 }
308
309 InterfaceItem* AbstractBoxItem::getInterfaceFromCursor(qreal x, qreal y) {
310
311   foreach(InterfaceItem* inter, interfaces) {
312     if(x > inter->boundingRect().x() && x < (inter->boundingRect().x() + inter->boundingRect().width())){
313       if(y > inter->boundingRect().y() && y < (inter->boundingRect().y() + inter->boundingRect().height())){
314         return inter;
315       }
316     }
317   }
318   /* TO DO : check each interfaces if it contains x,y. If yes, return that interface */
319   return NULL;
320 }