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

Private GIT Repository
added source items
[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 void GroupScene::setSelectedInterface(int id, InterfaceItem* iface) {
42   if ((id < 1)|| (id > 2)) return;
43   selectedInterfaces[id-1] = iface;
44 }
45
46 InterfaceItem* GroupScene::getSelectedInterface(int id) {
47   if ((id < 1)|| (id > 2)) return NULL;
48   return selectedInterfaces[id-1];
49 }
50
51 QList<BoxItem *> GroupScene::getSelectedBlocks() {
52   QList<BoxItem*> lst;
53   foreach(BoxItem *item, boxItems){
54     if (item->isSelected()){
55       lst.append(item);
56     }
57   }
58   return lst;
59 }
60
61 int GroupScene::setItemsId(int countInit) {
62   int counter = countInit;
63   groupItem->setId(counter++);
64   foreach(BoxItem *item, boxItems){
65     item->setId(counter++);
66   }
67   return counter;
68 }
69
70 int GroupScene::setInterfacesId(int countInit) {
71   int counter = countInit;
72   foreach(InterfaceItem* inter, groupItem->getInterfaces()){
73     inter->setId(counter++);
74   }
75   foreach(BoxItem *item, boxItems){
76     foreach(InterfaceItem* inter, item->getInterfaces()){
77       inter->setId(counter++);
78     }
79   }
80   return counter;
81 }
82
83 BoxItem *GroupScene::createBoxItem(AbstractBlock *block) {
84
85   BoxItem* item = new BoxItem(block,dispatcher,params,groupItem);
86   item->setZValue(1);
87   // add item from the QList
88   boxItems.append(item);
89   // repainting the group
90   groupItem->updateShape();
91   // center the new block
92   QPointF newPos((groupItem->getWidth()-item->getTotalWidth())/2.0, (groupItem->getHeight()-item->getTotalHeight())/2.0);
93   newPos = newPos-item->getOriginPoint();
94   item->moveTo(newPos);
95
96   return item;
97 }
98
99 void GroupScene::addBoxItem(BoxItem* item) {  
100   // add item from the QList
101   boxItems.append(item);
102   // repainting the group
103   groupItem->updateShape();  
104 }
105
106 void GroupScene::removeBoxItem(BoxItem* item) {
107   // remove item from the viewport
108   removeItem(item);
109   // remove item from the QList
110   boxItems.removeAll(item);
111   // repainting the group
112   groupItem->updateShape();
113 }
114
115 SourceItem *GroupScene::createSourceItem(AbstractBlock *block) {
116
117   SourceItem* item = new SourceItem(block,dispatcher,params);
118   // adding item to the scene
119   addItem(item);
120   item->setZValue(1);
121   // add item from the QList
122   sourceItems.append(item);    
123   // center the new block
124   QPointF groupPos = groupItem->pos();
125   QPointF newPos(groupPos.x()-item->getTotalWidth()-50, groupPos.y());  
126   newPos = newPos-item->getOriginPoint();
127   item->moveTo(newPos);
128   return item;
129 }
130
131 void GroupScene::addSourceItem(SourceItem* item) {  
132   // add item from the QList
133   sourceItems.append(item);  
134 }
135
136 void GroupScene::removeSourceItem(SourceItem* item) {
137   // remove item from the viewport
138   removeItem(item);
139   // remove item from the QList
140   sourceItems.removeAll(item);  
141 }
142
143 void GroupScene::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2, bool withinGroup) {
144   ConnectionItem* conn = NULL;
145   if (withinGroup) {
146     conn = new ConnectionItem(iface1,iface2, dispatcher, params, groupItem);
147   }
148   else {
149     conn = new ConnectionItem(iface1,iface2, dispatcher, params, NULL);
150     addItem(conn);
151   }
152   addConnectionItem(conn);
153 }
154
155 ConnectionItem* GroupScene::searchConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
156   foreach(ConnectionItem* conn , connectionItems) {
157     if ( ((conn->getFromInterfaceItem() == iface1) && (conn->getToInterfaceItem() == iface2)) ||
158          ((conn->getFromInterfaceItem() == iface2) && (conn->getToInterfaceItem() == iface1))) {
159       return conn;
160     }
161   }
162   return NULL;
163 }
164
165 void GroupScene::addConnectionItem(ConnectionItem* item) {
166   // add item from the viewport
167   //addItem(item);
168   // add item from the QList
169   connectionItems.append(item);
170 }
171
172 void GroupScene::removeConnectionItem(ConnectionItem* item) {
173   // remove item from the viewport
174   removeItem(item);
175   // remove item from the QList
176   connectionItems.removeAll(item);
177 }
178
179 void GroupScene::setGroupItem(GroupItem *group) {
180   if ((groupItem == NULL) && (group != NULL)) {
181     groupItem = group;
182     addItem(group);
183   }
184 }
185
186 void GroupScene::removeGroupItem() {
187   // remove item from the viewport
188   removeItem(groupItem);
189   groupItem = NULL;
190 }
191
192 void GroupScene::unselecteInterfaces() {
193
194   if (selectedInterfaces[0] != NULL) {
195     selectedInterfaces[0]->selected = false;
196     selectedInterfaces[0] == NULL;
197   }
198   if (selectedInterfaces[1] != NULL) {
199     selectedInterfaces[1]->selected = false;
200     selectedInterfaces[1] == NULL;
201   }
202 }
203
204 void GroupScene::updateConnectionItemsShape() {
205
206   foreach(ConnectionItem* conn, connectionItems){
207     conn->setPath();
208   }
209 }
210
211 void GroupScene::save(QXmlStreamWriter &writer) {
212   writer.writeStartElement("scene");
213   writer.writeAttribute("id",QString::number(id));
214   if (parentScene == NULL) {
215     writer.writeAttribute("upper_scene",QString::number(-1));
216   }
217   else {
218     writer.writeAttribute("upper_scene",QString::number(parentScene->getId()));
219   }
220   groupItem->save(writer);
221
222   if (isTopScene()) {
223     writer.writeStartElement("source_items");
224     writer.writeAttribute("count",QString::number(sourceItems.length()));
225     foreach(SourceItem* item, sourceItems) {
226       item->save(writer);
227     }
228     writer.writeEndElement(); // source_items
229   }
230   writer.writeStartElement("block_items");
231
232   QList<BoxItem *> functionalBlocks;
233   QList<BoxItem *> groupBlocks;
234
235   foreach(BoxItem *item, boxItems){
236     if(item->getRefBlock()->isFunctionalBlock()){
237       functionalBlocks.append(item);
238     } else if(item->getRefBlock()->isGroupBlock()){
239       groupBlocks.append(item);
240     }
241   }
242   writer.writeAttribute("functional_count",QString::number(functionalBlocks.length()));
243   writer.writeAttribute("group_count",QString::number(groupBlocks.length()));
244
245   foreach(BoxItem* item, functionalBlocks) {
246     item->save(writer);
247   }
248   foreach(BoxItem* item, groupBlocks) {
249     item->save(writer);
250   }
251   writer.writeEndElement(); // block_items
252   writer.writeEndElement(); // scene
253 }
254