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

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