]> Creatis software - clitk.git/blob - vv/vvLinkPanel.cxx
- improve (?) speed render for contours
[clitk.git] / vv / vvLinkPanel.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ======================================================================-====*/
18
19 #ifndef _vvLinkPanel_CXX
20 #define _vvLinkPanel_CXX
21
22 #include "vvLinkPanel.h"
23 #include "clitkCommon.h"
24
25 #include <QtGui>
26 #include <Qt>
27 #include "QTreePushButton.h"
28
29 //------------------------------------------------------------------------------
30 vvLinkPanel::vvLinkPanel(QWidget * parent):QWidget(parent)
31 {
32   setupUi(this);
33   imageNames.resize(0);
34   image1Ids.resize(0);
35   image2Ids.resize(0);
36
37   linkTableWidget->resizeColumnsToContents();
38   linkTableWidget->verticalHeader()->hide();
39   linkTableWidget->horizontalHeader()->hide();
40   linkTableWidget->hideColumn(4);
41   linkTableWidget->hideColumn(5);
42
43   connect(image1ComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateComboBox2(int)));
44   connect(linkButton,SIGNAL(clicked()),this,SLOT(addLink()));
45   connect(linkAllButton,SIGNAL(clicked()),this,SLOT(linkAll()));
46 }
47 //------------------------------------------------------------------------------
48
49
50 //------------------------------------------------------------------------------
51 void vvLinkPanel::addImage(std::string name, std::string id)
52 {
53   imageNames.push_back(name);
54   image1Ids.push_back(id);
55   UpdateComboBox1();
56 }
57 //------------------------------------------------------------------------------
58
59
60 //------------------------------------------------------------------------------
61 void vvLinkPanel::removeImage(int index)
62 {
63   std::string idRemoved = image1Ids[index];
64   std::vector<std::string>::iterator Nameiter = imageNames.begin();
65   std::vector<std::string>::iterator Iditer = image1Ids.begin();
66   for (int i = 0; i < index; i++)
67     {
68       Nameiter++;
69       Iditer++;
70     }
71   imageNames.erase(Nameiter);
72   image1Ids.erase(Iditer);
73   UpdateComboBox1();
74   for (int i = linkTableWidget->rowCount() - 1; i >= 0 ;i--)
75     {
76       if (linkTableWidget->item(i,4)->text().toStdString() == idRemoved ||
77           linkTableWidget->item(i,5)->text().toStdString() == idRemoved)
78         {
79           emit removeLink(linkTableWidget->item(i,4)->text(),linkTableWidget->item(i,5)->text());
80           linkTableWidget->removeRow(i);
81           UpdateComboBox2(image1ComboBox->currentIndex());
82         }
83     }
84 }
85 //------------------------------------------------------------------------------
86
87
88 //------------------------------------------------------------------------------
89 void vvLinkPanel::UpdateComboBox1()
90 {
91   image1ComboBox->clear();
92   for (unsigned int i = 0; i < imageNames.size();i++)
93     {
94       image1ComboBox->addItem(imageNames[i].c_str());
95     }
96 }
97 //------------------------------------------------------------------------------
98
99
100 //------------------------------------------------------------------------------
101 void vvLinkPanel::UpdateComboBox2(int index)
102 {
103   image2ComboBox->clear();
104   image2Ids.resize(0);
105   if (imageNames.size() > 1 && index >= 0)
106     {
107       for (unsigned int i = 0; i < imageNames.size();i++)
108         {
109           if ((int)i != index)
110             {
111               bool AlreadyLinked = false;
112               for (int row = 0; row < linkTableWidget->rowCount();row++)
113                 {
114                   if ((linkTableWidget->item(row,1)->text().toStdString() == imageNames[index] &&
115                        linkTableWidget->item(row,3)->text().toStdString() == imageNames[i]) ||
116                       (linkTableWidget->item(row,3)->text().toStdString() == imageNames[index] &&
117                        linkTableWidget->item(row,1)->text().toStdString() == imageNames[i]))
118                     {
119                       AlreadyLinked = true;
120                       break;
121                     }
122                 }
123               if (!AlreadyLinked)
124                 {
125                   image2ComboBox->addItem(imageNames[i].c_str());
126                   image2Ids.push_back(image1Ids[i]);
127                 }
128             }
129         }
130     }
131   if (image2ComboBox->count() == 0)
132     linkButton->setEnabled(0);
133   else
134     linkButton->setEnabled(1);
135 }
136 //------------------------------------------------------------------------------
137
138
139 //------------------------------------------------------------------------------
140 void vvLinkPanel::linkAll()
141 {
142   //First remove all links
143   while (linkTableWidget->rowCount())
144     removeLink(1,1);
145   //Now create all possible links
146   int count=image2ComboBox->count();
147   for (int j=0;j<count;j++)
148     {
149       image1ComboBox->setCurrentIndex(j);
150       image2ComboBox->setCurrentIndex(0);
151       for (int i=0;i< count-j;i++)
152         addLink();
153     }
154 }
155 //------------------------------------------------------------------------------
156
157
158 //------------------------------------------------------------------------------
159 void vvLinkPanel::addLink()
160 {
161   if (!image1ComboBox->currentText().isEmpty()
162       && !image2ComboBox->currentText().isEmpty())
163     {
164       int row = linkTableWidget->rowCount();
165       linkTableWidget->insertRow(row);
166
167       linkTableWidget->setItem(row,1,new QTableWidgetItem(image1ComboBox->currentText()));
168       linkTableWidget->setItem(row,2,new QTableWidgetItem("&"));
169       linkTableWidget->setItem(row,3,new QTableWidgetItem(image2ComboBox->currentText()));
170       linkTableWidget->setItem(row,4,new QTableWidgetItem(image1Ids[image1ComboBox->currentIndex()].c_str()));
171       linkTableWidget->setItem(row,5,new QTableWidgetItem(image2Ids[image2ComboBox->currentIndex()].c_str()));
172       QTreePushButton* cButton = new QTreePushButton;
173       cButton->setIndex(linkTableWidget->rowCount());
174       cButton->setColumn(0);
175       cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
176       connect(cButton,SIGNAL(clickedInto(int, int)),
177               this,SLOT(removeLink(int, int)));
178       cButton->setToolTip(tr("remove link"));
179       linkTableWidget->setCellWidget(row,0,cButton);
180
181       linkTableWidget->resizeColumnToContents(0);
182       linkTableWidget->resizeColumnToContents(1);
183       linkTableWidget->resizeColumnToContents(2);
184       linkTableWidget->resizeColumnToContents(3);
185       linkTableWidget->setRowHeight(row,17);
186
187       emit addLink(image1Ids[image1ComboBox->currentIndex()].c_str(),
188                    image2Ids[image2ComboBox->currentIndex()].c_str());
189       UpdateComboBox2(image1ComboBox->currentIndex());
190     }
191
192 }
193 //------------------------------------------------------------------------------
194
195
196 //------------------------------------------------------------------------------
197 void vvLinkPanel::removeLink(int row, int column)
198 {
199  //  DD(row);
200 //   DD(column);
201   while (linkTableWidget->item(row-1,4) == NULL) {
202     --row;
203    //  DD(linkTableWidget->rowCount());
204 //     DD(row);
205     // return;
206   }
207   if (linkTableWidget->item(row-1,5) == NULL) {
208     return; // should not happend ...
209   }
210   
211   emit removeLink(linkTableWidget->item(row-1,4)->text(),linkTableWidget->item(row-1,5)->text());
212   // DD("after emit");
213   linkTableWidget->removeRow(row-1);
214   // DD("after removeRow");
215   UpdateComboBox2(image1ComboBox->currentIndex());
216   // DD("end");
217 }
218 //------------------------------------------------------------------------------
219
220 #endif /* end #define _vvLinkPanel_CXX */
221