]> Creatis software - clitk.git/blob - vv/vvLandmarksPanel.cxx
(more) robust handling of landmarks in time-sequences
[clitk.git] / vv / vvLandmarksPanel.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://www.centreleonberard.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 _vvLandmarksPanel_CXX
19 #define _vvLandmarksPanel_CXX
20 #include "vvLandmarksPanel.h"
21
22 #include <QtGui>
23 #include <Qt>
24 #include "QTreePushButton.h"
25 #include "vvLandmarks.h"
26
27 #include <vtksys/SystemTools.hxx>
28 #include <clitkDD.h>
29
30 //====================================================================
31 vvLandmarksPanel::vvLandmarksPanel(QWidget * parent):QWidget(parent)
32 {
33   setupUi(this);
34
35   tableWidget->verticalHeader()->hide();
36   tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
37   tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
38   loadButton->setEnabled(0);
39   saveButton->setEnabled(0);
40   removeButton->setEnabled(0);
41   connect(loadButton, SIGNAL(clicked()),this,SLOT(Load()));
42   connect(saveButton, SIGNAL(clicked()),this,SLOT(Save()));
43   connect(removeButton, SIGNAL(clicked()),this,SLOT(RemoveSelectedPoints()));
44   connect(tableWidget,SIGNAL(cellChanged(int,int)),this,SLOT(CommentsChanged(int,int)));
45 }
46
47 void vvLandmarksPanel::Load()
48 {
49   QString file = QFileDialog::getOpenFileName(this,tr("Load Landmarks"),
50                  mCurrentPath.c_str(),tr("Landmarks ( *.txt *.pts)"));
51   if (!file.isEmpty()) {
52     std::vector<std::string> files(1, file.toStdString());
53     LoadFromFile(files);
54   }
55 }
56
57 bool vvLandmarksPanel::LoadFromFile(std::vector<std::string> files)
58 {
59   if (!mCurrentLandmarks->LoadFile(files))
60     return false;
61   
62   SetCurrentLandmarks(mCurrentLandmarks,2);
63   emit UpdateRenderWindows();
64   return true;
65 }
66
67 void vvLandmarksPanel::Save()
68 {
69   QString file = QFileDialog::getSaveFileName(this,
70                  tr("Save Landmarks"),
71                  mCurrentPath.c_str(),tr("Landmarks ( *.txt)"));
72   if (!file.isEmpty()) {
73     std::string filename = vtksys::SystemTools::GetFilenamePath(file.toStdString());
74     filename += "/" + vtksys::SystemTools::GetFilenameWithoutLastExtension(file.toStdString());
75     filename += ".txt";
76     mCurrentLandmarks->SaveFile(filename.c_str());
77   }
78 }
79
80 void vvLandmarksPanel::RemoveSelectedPoints()
81 {
82   if (tableWidget->rowCount() > 0) {
83     QList<QTableWidgetItem *> items = tableWidget->selectedItems();
84     if (items.empty()) {
85       tableWidget->removeRow(tableWidget->rowCount()-1);
86       mCurrentLandmarks->RemoveLastLandmark();
87     }
88     else {
89       // we're using single-selection mode
90       int row = items[0]->row();
91       mCurrentLandmarks->RemoveLandmark(row);
92       tableWidget->removeRow(row);
93       
94       for (int i = row; i < tableWidget->rowCount(); i++) {
95         QTableWidgetItem* iItem = tableWidget->item(i, 0);
96         iItem->setText(QString::number(i));
97       }
98         
99     }
100     emit UpdateRenderWindows();
101   }
102 }
103
104 void vvLandmarksPanel::AddPoint()
105 {
106   AddPoint(mCurrentLandmarks->GetNumberOfPoints()-1);
107 }
108
109 void vvLandmarksPanel::AddPoint(int landmarksIndex)
110 {
111   int rowIndex = tableWidget->rowCount();
112 //   DD(rowIndex);
113   tableWidget->setRowCount(rowIndex+1);
114   tableWidget->setRowHeight(rowIndex,20);
115   QTableWidgetItem* iItem = new QTableWidgetItem(QString::number(rowIndex));
116   iItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
117   tableWidget->setItem(rowIndex,0,iItem);
118
119   QTableWidgetItem* xItem = new QTableWidgetItem(
120     QString::number(mCurrentLandmarks->GetCoordinates(landmarksIndex)[0],'f',1));
121   xItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
122   tableWidget->setItem(rowIndex,1,xItem);
123
124   QTableWidgetItem* yItem = new QTableWidgetItem(
125     QString::number(mCurrentLandmarks->GetCoordinates(landmarksIndex)[1],'f',1));
126   yItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
127   tableWidget->setItem(rowIndex,2,yItem);
128
129   QTableWidgetItem* zItem = new QTableWidgetItem(
130     QString::number(mCurrentLandmarks->GetCoordinates(landmarksIndex)[2],'f',1));
131   zItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
132   tableWidget->setItem(rowIndex,3,zItem);
133
134   QTableWidgetItem* tItem = new QTableWidgetItem(
135     QString::number(mCurrentLandmarks->GetCoordinates(landmarksIndex)[3],'f',1));
136   tItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
137   tableWidget->setItem(rowIndex,4,tItem);
138
139
140   QTableWidgetItem* vItem = new QTableWidgetItem(
141     QString::number(mCurrentLandmarks->GetPixelValue(landmarksIndex),'f',1));
142   vItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
143   tableWidget->setItem(rowIndex,5,vItem);
144
145   tableWidget->setItem(rowIndex,6, new QTableWidgetItem(mCurrentLandmarks->GetComments(landmarksIndex).c_str()));
146 }
147
148 void vvLandmarksPanel::SetCurrentLandmarks(vvLandmarks* lm,int time)
149 {
150   if (time != lm->GetTime())
151     return;
152   
153   loadButton->setEnabled(1);
154   saveButton->setEnabled(1);
155   removeButton->setEnabled(1);
156   mCurrentLandmarks = lm;
157   tableWidget->clearContents();
158   tableWidget->setRowCount(0);
159   for (unsigned int i = 0; i < mCurrentLandmarks->GetNumberOfPoints(); i++) {
160       AddPoint(i);
161   }
162   //if (time > 1)
163   //tableWidget->setColumnHidden(4,1);
164   //else
165   //tableWidget->setColumnHidden(4,0);
166   tableWidget->resizeColumnsToContents();
167 }
168
169 void vvLandmarksPanel::SetCurrentImage(std::string filename)
170 {
171   QString image = "<b>CurrentImage : </b>";
172   image += vtksys::SystemTools::GetFilenameWithoutLastExtension(filename).c_str();
173   nameLabel->setText(image);
174 }
175
176 void vvLandmarksPanel::CommentsChanged(int row, int column)
177 {
178   if (column == 6) {
179     mCurrentLandmarks->ChangeComments(row,std::string(tableWidget->item(row,column)->text().toStdString()));
180     tableWidget->resizeColumnsToContents();
181   }
182 }
183
184 #endif /* end #define _vvLandmarksPanel_CXX */
185