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

Private GIT Repository
finalized analysis with clkconvert + started testbench gen.
[blast.git] / GroupScene.cpp
1 #include "GroupScene.h"
2
3 #include "Dispatcher.h"
4 #include "Parameters.h"
5 #include "GroupWidget.h"
6 #include "GroupItem.h"
7 #include "BoxItem.h"
8 #include "StimuliItem.h"
9 #include "ConnectionItem.h"
10 #include "InterfaceItem.h"
11 #include "AbstractBlock.h"
12 #include "Graph.h"
13
14 GroupScene::GroupScene(GroupScene *_parentScene, GroupWidget *_window, Dispatcher* _dispatcher, Parameters* _params, bool _topScene, QObject *parent) : QGraphicsScene(parent) {
15   dispatcher = _dispatcher;
16   params = _params;
17   parentScene = _parentScene;
18   if (parentScene != NULL) {
19     parentScene->addChildScene(this);
20   }
21   window = _window;
22   groupItem = NULL;
23   id = -1;
24   topScene = _topScene;
25   editMode = InitState;
26
27   selectedInterfaces[0] = NULL;
28   selectedInterfaces[1] = NULL;
29 }
30
31 GroupScene::~GroupScene() {
32   static QString fctName = "GroupScene::~GroupScene()";
33 #ifdef DEBUG_FCTNAME
34   cout << "call to " << qPrintable(fctName) << endl;
35 #endif
36   
37   boxItems.clear();
38   connectionItems.clear();
39   groupItem = NULL;
40 }
41
42 /*
43 void GroupScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
44
45   //QGraphicsScene::mouseMoveEvent(event);
46   
47   QPointF p = event->scenePos();
48   cout << p.x() << "," << p.y() << endl;
49
50 }
51 */
52
53 void GroupScene::setSelectedInterface(int id, InterfaceItem* iface) {
54   if ((id < 1)|| (id > 2)) return;
55   selectedInterfaces[id-1] = iface;
56 }
57
58 InterfaceItem* GroupScene::getSelectedInterface(int id) {
59   if ((id < 1)|| (id > 2)) return NULL;
60   return selectedInterfaces[id-1];
61 }
62
63 QList<BoxItem *> GroupScene::getSelectedBlocks() {
64   QList<BoxItem*> lst;
65   foreach(BoxItem *item, boxItems){
66     if (item->isSelected()){
67       lst.append(item);
68     }
69   }
70   return lst;
71 }
72
73 int GroupScene::setItemsId(int countInit) {
74   int counter = countInit;
75   groupItem->setId(counter++);
76   if (isTopScene()) {
77     foreach(StimuliItem *item, stimuliItems){
78       item->setId(counter++);
79     } 
80   }
81   foreach(BoxItem *item, boxItems){
82     item->setId(counter++);
83   }
84   return counter;
85 }
86
87 int GroupScene::setInterfacesId(int countInit) {
88   int counter = countInit;
89   foreach(InterfaceItem* inter, groupItem->getInterfaces()){
90     inter->setId(counter++);
91   }
92   if (isTopScene()) {
93     foreach(StimuliItem *item, stimuliItems){
94       foreach(InterfaceItem* inter, item->getInterfaces()){
95         inter->setId(counter++);
96       }
97     } 
98   }
99   foreach(BoxItem *item, boxItems){
100     foreach(InterfaceItem* inter, item->getInterfaces()){
101       inter->setId(counter++);
102     }
103   }
104   return counter;
105 }
106
107 BoxItem *GroupScene::createBoxItem(AbstractBlock *block, BoxItem::Position position, int lock, BoxItem::SpanType span) {
108
109   BoxItem* item = new BoxItem(block,dispatcher,params,groupItem, lock, span, position);
110   item->setZValue(1);
111   // add item from the QList
112   boxItems.append(item);
113   // repainting the group
114   groupItem->updateShape();
115
116 /*
117   // position the new block
118   double x,y;
119   if (hPos == BoxItem::Left) {
120     x = 0;
121   }
122   else if (hPos == BoxItem::Center) {
123     x = (groupItem->getWidth()-item->getTotalWidth())/2.0;
124   }
125   else if (hPos == BoxItem::Right) {
126     x = groupItem->getWidth()-item->getTotalWidth();
127   }
128   if (vPos == BoxItem::Top) {
129     y = 0;
130   }
131   else if (vPos == BoxItem::Center) {
132     y = (groupItem->getHeight()-item->getTotalHeight())/2.0;
133   }
134   else if (vPos == BoxItem::Bottom) {
135     y = groupItem->getHeight()-item->getTotalHeight();
136   }
137   QPointF newPos(x,y);
138   newPos = newPos-item->getOriginPoint();
139   item->moveTo(newPos);
140 */
141   return item;
142 }
143
144 void GroupScene::addBoxItem(BoxItem* item) {  
145   // add item from the QList
146   boxItems.append(item);
147   // repainting the group
148   groupItem->updateShape();  
149 }
150
151 void GroupScene::removeBoxItem(BoxItem* item) {
152   // remove item from the viewport
153   removeItem(item);
154   // remove item from the QList
155   boxItems.removeAll(item);
156   // repainting the group
157   groupItem->updateShape();
158 }
159
160 BoxItem* GroupScene::searchBoxItemByName(QString name) {
161   foreach(BoxItem* item, boxItems) {
162     if (item->getRefBlock()->getName() == name) {
163       return item;
164     }
165   }
166   return NULL;
167 }
168
169 StimuliItem *GroupScene::createStimuliItem(AbstractBlock *block) {
170
171   StimuliItem* item = new StimuliItem(block,dispatcher,params);
172   // adding item to the scene
173   addItem(item);
174   item->setZValue(1);
175   // add item from the QList
176   stimuliItems.append(item);    
177   // center the new block
178   QPointF groupPos = groupItem->pos();
179   QPointF newPos(groupPos.x()-item->getTotalWidth()-100, groupPos.y());
180   newPos = newPos-item->getOriginPoint();
181   item->moveTo(newPos);
182   return item;
183 }
184
185 void GroupScene::addStimuliItem(StimuliItem* item) {  
186   // adding item to the scene
187   addItem(item);
188   item->setZValue(1);  
189   // add item from the QList
190   stimuliItems.append(item);  
191 }
192
193 void GroupScene::removeStimuliItem(StimuliItem* item) {
194   // remove item from the viewport
195   removeItem(item);
196   // remove item from the QList
197   stimuliItems.removeAll(item);  
198 }
199
200 void GroupScene::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2, bool visible) {
201   ConnectionItem* conn = NULL;
202   
203   conn = new ConnectionItem(iface1,iface2, dispatcher, params);
204   conn->setVisible(visible);
205   addItem(conn);  
206   addConnectionItem(conn);
207 }
208
209 ConnectionItem* GroupScene::searchConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
210   foreach(ConnectionItem* conn , connectionItems) {
211     if ( ((conn->getFromInterfaceItem() == iface1) && (conn->getToInterfaceItem() == iface2)) ||
212          ((conn->getFromInterfaceItem() == iface2) && (conn->getToInterfaceItem() == iface1))) {
213       return conn;
214     }
215   }
216   return NULL;
217 }
218
219 void GroupScene::addConnectionItem(ConnectionItem* item) {
220   // add item from the viewport
221   //addItem(item);
222   // add item from the QList
223   connectionItems.append(item);
224 }
225
226 void GroupScene::removeConnectionItem(ConnectionItem* item) {
227   
228   // remove connection from/to InterfaceItem
229   InterfaceItem* fromIfaceItem = item->getFromInterfaceItem();
230   InterfaceItem* toIfaceItem = item->getToInterfaceItem();
231   fromIfaceItem->removeConnectionItem(item);
232   toIfaceItem->removeConnectionItem(item);
233   
234   // remove item from the viewport
235   removeItem(item);
236   // remove item from the QList
237   connectionItems.removeAll(item);
238 }
239
240 void GroupScene::setGroupItem(GroupItem *group) {
241   if ((groupItem == NULL) && (group != NULL)) {
242     groupItem = group;
243     addItem(group);
244   }
245 }
246
247 void GroupScene::removeGroupItem() {
248   // remove item from the viewport
249   removeItem(groupItem);
250   groupItem = NULL;
251 }
252
253 void GroupScene::unselecteInterfaces() {
254
255   if (selectedInterfaces[0] != NULL) {
256     selectedInterfaces[0]->selected = false;
257     selectedInterfaces[0] = NULL;
258   }
259   if (selectedInterfaces[1] != NULL) {
260     selectedInterfaces[1]->selected = false;
261     selectedInterfaces[1] = NULL;
262   }
263 }
264
265 void GroupScene::updateConnectionItemsShape() {
266
267   foreach(ConnectionItem* conn, connectionItems){
268     conn->setPath();
269   }
270 }
271
272 void GroupScene::save(QXmlStreamWriter &writer) {
273   writer.writeStartElement("scene");
274   writer.writeAttribute("id",QString::number(id));
275   if (parentScene == NULL) {
276     writer.writeAttribute("upper_scene",QString::number(-1));
277   }
278   else {
279     writer.writeAttribute("upper_scene",QString::number(parentScene->getId()));
280   }
281   if (isTopScene()) {
282     QString clkList = "";
283     QList<double> lst = params->getGraph()->getClocks();
284     foreach(double d, lst) {
285       clkList += QString::number(d)+",";
286     }
287     clkList.chop(1);
288     writer.writeAttribute("clklist",clkList);
289
290   }
291   groupItem->save(writer);
292
293   if (isTopScene()) {
294     writer.writeStartElement("source_items");
295     writer.writeAttribute("count",QString::number(stimuliItems.length()));
296     foreach(StimuliItem* item, stimuliItems) {
297       item->save(writer);
298     }
299     writer.writeEndElement(); // source_items
300   }
301   writer.writeStartElement("block_items");
302
303   QList<BoxItem *> functionalBlocks;
304   QList<BoxItem *> groupBlocks;
305
306   foreach(BoxItem *item, boxItems){
307     if(item->getRefBlock()->isFunctionalBlock()){
308       functionalBlocks.append(item);
309     } else if(item->getRefBlock()->isGroupBlock()){
310       groupBlocks.append(item);
311     }
312   }
313   writer.writeAttribute("functional_count",QString::number(functionalBlocks.length()));
314   writer.writeAttribute("group_count",QString::number(groupBlocks.length()));
315
316   foreach(BoxItem* item, functionalBlocks) {
317     item->save(writer);
318   }
319   foreach(BoxItem* item, groupBlocks) {
320     item->save(writer);
321   }
322   writer.writeEndElement(); // block_items
323   writer.writeEndElement(); // scene
324 }
325