]> Creatis software - clitk.git/blob - vv/vvLinkPanel.cxx
added the new headers
[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 #ifndef _vvLinkPanel_CXX
19 #define _vvLinkPanel_CXX
20 #include "vvLinkPanel.h"
21 #include "clitkCommon.h"
22
23 #include <QtGui>
24 #include <Qt>
25 #include "QTreePushButton.h"
26
27 //====================================================================
28 vvLinkPanel::vvLinkPanel(QWidget * parent):QWidget(parent)
29 {
30     setupUi(this);
31     imageNames.resize(0);
32     image1Ids.resize(0);
33     image2Ids.resize(0);
34
35     linkTableWidget->resizeColumnsToContents();
36     linkTableWidget->verticalHeader()->hide();
37     linkTableWidget->horizontalHeader()->hide();
38     linkTableWidget->hideColumn(4);
39     linkTableWidget->hideColumn(5);
40
41     connect(image1ComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateComboBox2(int)));
42     connect(linkButton,SIGNAL(clicked()),this,SLOT(addLink()));
43     connect(linkAllButton,SIGNAL(clicked()),this,SLOT(linkAll()));
44 }
45
46 void vvLinkPanel::addImage(std::string name, std::string id)
47 {
48     imageNames.push_back(name);
49     image1Ids.push_back(id);
50     UpdateComboBox1();
51 }
52
53 void vvLinkPanel::removeImage(int index)
54 {
55     std::string idRemoved = image1Ids[index];
56     std::vector<std::string>::iterator Nameiter = imageNames.begin();
57     std::vector<std::string>::iterator Iditer = image1Ids.begin();
58     for (int i = 0; i < index; i++)
59     {
60         Nameiter++;
61         Iditer++;
62     }
63     imageNames.erase(Nameiter);
64     image1Ids.erase(Iditer);
65     UpdateComboBox1();
66     for (int i = linkTableWidget->rowCount() - 1; i >= 0 ;i--)
67     {
68         if (linkTableWidget->item(i,4)->text().toStdString() == idRemoved ||
69                 linkTableWidget->item(i,5)->text().toStdString() == idRemoved)
70         {
71             emit removeLink(linkTableWidget->item(i,4)->text(),linkTableWidget->item(i,5)->text());
72             linkTableWidget->removeRow(i);
73             UpdateComboBox2(image1ComboBox->currentIndex());
74         }
75     }
76 }
77
78 void vvLinkPanel::UpdateComboBox1()
79 {
80     image1ComboBox->clear();
81     for (unsigned int i = 0; i < imageNames.size();i++)
82     {
83         image1ComboBox->addItem(imageNames[i].c_str());
84     }
85 }
86
87 void vvLinkPanel::UpdateComboBox2(int index)
88 {
89     image2ComboBox->clear();
90     image2Ids.resize(0);
91     if (imageNames.size() > 1 && index >= 0)
92     {
93         for (unsigned int i = 0; i < imageNames.size();i++)
94         {
95             if ((int)i != index)
96             {
97                 bool AlreadyLinked = false;
98                 for (int row = 0; row < linkTableWidget->rowCount();row++)
99                 {
100                     if ((linkTableWidget->item(row,1)->text().toStdString() == imageNames[index] &&
101                             linkTableWidget->item(row,3)->text().toStdString() == imageNames[i]) ||
102                             (linkTableWidget->item(row,3)->text().toStdString() == imageNames[index] &&
103                              linkTableWidget->item(row,1)->text().toStdString() == imageNames[i]))
104                     {
105                         AlreadyLinked = true;
106                         break;
107                     }
108                 }
109                 if (!AlreadyLinked)
110                 {
111                     image2ComboBox->addItem(imageNames[i].c_str());
112                     image2Ids.push_back(image1Ids[i]);
113                 }
114             }
115         }
116     }
117     if (image2ComboBox->count() == 0)
118         linkButton->setEnabled(0);
119     else
120         linkButton->setEnabled(1);
121 }
122
123 void vvLinkPanel::linkAll()
124 {
125     //First remove all links
126     while (linkTableWidget->rowCount())
127         removeLink(1,1);
128     //Now create all possible links
129     int count=image2ComboBox->count();
130     for (int j=0;j<count;j++)
131     {
132         image1ComboBox->setCurrentIndex(j);
133         image2ComboBox->setCurrentIndex(0);
134         for (int i=0;i< count-j;i++)
135             addLink();
136     }
137 }
138
139 void vvLinkPanel::addLink()
140 {
141     if (!image1ComboBox->currentText().isEmpty()
142             && !image2ComboBox->currentText().isEmpty())
143     {
144         int row = linkTableWidget->rowCount();
145         linkTableWidget->insertRow(row);
146
147         linkTableWidget->setItem(row,1,new QTableWidgetItem(image1ComboBox->currentText()));
148         linkTableWidget->setItem(row,2,new QTableWidgetItem("&"));
149         linkTableWidget->setItem(row,3,new QTableWidgetItem(image2ComboBox->currentText()));
150         linkTableWidget->setItem(row,4,new QTableWidgetItem(image1Ids[image1ComboBox->currentIndex()].c_str()));
151         linkTableWidget->setItem(row,5,new QTableWidgetItem(image2Ids[image2ComboBox->currentIndex()].c_str()));
152         QTreePushButton* cButton = new QTreePushButton;
153         cButton->setIndex(linkTableWidget->rowCount());
154         cButton->setColumn(0);
155         cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
156         connect(cButton,SIGNAL(clickedInto(int, int)),
157                 this,SLOT(removeLink(int, int)));
158         cButton->setToolTip(tr("remove link"));
159         linkTableWidget->setCellWidget(row,0,cButton);
160
161         linkTableWidget->resizeColumnToContents(0);
162         linkTableWidget->resizeColumnToContents(1);
163         linkTableWidget->resizeColumnToContents(2);
164         linkTableWidget->resizeColumnToContents(3);
165         linkTableWidget->setRowHeight(row,17);
166
167         emit addLink(image1Ids[image1ComboBox->currentIndex()].c_str(),
168                      image2Ids[image2ComboBox->currentIndex()].c_str());
169         UpdateComboBox2(image1ComboBox->currentIndex());
170     }
171
172 }
173
174 void vvLinkPanel::removeLink(int row, int column)
175 {
176     emit removeLink(linkTableWidget->item(row-1,4)->text(),linkTableWidget->item(row-1,5)->text());
177     linkTableWidget->removeRow(row-1);
178     UpdateComboBox2(image1ComboBox->currentIndex());
179 }
180
181 #endif /* end #define _vvLinkPanel_CXX */
182