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

Private GIT Repository
e8c9e842ecb9454925fef709f5d6b6d199cfffd7
[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 "ConnectionItem.h"
9 #include "InterfaceItem.h"
10 #include "AbstractBlock.h"
11
12 GroupScene::GroupScene(GroupScene *_parentScene, GroupWidget *_window, Dispatcher* _dispatcher, Parameters* _params, bool _topScene, QObject *parent) : QGraphicsScene(parent) {
13   dispatcher = _dispatcher;
14   params = _params;
15   parentScene = _parentScene;
16   if (parentScene != NULL) {
17     parentScene->addChildScene(this);
18   }
19   window = _window;
20   groupItem = NULL;
21   id = -1;
22   topScene = _topScene;
23   editMode = InitState;
24
25   selectedInterfaces[0] = NULL;
26   selectedInterfaces[1] = NULL;
27 }
28
29 GroupScene::~GroupScene() {
30   blockItems.clear();
31   connectionItems.clear();
32   groupItem = NULL;
33 }
34
35 void GroupScene::setSelectedInterface(int id, InterfaceItem* iface) {
36   if ((id < 1)|| (id > 2)) return;
37   selectedInterfaces[id-1] = iface;
38 }
39
40 InterfaceItem* GroupScene::getSelectedInterface(int id) {
41   if ((id < 1)|| (id > 2)) return NULL;
42   return selectedInterfaces[id-1];
43 }
44
45 QList<BoxItem *> GroupScene::getSelectedBlocks() {
46   QList<BoxItem*> lst;
47   foreach(BoxItem *item, blockItems){
48     if (item->isSelected()){
49       lst.append(item);
50     }
51   }
52   return lst;
53 }
54
55 int GroupScene::setItemsId(int countInit) {
56   int counter = countInit;
57   groupItem->setId(counter++);
58   foreach(BoxItem *item, blockItems){
59     item->setId(counter++);
60   }
61   return counter;
62 }
63
64 int GroupScene::setInterfacesId(int countInit) {
65   int counter = countInit;
66   foreach(InterfaceItem* inter, groupItem->getInterfaces()){
67     inter->setId(counter++);
68   }
69   foreach(BoxItem *item, blockItems){
70     foreach(InterfaceItem* inter, item->getInterfaces()){
71       inter->setId(counter++);
72     }
73   }
74   return counter;
75 }
76
77 QList<AbstractBoxItem*> GroupScene::getGroupAndBlocks() {
78
79   QList<AbstractBoxItem*> lst;
80   lst.append(groupItem);
81   foreach(BoxItem *item, blockItems){
82     lst.append(item);
83   }
84   return lst;
85 }
86
87 BoxItem *GroupScene::createBlockItem(AbstractBlock *block) {
88
89   BoxItem* item = new BoxItem(block,dispatcher,params,groupItem);
90   item->setZValue(1);
91   // add item from the QList
92   blockItems.append(item);
93   // repainting the group
94   groupItem->updateShape();
95   // center the new block
96   QPointF newPos((groupItem->getWidth()-item->getTotalWidth())/2.0, (groupItem->getHeight()-item->getTotalHeight())/2.0);
97   newPos = newPos-item->getOriginPoint();
98   item->moveTo(newPos);
99
100   return item;
101 }
102
103 void GroupScene::addBlockItem(BoxItem* item) {  
104   // add item from the QList
105   blockItems.append(item);
106   // repainting the group
107   groupItem->updateShape();  
108 }
109
110 void GroupScene::removeBlockItem(BoxItem* item) {
111   // remove item from the viewport
112   removeItem(item);
113   // remove item from the QList
114   blockItems.removeAll(item);
115   // repainting the group
116   groupItem->updateShape();
117 }
118
119 void GroupScene::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
120   ConnectionItem* conn = new ConnectionItem(iface1,iface2, dispatcher, params, groupItem);
121   addConnectionItem(conn);
122 }
123
124 ConnectionItem* GroupScene::searchConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
125   foreach(ConnectionItem* conn , connectionItems) {
126     if ( ((conn->getFromInterfaceItem() == iface1) && (conn->getToInterfaceItem() == iface2)) ||
127          ((conn->getFromInterfaceItem() == iface2) && (conn->getToInterfaceItem() == iface1))) {
128       return conn;
129     }
130   }
131 }
132
133 void GroupScene::addConnectionItem(ConnectionItem* item) {
134   // add item from the viewport
135   //addItem(item);
136   // add item from the QList
137   connectionItems.append(item);
138 }
139
140 void GroupScene::removeConnectionItem(ConnectionItem* item) {
141   // remove item from the viewport
142   removeItem(item);
143   // remove item from the QList
144   connectionItems.removeAll(item);
145 }
146
147 void GroupScene::setGroupItem(GroupItem *group) {
148   if ((groupItem == NULL) && (group != NULL)) {
149     groupItem = group;
150     addItem(group);
151   }
152 }
153
154 void GroupScene::removeGroupItem() {
155   // remove item from the viewport
156   removeItem(groupItem);
157   groupItem = NULL;
158 }
159
160 QList<ConnectionItem *> GroupScene::getInterfaceConnections(InterfaceItem *item) {
161   QList<ConnectionItem*> list;
162   foreach(ConnectionItem *conn, connectionItems){
163     if(conn->getFromInterfaceItem() == item || conn->getToInterfaceItem() == item){
164       list.append(conn);
165     }
166   }
167   return list;
168 }
169
170 void GroupScene::unselecteInterfaces() {
171
172   if (selectedInterfaces[0] != NULL) {
173     selectedInterfaces[0]->selected = false;
174     selectedInterfaces[0] == NULL;
175   }
176   if (selectedInterfaces[1] != NULL) {
177     selectedInterfaces[1]->selected = false;
178     selectedInterfaces[1] == NULL;
179   }
180 }
181
182 void GroupScene::updateConnectionItemsShape() {
183
184   foreach(ConnectionItem* conn, connectionItems){
185     conn->setPath();
186   }
187 }
188
189 void GroupScene::save(QXmlStreamWriter &writer) {
190   writer.writeStartElement("scene");
191   writer.writeAttribute("id",QString::number(id));
192   if (parentScene == NULL) {
193     writer.writeAttribute("upper_scene",QString::number(-1));
194   }
195   else {
196     writer.writeAttribute("upper_scene",QString::number(parentScene->getId()));
197   }
198   groupItem->save(writer);
199
200   writer.writeStartElement("block_items");
201
202   QList<BoxItem *> functionalBlocks;
203   QList<BoxItem *> groupBlocks;
204
205   foreach(BoxItem *item, blockItems){
206     if(item->getRefBlock()->isFunctionalBlock()){
207       functionalBlocks.append(item);
208     } else if(item->getRefBlock()->isGroupBlock()){
209       groupBlocks.append(item);
210     }
211   }
212   writer.writeAttribute("functional_count",QString::number(functionalBlocks.length()));
213   writer.writeAttribute("group_count",QString::number(groupBlocks.length()));
214
215   foreach(BoxItem* item, functionalBlocks) {
216     item->save(writer);
217   }
218   foreach(BoxItem* item, groupBlocks) {
219     item->save(writer);
220   }
221   writer.writeEndElement(); // block_items
222   writer.writeEndElement(); // scene
223 }
224