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

Private GIT Repository
finished conn mode of library
[blast.git] / BlockLibraryWidget.cpp
1 #include "BlockLibraryWidget.h"
2 #include "BlockLibraryTree.h"
3
4 BlockLibraryWidget::BlockLibraryWidget(Dispatcher* _dispatcher,
5                                        Parameters* _params,
6                                        QWidget *parent) : QWidget(parent) {
7
8
9   dispatcher = _dispatcher;
10   params = _params;
11
12   nbClock = 0;
13   comboClkGen = NULL;
14   nbRst = 0;
15   comboRstGen = NULL;
16   currentRefBlock = NULL;
17
18   // creating the widget : tree, buttons, ...
19   QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom, this);
20   tree = new QTreeWidget(this);
21
22   buttonAdd = new QPushButton("add to", this);
23   buttonAdd->setEnabled(false);
24   comboScenes = new QComboBox();
25
26   QHBoxLayout* layAdd = new QHBoxLayout;
27   layAdd->addWidget(buttonAdd);
28   layAdd->addWidget(comboScenes);
29
30   boxClkRst = new QGroupBox("Clock/reset connection");
31
32
33   QString msg = "Connect to main clock/rst ext_clk/reset_0 (";
34   msg += QString::number(params->clocks.at(0));
35   msg += ")";
36   radAutoClk = new QRadioButton(msg);
37   radChooseClk = new QRadioButton("Choose among available clk/rst");
38   if (params->autoConnMainClk) {
39     radAutoClk->setChecked(true);
40   }
41   else {
42     radChooseClk->setChecked(true);
43   }
44
45   layClkRst = new QGridLayout;
46
47   QVBoxLayout* layConn = new QVBoxLayout;
48   layConn->addWidget(radAutoClk,0,0);
49   layConn->addWidget(radChooseClk,1,0);
50   stack = new QStackedWidget();
51   QLabel* labDummy = new QLabel("");
52   stack->addWidget(labDummy);
53   QWidget* w = new QWidget();
54   w->setLayout(layClkRst);
55   stack->addWidget(w);
56   layConn->addWidget(stack);
57
58   boxClkRst->setLayout(layConn);
59
60   QVBoxLayout* layBottom = new QVBoxLayout;
61   layBottom->addLayout(layAdd);
62   layBottom->addWidget(boxClkRst);
63
64   connect(tree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(clicked()));
65   connect(tree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(doubleClicked()));
66   connect(buttonAdd, SIGNAL(clicked()), this, SLOT(addClicked()));  
67   connect(radChooseClk, SIGNAL(toggled(bool)), this, SLOT(enableAvailableClocks(bool)));
68
69   BlockCategory* cat = params->categoryTree->searchCategory(0);
70
71   QTreeWidgetItem* item = tree->invisibleRootItem();
72   tree->setHeaderLabel("Blocks list");
73
74   addChild(cat,item);
75
76   layout->addWidget(tree);
77   layout->addLayout(layBottom);
78   this->setLayout(layout);
79
80   //this->setFixedSize(300,230);
81 }
82
83
84 BlockLibraryWidget::~BlockLibraryWidget() {
85 }
86
87 void BlockLibraryWidget::addChild(BlockCategory *catParent,QTreeWidgetItem* itemParent) {
88
89   QTreeWidgetItem* newItemCat = NULL;
90   QTreeWidgetItem* newItemBlock = NULL;
91
92   QList<BlockCategory *> childs = catParent->getAllChilds();
93   foreach(BlockCategory* cat, childs){
94
95     if (cat->getId()<100) {
96       newItemCat = new QTreeWidgetItem(itemParent);
97       newItemCat->setData(0,Qt::DisplayRole, cat->getName());
98       QList<ReferenceBlock*> list = cat->getBlocks();
99       for(int i=0; i<list.length(); i++){
100         newItemBlock = new QTreeWidgetItem(newItemCat);
101         newItemBlock->setData(0,Qt::DisplayRole, list.at(i)->getName());
102         newItemBlock->setData(1,Qt::DisplayRole, cat->getId());
103         newItemBlock->setData(2,Qt::DisplayRole, i);
104         newItemBlock->setIcon(0,QIcon("icons/window_new.png"));
105       }
106       addChild(cat,newItemCat);
107     }
108   }
109   /* TO DO :
110      - getting the childs of catParent
111      - for each BlockCategory cat of that list :
112         - create an new TreeWidgetItem (newImteCat), with itemParent as a parent
113         - set the first column of that item with the categry name
114         - get the list of the blocks that are associated with cat
115         - for i = 0 to that list size.
116            - create a new TreeWidgetItem (newItemBlock), with newItemCat as a parent
117            - set the first column of that item with the block name
118            - set the second column of that item with the newItemCat id
119            - set the third column of that item with the value of i
120         - endfor
121         - call again addChild with cat and newImteCat as parameters
122       - end for
123   */
124 }
125
126
127 void BlockLibraryWidget::addClicked() {
128
129   QTreeWidgetItem *item = tree->selectedItems().at(0);
130   if(item->data(1,Qt::DisplayRole).isValid() && item->data(2,Qt::DisplayRole).isValid()){
131     int idCat = item->data(1,Qt::DisplayRole).toInt();
132     int idBlock = item->data(2,Qt::DisplayRole).toInt();
133     QVariant v = comboScenes->currentData();    
134
135     cout << "adding block to scene " << v.toInt() << endl;
136
137     QHash<QString, int> clkRstToGen;
138     for(int i=0;i<layClkRst->rowCount();i++) {
139       QLayoutItem* item = layClkRst->itemAtPosition(i,0);
140       QLabel* lab = (QLabel *)(item->widget());
141       item = layClkRst->itemAtPosition(i,1);
142       QComboBox* combo = (QComboBox *)(item->widget());
143       clkRstToGen.insert(lab->text(),combo->currentIndex());
144     }
145
146
147     dispatcher->addBlock(Dispatcher::Design, idCat, idBlock, v.toInt(), clkRstToGen);
148   }
149
150   // only take the first selected
151   // retrieve id of category and id of block
152   // calling dispatcher addBlock() method.
153 }
154
155 void BlockLibraryWidget::clicked() {
156   if(tree->selectedItems().length() > 0) {
157
158     QTreeWidgetItem *item = tree->selectedItems().at(0);
159
160     if(item->data(1,Qt::DisplayRole).isValid()) {
161
162
163       buttonAdd->setEnabled(true);
164       int idCat = item->data(1,Qt::DisplayRole).toInt();
165       int idBlock = item->data(2,Qt::DisplayRole).toInt();
166       currentRefBlock = params->getReferenceBlock(idCat,idBlock);
167       QList<AbstractInterface*> lstClocks = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Clock);
168       //if there are more than one input clock, force to choose
169       if ((lstClocks.size()>1) || (! params->autoConnMainClk)) {
170         radChooseClk->setChecked(true);
171         //enableAvailableClocks(true);
172       }
173       else {
174         radAutoClk->setChecked(true);
175       }
176       updateClkRst(idCat, idBlock);
177     }
178     else {
179       buttonAdd->setEnabled(false);
180       updateClkRst(-1,-1);
181     }
182   }
183 }
184
185 void BlockLibraryWidget::doubleClicked() {
186   clicked();
187   addClicked();
188 }
189
190 void BlockLibraryWidget::updateBoxConn() {
191   if (params->autoConnMainClk) {
192     radAutoClk->setChecked(true);
193     //enableAvailableClocks(false);
194   }
195   else {
196     radChooseClk->setChecked(true);
197     //enableAvailableClocks(true);
198   }
199   QString msg = "Auto-connect to main clk/rst (ext_clk_0 at ";
200   msg += QString::number(params->clocks.at(0));
201   msg += " MHz)";
202   radAutoClk->setText(msg);
203 }
204
205 void BlockLibraryWidget::updateComboScene() {
206   comboScenes->clear();
207   QMap<int,QString> list = dispatcher->getAllGroupNames();
208   QMapIterator<int,QString> iter(list);
209   while (iter.hasNext()) {
210     iter.next();
211     comboScenes->addItem(iter.value(),QVariant(iter.key()));
212   }
213 }
214
215 void BlockLibraryWidget::updateClkRst(int idCat, int idBlock) {
216
217   while (layClkRst->count() > 0) {
218     QWidget* widget = layClkRst->itemAt(0)->widget();
219     layClkRst->removeWidget(widget);
220     delete widget;
221   }
222
223   if (nbClock != 0) {
224     delete [] comboClkGen;
225     nbClock = 0;
226   }
227   if (nbRst != 0) {
228     delete [] comboRstGen;
229     nbRst = 0;
230   }
231
232   if ((idCat == -1) || (idBlock == -1)) return;
233
234   QList<AbstractInterface*> lstClocks = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Clock);
235   nbClock = lstClocks.size();
236   QList<AbstractInterface*> lstRst = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Reset);
237   nbRst = lstRst.size();
238
239   comboClkGen = new QComboBox*[lstClocks.size()];
240   for(int i=0;i<lstClocks.size();i++) {
241     comboClkGen[i] = new QComboBox();
242     QString name = "";
243     int id = 0;
244     foreach(double d, params->clocks) {
245       name = "ext_clk_"+QString::number(id)+" (";
246       name += QString::number(d) + " MHz)";
247       comboClkGen[i]->addItem(name);
248       id++;
249     }
250   }
251
252   comboRstGen = new QComboBox*[lstRst.size()];
253   for(int i=0;i<lstRst.size();i++) {
254     comboRstGen[i] = new QComboBox();
255     QString name = "";
256     for(int j=0;j<params->clocks.size();j++) {
257       name = "ext_rst_"+QString::number(j);
258       comboRstGen[i]->addItem(name);
259     }
260   }
261   layClkRst->addWidget(new QLabel("Clock/Reset name"), 0, 0);
262   layClkRst->addWidget(new QLabel("connect to"), 0, 1);
263   int row = 1;
264   foreach(AbstractInterface* iface, lstClocks) {
265     layClkRst->addWidget(new QLabel(iface->getName()), row,0);
266     layClkRst->addWidget(comboClkGen[row-1],row, 1);
267     row++;
268   }
269
270   foreach(AbstractInterface* iface, lstRst) {
271     layClkRst->addWidget(new QLabel(iface->getName()), row,0);
272     layClkRst->addWidget(comboRstGen[row-1-nbClock],row, 1);
273     row++;
274   }
275 }
276
277 void BlockLibraryWidget::enableAvailableClocks(bool state) {
278
279   if (state == false) {
280     stack->setCurrentIndex(0);
281   }
282   else {
283     stack->setCurrentIndex(1);
284   }
285 }
286