]> Creatis software - clitk.git/blob - vv/vvMainWindow.cxx
Initial revision
[clitk.git] / vv / vvMainWindow.cxx
1 /*=========================================================================
2
3 Program:   vv
4 Module:    $RCSfile: vvMainWindow.cxx,v $
5 Language:  C++
6 Date:      $Date: 2010/01/06 13:31:57 $
7 Version:   $Revision: 1.1 $
8 Author :   Pierre Seroul (pierre.seroul@gmail.com)
9
10 Copyright (C) 200COLUMN_IMAGE_NAME
11 Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
12 CREATIS-LRMN http://www.creatis.insa-lyon.fr
13
14 This program is free software: you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation, version 3 of the License.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program.  If not, see <http://www.gnu.org/licenses/>.
25
26 =========================================================================*/
27 #include <algorithm>
28 #include <QMessageBox>
29 #include <QInputDialog>
30 #include <QTimer>
31
32 #include "vvMainWindow.h"
33 #include "vvHelpDialog.h"
34 #include "vvDocumentation.h"
35 #include "vvProgressDialog.h"
36 #include "vvQDicomSeriesSelector.h"
37 #include "vvSlicerManager.h"
38 #include "clitkIOCommon.h"
39 #include "vvSlicer.h"
40 #include "vvInteractorStyleNavigator.h"
41 #include "vvImageWriter.h"
42 #include "vvResamplerDialog.h"
43 #include "vvSegmentationDialog.h"
44 #include "vvSurfaceViewerDialog.h"
45 #include "vvDeformationDialog.h"
46 #include "vvImageWarp.h"
47 #include "vvUtils.h"
48 #include "vvMaximumIntensityProjection.h"
49 #include "vvMidPosition.h"
50 #include "vvMesh.h"
51 #include "vvStructSelector.h"
52 #include "vvMeshReader.h"
53 #include "vvCropDialog.h"
54 #include "QTreePushButton.h"
55
56 #ifdef CLITK_VV_USE_BDCM
57 #include <bdcmDicomFilesSelectorDialog.h>
58 #endif
59
60 #include "itkImage.h"
61 #include "itkImageFileReader.h"
62 #include "itkByteSwapper.h"
63 #include "itkCommand.h"
64 #include "itkNumericSeriesFileNames.h"
65
66 #include "vtkImageData.h"
67 #include "vtkImageActor.h"
68 #include "vtkCornerAnnotation.h"
69 #include "vtkRenderWindow.h"
70 #include "vtkRenderWindowInteractor.h"
71 #include "vtkRenderer.h"
72 #include "vtkRendererCollection.h"
73
74 #include "vtkWindowToImageFilter.h"
75 #include "vtkBMPWriter.h"
76 #include "vtkTIFFWriter.h"
77 #include "vtkPNMWriter.h"
78 #include "vtkPNGWriter.h"
79 #include "vtkJPEGWriter.h"
80
81 // Standard includes
82 #include <iostream>
83
84 #include "vvConstants.h"
85
86 #define COLUMN_TREE 0
87 #define COLUMN_UL_VIEW 1
88 #define COLUMN_UR_VIEW 2
89 #define COLUMN_DL_VIEW 3
90 #define COLUMN_DR_VIEW 4
91 #define COLUMN_CLOSE_IMAGE 5
92 #define COLUMN_RELOAD_IMAGE 6
93 #define COLUMN_IMAGE_NAME 7
94
95 /*Data Tree values
96   0,Qt::UserRole full filename
97   1,Qt::CheckStateRole checkbutton UL View
98   1,Qt::UserRole overlay, fusion or vector
99   2,Qt::CheckStateRole checkbutton UR View
100   3,Qt::CheckStateRole checkbutton DL View
101   4,Qt::CheckStateRole checkbutton DR View
102   5,0  short filename
103   5,Qt::UserRole mSlicerManager id*/
104
105 //====================================================================
106 vvMainWindow::vvMainWindow() {
107     setupUi(this); // this sets up the GUI
108
109     mInputPathName = "";
110
111     //Init the contextMenu
112     this->setContextMenuPolicy(Qt::CustomContextMenu);
113     contextActions.resize(0);
114     QAction* actionOpen_new_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/fileopen.png")),
115                                     tr("Open new Image"));
116     connect(actionOpen_new_image,SIGNAL(triggered()),this,SLOT(OpenImages()));
117     contextActions.push_back(actionOpen_new_image);
118
119     contextMenu.addSeparator();
120
121     QAction* actionClose_Image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")),
122                                  tr("Close Current Image"));
123     connect(actionClose_Image,SIGNAL(triggered()),this,SLOT(CloseImage()));
124     contextActions.push_back(actionClose_Image);
125
126     QAction* actionReload_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")),
127                                   tr("Reload Current Image"));
128     connect(actionReload_image,SIGNAL(triggered()),this,SLOT(ReloadImage()));
129     contextActions.push_back(actionReload_image);
130
131     QAction* actionSave_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/filesave.png")),
132                                 tr("Save Current Image"));
133     connect(actionSave_image,SIGNAL(triggered()),this,SLOT(SaveAs()));
134     contextActions.push_back(actionSave_image);
135
136     contextMenu.addSeparator();
137
138     QAction* actionCrop_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/crop.png")),
139                                  tr("Crop Current Image"));
140     connect(actionCrop_image,SIGNAL(triggered()),this,SLOT(CropImage()));
141     contextActions.push_back(actionCrop_image);
142
143     QAction* actionSplit_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/cut.png")),
144                                  tr("Split Current Image"));
145     connect(actionSplit_image,SIGNAL(triggered()),this,SLOT(SplitImage()));
146     contextActions.push_back(actionSplit_image);
147
148     contextMenu.addSeparator();
149
150     contextMenu.addAction(actionAdd_VF_to_current_Image);
151     contextActions.push_back(actionAdd_VF_to_current_Image);
152
153     QAction* actionAdd_Overlay_to_current_Image = menuOverlay->addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/GPSup.png")),
154             tr("Add overlay image to current image"));
155     contextMenu.addAction(actionAdd_Overlay_to_current_Image);
156     contextActions.push_back(actionAdd_Overlay_to_current_Image);
157
158     connect(actionAdd_Overlay_to_current_Image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage()));
159
160     contextMenu.addAction(actionAdd_fusion_image);
161     connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(AddFusionImage()));
162     contextActions.push_back(actionAdd_fusion_image);
163
164
165     //init the DataTree
166     mSlicerManagers.resize(0);
167
168     QStringList header;
169     header.append("");
170     header.append("TL");
171     header.append("TR");
172     header.append("BL");
173     header.append("BR");
174     header.append("");
175     header.append("");
176     header.append("Name");
177
178     DataTree->setHeaderLabels(header);
179     DataTree->resizeColumnToContents(COLUMN_TREE);
180     DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
181     DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
182     DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
183     DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
184     DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
185     DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
186     DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
187
188     viewMode = 1;
189     documentation = new vvDocumentation();
190     help_dialog = new vvHelpDialog();
191     dicomSeriesSelector = new vvDicomSeriesSelector();
192
193     inverseButton->setEnabled(0);
194     actionAdd_Overlay_to_current_Image->setEnabled(0);
195     actionSave_As->setEnabled(0);
196     actionAdd_VF_to_current_Image->setEnabled(0);
197     actionAdd_fusion_image->setEnabled(0);
198
199     //init the sliders
200     verticalSliders.push_back(NOVerticalSlider);
201     verticalSliders.push_back(NEVerticalSlider);
202     verticalSliders.push_back(SOVerticalSlider);
203     verticalSliders.push_back(SEVerticalSlider);
204
205     for (int i =0; i < 4; i++)
206         verticalSliders[i]->hide();
207
208     horizontalSliders.push_back(NOHorizontalSlider);
209     horizontalSliders.push_back(NEHorizontalSlider);
210     horizontalSliders.push_back(SOHorizontalSlider);
211     horizontalSliders.push_back(SEHorizontalSlider);
212
213     for (int i =0; i < 4; i++)
214         horizontalSliders[i]->hide();
215
216
217     connect(NOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOVerticalSliderChanged()));
218     connect(NEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEVerticalSliderChanged()));
219     connect(SOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOVerticalSliderChanged()));
220     connect(SEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEVerticalSliderChanged()));
221
222     connect(NOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOHorizontalSliderMoved()));
223     connect(NEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEHorizontalSliderMoved()));
224     connect(SOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOHorizontalSliderMoved()));
225     connect(SEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEHorizontalSliderMoved()));
226
227     //connect everything
228     connect(actionMaximum_Intensity_Projection,SIGNAL(triggered()),this,SLOT(ComputeMIP()));
229     connect(actionCompute_mid_position_image,SIGNAL(triggered()),this,SLOT(ComputeMidPosition()));
230     connect(actionDeformable_Registration,SIGNAL(triggered()),this,SLOT(ComputeDeformableRegistration()));
231     connect(actionWarp_image_with_vector_field,SIGNAL(triggered()),this,SLOT(WarpImage()));
232     connect(actionLoad_images,SIGNAL(triggered()),this,SLOT(OpenImages()));
233     connect(actionOpen_Dicom,SIGNAL(triggered()),this,SLOT(OpenDicom()));
234     connect(actionOpen_Dicom_Struct,SIGNAL(triggered()),this,SLOT(OpenDCStructContour()));
235     connect(actionOpen_VTK_contour,SIGNAL(triggered()),this,SLOT(OpenVTKContour()));
236     connect(actionOpen_Multiple_Images_As_One,SIGNAL(triggered()),this,SLOT(MergeImages()));
237     connect(actionOpen_Image_With_Time,SIGNAL(triggered()),this,SLOT(OpenImageWithTime()));
238     connect(actionMerge_images_as_n_dim_t, SIGNAL(triggered()), this, SLOT(MergeImagesWithTime()));
239     connect(actionSave_As,SIGNAL(triggered()),this,SLOT(SaveAs()));
240     connect(actionExit,SIGNAL(triggered()),this,SLOT(close()));
241     connect(actionAdd_VF_to_current_Image,SIGNAL(triggered()),this,SLOT(OpenField()));
242     connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
243     connect(actionDocumentation,SIGNAL(triggered()),this,SLOT(ShowDocumentation()));
244
245     ///////////////////////////////////////////////
246     contextMenu.addAction(actionResampler);
247     connect(actionResampler,SIGNAL(triggered()),this,SLOT(ResampleCurrentImage()));
248     connect(actionSegmentation,SIGNAL(triggered()),this,SLOT(SegmentationOnCurrentImage()));
249     connect(actionSurface_Viewer,SIGNAL(triggered()),this,SLOT(SurfaceViewerLaunch()));
250     ///////////////////////////////////////////////
251
252     actionNorth_East_Window->setEnabled(0);
253     actionNorth_West_Window->setEnabled(0);
254     actionSouth_East_Window->setEnabled(0);
255     actionSouth_West_Window->setEnabled(0);
256
257     connect(actionNorth_East_Window,SIGNAL(triggered()),this,SLOT(SaveNEScreenshot()));
258     connect(actionNorth_West_Window,SIGNAL(triggered()),this,SLOT(SaveNOScreenshot()));
259     connect(actionSouth_East_Window,SIGNAL(triggered()),this,SLOT(SaveSEScreenshot()));
260     connect(actionSouth_West_Window,SIGNAL(triggered()),this,SLOT(SaveSOScreenshot()));
261
262     connect(DataTree,SIGNAL(itemSelectionChanged()),this,SLOT(ImageInfoChanged()));
263     connect(DataTree,SIGNAL(itemClicked(QTreeWidgetItem*, int)),this,
264             SLOT(DisplayChanged(QTreeWidgetItem*, int)));
265
266     connect(viewButton,SIGNAL(clicked()),this, SLOT(ChangeViewMode()) );
267     connect(windowSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
268     connect(levelSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
269     connect(colorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateColorMap()));
270     connect(presetComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateWindowLevel()));
271     connect(inverseButton,SIGNAL(clicked()),this,SLOT(SwitchWindowLevel()));
272
273
274     connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ShowContextMenu(QPoint)));
275
276     connect(linkPanel,SIGNAL(addLink(QString,QString)),this,SLOT(AddLink(QString,QString)));
277     connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(QString,QString)));
278     connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int)),this,SLOT(SetVFProperty(int,int,int)));
279     connect(overlayPanel,SIGNAL(OverlayPropertyUpdated(int)),this,SLOT(SetOverlayProperty(int)));
280     connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,double,double)),
281             this,SLOT(SetFusionProperty(int,int,double,double)));
282     connect(landmarksPanel,SIGNAL(UpdateRenderWindows()),this,SLOT(UpdateRenderWindows()));
283
284     playMode = 0;//pause
285     mFrameRate = 10;
286     playButton->setEnabled(0);
287     frameRateLabel->setEnabled(0);
288     frameRateSpinBox->setEnabled(0);
289     connect(playButton, SIGNAL(clicked()),this,SLOT(PlayPause()));
290     connect(frameRateSpinBox, SIGNAL(valueChanged(int)),this,SLOT(ChangeFrameRate(int)));
291
292     goToCursorPushButton->setEnabled(0);
293     connect(goToCursorPushButton, SIGNAL(clicked()),this,SLOT(GoToCursor()));
294
295     NOViewWidget->hide();
296     NEViewWidget->hide();
297     SOViewWidget->hide();
298     SEViewWidget->hide();
299
300     //Recently opened files
301     std::list<std::string> recent_files = GetRecentlyOpenedImages();
302     if ( not recent_files.empty() )
303     {
304         QMenu * rmenu = new QMenu("Recently opened files...");
305         rmenu->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")));
306         menuFile->insertMenu(actionOpen_Image_With_Time,rmenu);
307         for (std::list<std::string>::iterator i = recent_files.begin();i!=recent_files.end();i++)
308         {
309             QAction* current=new QAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")),
310                     (*i).c_str(),this);
311             rmenu->addAction(current);
312             connect(current,SIGNAL(triggered()),this,SLOT(OpenRecentImage()));
313         }
314     }
315 }
316 //====================================================================
317 void vvMainWindow::ComputeMIP()
318 {
319     vvMaximumIntensityProjection mip;
320     vvSlicerManager* selected_slicer = mSlicerManagers[GetSlicerIndexFromItem(DataTree->selectedItems()[0])];
321     QFileInfo info(selected_slicer->GetFileName().c_str());
322     mip.Compute(selected_slicer);
323     AddImage(mip.GetOutput(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_mip.mhd");
324 }
325
326 void vvMainWindow::ComputeMidPosition()
327 {
328     bool ok;
329     int index=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
330     int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
331             mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
332     if (ok)
333     {
334         vvMidPosition midp;
335         midp.slicer_manager = mSlicerManagers[index];
336         midp.reference_image_index = ref;
337         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
338         midp.Update();
339         if (midp.error)
340             QMessageBox::warning(this, "Error computing midposition image",midp.error_message.c_str());
341         else
342         {
343             QFileInfo info(midp.slicer_manager->GetFileName().c_str());
344             AddImage(midp.output,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_midposition.mhd");
345         }
346         QApplication::restoreOverrideCursor();
347     }
348 }
349
350 void vvMainWindow::AddContour(int image_index, vvMesh::Pointer contour, bool propagation)
351 {
352     QTreeWidgetItem *item = new QTreeWidgetItem();
353     item->setData(0,Qt::UserRole,"filename.vtk");
354     item->setData(1,Qt::UserRole,tr("contour"));
355     QBrush brush;
356     brush.setColor(QColor(contour->r*255,contour->g*255,contour->b*255));
357     brush.setStyle(Qt::SolidPattern);
358     item->setData(COLUMN_IMAGE_NAME,Qt::BackgroundRole,brush);
359     item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,contour->structure_name.c_str());
360
361     for (int j = 1; j <= 4; j++)
362         item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(image_index)->data(j,Qt::CheckStateRole));
363
364     QTreePushButton* cButton = new QTreePushButton;
365     cButton->setItem(item);
366     cButton->setColumn(COLUMN_CLOSE_IMAGE);
367     cButton->setToolTip(tr("close image"));
368     cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
369     connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
370             this,SLOT(CloseImage(QTreeWidgetItem*, int)));
371
372     QTreePushButton* rButton = new QTreePushButton;
373     rButton->setItem(item);
374     rButton->setColumn(COLUMN_RELOAD_IMAGE);
375     rButton->setToolTip(tr("reload image"));
376     rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
377     rButton->setEnabled(false);
378     //Not implemented
379     //connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
380             //this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
381
382     DataTree->topLevelItem(image_index)->setExpanded(1);
383     DataTree->topLevelItem(image_index)->addChild(item);
384     DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
385     DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
386     QString id = DataTree->topLevelItem(image_index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
387     item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
388
389     UpdateTree();
390     mSlicerManagers[image_index]->AddContour(contour,propagation);
391     mSlicerManagers[image_index]->Render();
392 }
393
394 //====================================================================
395 void vvMainWindow::OpenVTKContour()
396 {
397     if (mSlicerManagers.size() > 0)
398     {
399         QString Extensions = "Images ( *.vtk)";
400         Extensions += ";;All Files (*)";
401         QString file = QFileDialog::getOpenFileName(this,tr("Open vtkPolyData"),mInputPathName,Extensions);
402         if (file.isNull())
403             return;
404         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
405         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
406         vvMeshReader reader;
407         reader.SetModeToVTK();
408         reader.SetFilename(file.toStdString());
409         reader.Update();
410         AddContour(index,reader.GetOutput()[0],false);
411         QApplication::restoreOverrideCursor();
412     }
413 }
414 //====================================================================
415 void vvMainWindow::OpenDCStructContour()
416 {
417     if (mSlicerManagers.size() > 0)
418     {
419         QString Extensions = "Dicom Files ( *.dcm)";
420         Extensions += ";;All Files (*)";
421         QString file = QFileDialog::getOpenFileName(this,tr("Merge Images"),mInputPathName,Extensions);
422         if (file.isNull())
423             return;
424         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
425         vvMeshReader reader;
426         reader.SetFilename(file.toStdString());
427         vvStructSelector selector;
428         selector.SetStructures(reader.GetROINames());
429         if (!mSlicerManagers[index]->GetVF().IsNull())
430             selector.EnablePropagationCheckBox();
431         if (selector.exec())
432         {
433             QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
434             reader.SetSelectedItems(selector.getSelectedItems());
435             reader.SetImage(mSlicerManagers[index]->GetImage());
436             if (selector.PropagationEnabled())
437                 reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
438             reader.Update();
439             std::vector<vvMesh::Pointer> contours=reader.GetOutput();
440             for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
441                     i!=contours.end();i++)
442                 AddContour(index,*i,selector.PropagationEnabled());
443             QApplication::restoreOverrideCursor();
444         }
445     }
446 }
447
448 //====================================================================
449 void vvMainWindow::ComputeDeformableRegistration()
450 {
451     if (mSlicerManagers.size() > 0)
452     {
453         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
454         vvDeformationDialog dialog(index,mSlicerManagers);
455         if (dialog.exec())
456         {
457             std::string base_name=itksys::SystemTools::GetFilenameWithoutExtension(mSlicerManagers[dialog.GetInputFileIndex()]->GetFileName());
458             AddField(dialog.GetOutput(),dialog.getFieldFile(),dialog.GetInputFileIndex());
459             WarpImage(dialog.GetSelectedSlicer(),dialog.GetReferenceFrameIndex());
460         }
461         else
462             std::cout << "Error or user cancellation while computing deformation field..." << std::endl;
463     }
464     else QMessageBox::information(this, "Need to open image","You must open an image first.");
465 }
466
467 //====================================================================
468 void vvMainWindow::WarpImage()
469 {
470     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
471     if (!mSlicerManagers[index]->GetVF().IsNull())
472     {
473         bool ok;
474         int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
475                                            mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
476         if (ok)
477         {
478             WarpImage(mSlicerManagers[index],ref);
479         }
480     }
481     else
482         QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field"));
483 }
484
485 //====================================================================
486 void vvMainWindow::WarpImage(vvSlicerManager* selected_slicer,int reference_phase)
487 {
488     if (!selected_slicer->GetVF().IsNull())
489     {
490         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
491         QFileInfo info(selected_slicer->GetFileName().c_str());
492         vvImageWarp warp(selected_slicer->GetImage(),selected_slicer->GetVF(),
493                 reference_phase,this);
494         if (warp.ComputeWarpedImage())
495         {
496             AddImage(warp.GetWarpedImage(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_warped.mhd");
497             AddImage(warp.GetDiffImage()  ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_diff.mhd");
498             AddImage(warp.GetJacobianImage()  ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_jacobian.mhd");
499             QApplication::restoreOverrideCursor();
500         }
501         else
502         {
503             QApplication::restoreOverrideCursor();
504             QMessageBox::warning(this,tr("Different spacings"),tr("The vector field and image spacings must be the same in order to warp."));
505         }
506     }
507     else
508         QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field."));
509 }
510
511 //====================================================================
512 vvMainWindow::~vvMainWindow() {
513     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
514     {
515         if (mSlicerManagers[i] != NULL)
516             delete mSlicerManagers[i];
517     }
518 }
519 //====================================================================
520
521 //====================================================================
522 void vvMainWindow::MergeImages() {
523     QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
524     Extensions += ";;All Files (*)";
525     QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images"),mInputPathName,Extensions);
526     if (files.isEmpty())
527         return;
528     mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
529     std::vector<std::string> vector;
530
531     unsigned int currentDim = 0;
532     std::vector<double> currentSpacing;
533     std::vector<int> currentSize;
534     std::vector<double> currentOrigin;
535
536     for (int i = 0; i < files.size(); i++)
537     {
538         itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
539                                                files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
540         reader->SetFileName(files[i].toStdString().c_str());
541         reader->ReadImageInformation();
542         if (reader)  NOViewWidget->hide();
543         NEViewWidget->hide();
544         SOViewWidget->hide();
545         SEViewWidget->hide();
546         {
547             if (i == 0)
548                 currentDim = reader->GetNumberOfDimensions();
549             bool IsOk = true;
550             for (unsigned int j = 0;j < currentDim; j++)
551             {
552                 if (i == 0)
553                 {
554                     if (j == 0)
555                     {
556                         currentSpacing.resize(currentDim);
557                         currentSize.resize(currentDim);
558                         currentOrigin.resize(currentDim);
559                     }
560                     currentOrigin[j] = reader->GetOrigin(j);
561                     currentSpacing[j] = reader->GetSpacing(j);
562                     currentSize[j] = reader->GetDimensions(j);
563                 }
564                 else if (currentDim != reader->GetNumberOfDimensions()
565                          || currentSpacing[j] != reader->GetSpacing(j)
566                          || currentSize[j] != (int)reader->GetDimensions(j)
567                          || currentOrigin[j] != reader->GetOrigin(j))
568                 {
569                     QString error = "Cannot read file (too different from others ";
570                     error += files[i].toStdString().c_str();
571                     QMessageBox::information(this,tr("Reading problem"),error);
572                     IsOk = false;
573                     break;
574                 }
575             }
576             if (IsOk)
577                 vector.push_back(files[i].toStdString());
578         }
579     }
580     if (vector.size() > 0)
581         LoadImages(vector, MERGED);
582 }
583 //====================================================================
584
585 //====================================================================
586 void vvMainWindow::MergeImagesWithTime() {
587     QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
588     Extensions += ";;All Files (*)";
589     QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images With Time"),mInputPathName,Extensions);
590     if (files.isEmpty())
591         return;
592     mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
593     std::vector<std::string> vector;
594
595     unsigned int currentDim = 0;
596     std::vector<double> currentSpacing;
597     std::vector<int> currentSize;
598     std::vector<double> currentOrigin;
599
600     for (int i = 0; i < files.size(); i++)
601     {
602         itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
603                                                files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
604         if (reader)
605         {
606             reader->SetFileName(files[i].toStdString().c_str());
607             reader->ReadImageInformation();
608             if (i == 0)
609                 currentDim = reader->GetNumberOfDimensions();
610             bool IsOk = true;
611             for (unsigned int j = 0;j < currentDim; j++)
612             {
613                 if (i == 0)
614                 {
615                     if (j == 0)
616                     {
617                         currentSpacing.resize(currentDim);
618                         currentSize.resize(currentDim);
619                         currentOrigin.resize(currentDim);
620                     }
621                     currentOrigin[j] = reader->GetOrigin(j);
622                     currentSpacing[j] = reader->GetSpacing(j);
623                     currentSize[j] = reader->GetDimensions(j);
624                 }
625                 else if (currentDim != reader->GetNumberOfDimensions()
626                          || currentSpacing[j] != reader->GetSpacing(j)
627                          || currentSize[j] != (int)reader->GetDimensions(j)
628                          || currentOrigin[j] != reader->GetOrigin(j))
629                 {
630                     QString error = "Cannot read file (too different from others ";
631                     error += files[i].toStdString().c_str();
632                     QMessageBox::information(this,tr("Reading problem"),error);
633                     IsOk = false;
634                     break;
635                 }
636             }
637             if (IsOk)
638                 vector.push_back(files[i].toStdString());
639         }
640         else
641         {
642             QString error = "Cannot read file info for ";
643             error += files[i].toStdString().c_str();
644             error += "\n";
645             error += "Maybe you're trying to open an image in an unsupported format?\n";
646             QMessageBox::information(this,tr("Reading problem"),error);
647         }
648     }
649     sort(vector.begin(),vector.end());
650     if (vector.size() > 1)
651         LoadImages(vector, MERGEDWITHTIME);
652     else
653         QMessageBox::warning(this,tr("Reading problem"),"You need to select at least two images to merge images with time.\nIf you only want to open one image, please use the \"Open Image\" function.");
654 }
655 //====================================================================
656
657 //====================================================================
658 void vvMainWindow::OpenDicom() {
659     std::vector<std::string> files;
660
661 #ifdef CLITK_VV_USE_BDCM
662     bool r = bdcm::OpenDicomFilesSelectorDialog(files,
663              "DicomFilesSelectorDialog test",
664              0,0,800,800,1);
665
666     if (r) {
667         std::cout << "$$$$ main : user clicked 'OK' $$$$"<<std::endl;
668         std::cout << "$$$$ selected files : "<<std::endl;
669         std::vector<std::string>::iterator i;
670         for (i=files.begin();i!=files.end();++i) {
671             std::cout << *i << std::endl;
672         }
673         std::cout << "$$$$ "<<std::endl;
674
675         LoadImages(files,DICOM);
676     }
677     else {
678         std::cout << "$$$$ main : user clicked 'CANCEL' $$$$"<<std::endl;
679     }
680 #else
681     std::cout << "dicomSeriesSelector " << std::endl;
682     if (dicomSeriesSelector->exec() == QDialog::Accepted) {
683         files = *(dicomSeriesSelector->GetFilenames());
684         LoadImages(files,DICOM);
685     }
686 #endif
687
688 }
689 //====================================================================
690
691 //====================================================================
692 void vvMainWindow::OpenImages() {
693     QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
694     Extensions += ";;All Files (*)";
695
696     QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images"),mInputPathName,Extensions);
697     if (files.isEmpty())
698         return;
699     mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
700     std::vector<std::string> vector;
701     for (int i = 0; i < files.size(); i++)
702         vector.push_back(files[i].toStdString());
703     LoadImages(vector, IMAGE);
704 }
705 //====================================================================
706 void vvMainWindow::OpenRecentImage()
707 {
708     QAction * caller = qobject_cast<QAction*>(sender());
709     std::vector<std::string> images;
710     images.push_back(caller->text().toStdString());
711     mInputPathName = itksys::SystemTools::GetFilenamePath(images[0]).c_str();
712     LoadImages(images,IMAGE);
713 }
714
715 //====================================================================
716 void vvMainWindow::OpenImageWithTime() {
717     QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
718     Extensions += ";;All Files (*)";
719
720     QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images With Time"),mInputPathName,Extensions);
721     if (files.isEmpty())
722         return;
723     mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
724     std::vector<std::string> vector;
725     for (int i = 0; i < files.size(); i++)
726     {
727         vector.push_back(files[i].toStdString());
728     }
729     LoadImages(vector, IMAGEWITHTIME);
730 }
731 //====================================================================
732
733 //====================================================================
734 void vvMainWindow::LoadImages(std::vector<std::string> files, LoadedImageType filetype) {
735     //Separate the way to open images and dicoms
736     int fileSize;
737     if (filetype == IMAGE || filetype == IMAGEWITHTIME)
738         fileSize = files.size();
739     else
740         fileSize = 1;
741
742     //Only add to the list of recently opened files when a single file is opened,
743     //to avoid polluting the list of recently opened files
744     if (files.size() == 1)
745     {
746         QFileInfo finfo=tr(files[0].c_str());
747         AddToRecentlyOpenedImages(finfo.absoluteFilePath().toStdString());
748     }
749     //init the progress events
750     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
751     vvProgressDialog progress("Opening " + files[0],fileSize>1);
752     qApp->processEvents();
753
754     int numberofsuccesulreads=0;
755     //open images as 1 or multiples
756     for (int i = 0; i < fileSize; i++) {
757
758         progress.Update("Opening " + files[i]);
759         progress.SetProgress(i,fileSize);
760         qApp->processEvents();
761
762         //read the image and put it in mSlicerManagers
763         vvSlicerManager* imageManager = new vvSlicerManager(4);
764         qApp->processEvents();
765
766         bool SetImageSucceed=false;
767
768         if (filetype == IMAGE || filetype == IMAGEWITHTIME)
769             SetImageSucceed = imageManager->SetImage(files[i],filetype);
770         else
771         {
772             SetImageSucceed = imageManager->SetImages(files,filetype);
773         }
774         if (SetImageSucceed == false)
775         {
776             QApplication::restoreOverrideCursor();
777             QString error = "Cannot open file \n";
778             error += imageManager->GetLastError().c_str();
779             QMessageBox::information(this,tr("Reading problem"),error);
780             delete imageManager;
781         }
782         else
783         {
784             mSlicerManagers.push_back(imageManager);
785
786             //create an item in the tree with good settings
787             QTreeWidgetItem *item = new QTreeWidgetItem();
788             item->setData(0,Qt::UserRole,files[i].c_str());
789             QFileInfo fileinfo(imageManager->GetFileName().c_str()); //Do not show the path
790             item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
791             qApp->processEvents();
792
793             //Create the buttons for reload and close
794             qApp->processEvents();
795             QTreePushButton* cButton = new QTreePushButton;
796             cButton->setItem(item);
797             cButton->setColumn(COLUMN_CLOSE_IMAGE);
798             cButton->setToolTip(tr("close image"));
799             cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
800             connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
801                     this,SLOT(CloseImage(QTreeWidgetItem*, int)));
802
803             QTreePushButton* rButton = new QTreePushButton;
804             rButton->setItem(item);
805             rButton->setColumn(COLUMN_RELOAD_IMAGE);
806             rButton->setToolTip(tr("reload image"));
807             rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
808             connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
809                     this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
810
811             DataTree->addTopLevelItem(item);
812             DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
813             DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
814
815             //set the id of the image
816             QString id = files[i].c_str() + QString::number(mSlicerManagers.size()-1);
817             item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
818             mSlicerManagers.back()->SetId(id.toStdString());
819
820             linkPanel->addImage(imageManager->GetFileName(), id.toStdString());
821
822             connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
823                     this,SLOT(CurrentImageChanged(std::string)));
824             connect(mSlicerManagers.back(),SIGNAL(
825                         UpdatePosition(int, double, double, double, double, double, double, double)),this,
826                     SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
827             connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
828                     this, SLOT(VectorChanged(int,double,double,double, double)));
829             connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
830                     this, SLOT(OverlayChanged(int,double,double)));
831             connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
832                     this, SLOT(FusionChanged(int,double)));
833             connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
834                     this,SLOT(WindowsChanged(int, int, int)));
835             connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
836                     this,SLOT(WindowLevelChanged(double, double, int, int)));
837             connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
838                     this,SLOT(UpdateSlice(int,int)));
839             connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
840                     this,SLOT(UpdateTSlice(int, int)));
841             connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
842                     this,SLOT(UpdateSliceRange(int,int,int,int,int)));
843             connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
844                     this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
845             connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
846             InitSlicers();
847             numberofsuccesulreads++;
848         }
849     }
850     if (numberofsuccesulreads)
851     {
852         NOViewWidget->show();
853         NEViewWidget->show();
854         SOViewWidget->show();
855         SEViewWidget->show();
856         UpdateTree();
857         InitDisplay();
858         ShowLastImage();
859     }
860     QApplication::restoreOverrideCursor();
861 }
862 //====================================================================
863
864 //====================================================================
865 void vvMainWindow::UpdateTree() {
866     DataTree->resizeColumnToContents(COLUMN_TREE);
867     DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
868     DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
869     DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
870     DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
871     DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
872     DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
873     DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
874 }
875 //====================================================================
876
877 //====================================================================
878 void vvMainWindow::CurrentImageChanged(std::string id) {
879     int selected = 0;
880     for (int i = 0; i < DataTree->topLevelItemCount(); i++)
881     {
882         if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString().toStdString() == id)
883         {
884             selected = i;
885         }
886         else
887         {
888             DataTree->topLevelItem(i)->setSelected(0);
889         }
890         for (int child = 0; child < DataTree->topLevelItem(i)->childCount();child++)
891             DataTree->topLevelItem(i)->child(child)->setSelected(0);
892
893     }
894     DataTree->topLevelItem(selected)->setSelected(1);
895 }
896 //====================================================================
897
898 //====================================================================
899 void vvMainWindow::ImageInfoChanged() {
900     contextActions[7]->setEnabled(1);
901     contextActions[6]->setEnabled(1);
902     actionSave_As->setEnabled(1);
903     actionAdd_VF_to_current_Image->setEnabled(1);
904     actionAdd_fusion_image->setEnabled(1);
905     actionNorth_East_Window->setEnabled(1);
906     actionNorth_West_Window->setEnabled(1);
907     actionSouth_East_Window->setEnabled(1);
908     actionSouth_West_Window->setEnabled(1);
909     inverseButton->setEnabled(1);
910
911     goToCursorPushButton->setEnabled(1);
912
913     if (DataTree->selectedItems().size()) {
914         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
915
916         colorMapComboBox->setEnabled(1);
917         for (int i = 0; i < DataTree->topLevelItem(index)->childCount();i++)
918         {
919             if (DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "overlay" ||
920                     DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion")
921             {
922                 colorMapComboBox->setEnabled(0);
923                 break;
924             }
925         }
926
927         std::vector<double> origin;
928         std::vector<double> inputSpacing;
929         std::vector<int> inputSize;
930         std::vector<double> sizeMM;
931         int dimension=0;
932         QString pixelType;
933         QString inputSizeInBytes;
934         QString image = DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
935
936         if (mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size() > 1 || playMode == 1)
937         {
938             playButton->setEnabled(1);
939             frameRateLabel->setEnabled(1);
940             frameRateSpinBox->setEnabled(1);
941         }
942         else
943         {
944             playButton->setEnabled(0);
945             frameRateLabel->setEnabled(0);
946             frameRateSpinBox->setEnabled(0);
947         }
948
949         //read image header
950         int NPixel = 1;
951
952         if (DataTree->topLevelItem(index) == DataTree->selectedItems()[0])
953         {
954             vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
955             dimension = imageSelected->GetNumberOfDimensions();
956             origin.resize(dimension);
957             inputSpacing.resize(dimension);
958             inputSize.resize(dimension);
959             sizeMM.resize(dimension);
960             pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
961             for (int i = 0;i < dimension;i++)
962             {
963                 origin[i] = imageSelected->GetOrigin()[i];
964                 inputSpacing[i] = imageSelected->GetSpacing()[i];
965                 inputSize[i] = imageSelected->GetSize()[i];
966                 sizeMM[i] = inputSize[i]*inputSpacing[i];
967                 NPixel *= inputSize[i];
968             }
969             inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
970         }
971         else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
972         {
973             vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF();
974             dimension = imageSelected->GetNumberOfDimensions();
975             origin.resize(dimension);
976             inputSpacing.resize(dimension);
977             inputSize.resize(dimension);
978             sizeMM.resize(dimension);
979             pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsString().c_str();
980             for (int i = 0;i < dimension;i++)
981             {
982                 origin[i] = imageSelected->GetOrigin()[i];
983                 inputSpacing[i] = imageSelected->GetSpacing()[i];
984                 inputSize[i] = imageSelected->GetSize()[i];
985                 sizeMM[i] = inputSize[i]*inputSpacing[i];
986                 NPixel *= inputSize[i];
987             }
988             inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
989         }
990         else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "overlay")
991         {
992             vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay();
993             dimension = imageSelected->GetNumberOfDimensions();
994             origin.resize(dimension);
995             inputSpacing.resize(dimension);
996             inputSize.resize(dimension);
997             sizeMM.resize(dimension);
998             pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
999             for (int i = 0;i < dimension;i++)
1000             {
1001                 origin[i] = imageSelected->GetOrigin()[i];
1002                 inputSpacing[i] = imageSelected->GetSpacing()[i];
1003                 inputSize[i] = imageSelected->GetSize()[i];
1004                 sizeMM[i] = inputSize[i]*inputSpacing[i];
1005                 NPixel *= inputSize[i];
1006             }
1007             inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1008         }
1009         else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusion")
1010         {
1011             vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
1012             dimension = imageSelected->GetNumberOfDimensions();
1013             origin.resize(dimension);
1014             inputSpacing.resize(dimension);
1015             inputSize.resize(dimension);
1016             sizeMM.resize(dimension);
1017             pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1018             for (int i = 0;i < dimension;i++)
1019             {
1020                 origin[i] = imageSelected->GetOrigin()[i];
1021                 inputSpacing[i] = imageSelected->GetSpacing()[i];
1022                 inputSize[i] = imageSelected->GetSize()[i];
1023                 sizeMM[i] = inputSize[i]*inputSpacing[i];
1024                 NPixel *= inputSize[i];
1025             }
1026             inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1027         }
1028
1029         QString dim = QString::number(dimension) + " (";
1030         dim += pixelType + ")";
1031
1032         infoPanel->setFileName(image);
1033         infoPanel->setDimension(dim);
1034         infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1035         infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1036         infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1037         infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1038         infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1039
1040         landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1041                                             mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1042         landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1043         landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1044
1045         overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1046         for (int i = 0; i < 4;i++)
1047         {
1048             if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1049             {
1050                 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1051                 break;
1052             }
1053         }
1054         windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1055         levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1056         DD(mSlicerManagers[index]->GetColorMap());
1057         DD(mSlicerManagers[index]->GetPreset());
1058         presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1059         colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1060
1061         if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
1062         {
1063             overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1064             overlayPanel->getVFProperty(mSlicerManagers[index]->GetSlicer(0)->GetVFSubSampling(),
1065                                         mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
1066                                         mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
1067         }
1068         else
1069         {
1070             overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1071             overlayPanel->getVFProperty(-1,-1,-1);
1072         }
1073         if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
1074         {
1075             overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1076             overlayPanel->getOverlayProperty(mSlicerManagers[index]->GetOverlayColor());
1077         }
1078         else
1079         {
1080             overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1081             overlayPanel->getOverlayProperty(-1);
1082         }
1083         if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
1084         {
1085             overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1086             overlayPanel->getFusionProperty(mSlicerManagers[index]->GetFusionOpacity(),
1087                                             mSlicerManagers[index]->GetFusionColorMap(),
1088                                             mSlicerManagers[index]->GetFusionWindow(),
1089                                             mSlicerManagers[index]->GetFusionLevel());
1090         }
1091         else
1092         {
1093             overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1094             overlayPanel->getFusionProperty(-1, -1,-1,-1);
1095         }
1096     }
1097 }
1098 //====================================================================
1099
1100 //====================================================================
1101 void vvMainWindow::ShowDocumentation() {
1102     documentation->show();
1103 }
1104 //====================================================================
1105 void vvMainWindow::ShowHelpDialog() {
1106     help_dialog->show();
1107 }
1108 //====================================================================
1109
1110 //====================================================================
1111 void vvMainWindow::ChangeViewMode() {
1112     QListIterator<int> it0(splitter_3->sizes());
1113     QListIterator<int> it1(splitter_3->sizes());
1114     int max0 = 0;
1115     int max1 = 1;
1116     while (it0.hasNext())
1117     {
1118         max0 += it0.next();
1119     }
1120     while (it1.hasNext())
1121     {
1122         max1 += it1.next();
1123     }
1124     QList<int> size0;
1125     QList<int> size1;
1126     if (viewMode == 1)
1127     {
1128         viewMode = 0;
1129         size0.push_back(max0);
1130         size0.push_back(0);
1131         size1.push_back(max1);
1132         size1.push_back(0);
1133         splitter_3->setSizes(size0);
1134         OSplitter->setSizes(size1);
1135         DataTree->setColumnHidden(2,1);
1136         DataTree->setColumnHidden(3,1);
1137         DataTree->setColumnHidden(4,1);
1138     }
1139     else
1140     {
1141         viewMode = 1;
1142         size0.push_back(int(max0/2));
1143         size0.push_back(int(max0/2));
1144         size1.push_back(int(max1/2));
1145         size1.push_back(int(max1/2));
1146         splitter_3->setSizes(size0);
1147         OSplitter->setSizes(size1);
1148         DataTree->setColumnHidden(2,0);
1149         DataTree->setColumnHidden(3,0);
1150         DataTree->setColumnHidden(4,0);
1151     }
1152 }
1153 //====================================================================
1154
1155 //====================================================================
1156 QString vvMainWindow::GetSizeInBytes(unsigned long size) {
1157     QString result = "";// QString::number(size);
1158     //result += " bytes (";
1159     if (size > 1000000000)
1160     {
1161         size /= 1000000000;
1162         result += QString::number(size);
1163         result += "Gb";//)";
1164     }
1165     else if (size > 1000000)
1166     {
1167         size /= 1000000;
1168         result += QString::number(size);
1169         result += "Mb";//)";
1170     }
1171     else if (size > 1000)
1172     {
1173         size /= 1000;
1174         result += QString::number(size);
1175         result += "kb";//)";
1176     }
1177     return result;
1178 }
1179 //====================================================================
1180
1181 //====================================================================
1182 QString vvMainWindow::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
1183     QString result;
1184     for (unsigned int i= 0; i < vectorDouble.size(); i++)
1185     {
1186         if (i != 0)
1187             result += " ";
1188         result += QString::number(vectorDouble[i]);
1189     }
1190     return result;
1191 }
1192 //====================================================================
1193
1194 //====================================================================
1195 QString vvMainWindow::GetVectorIntAsString(std::vector<int> vectorInt) {
1196     QString result;
1197     for (unsigned int i= 0; i < vectorInt.size(); i++)
1198     {
1199         if (i != 0)
1200             result += " ";
1201         result += QString::number(vectorInt[i]);
1202     }
1203     return result;
1204 }
1205 //====================================================================
1206
1207 //====================================================================
1208 int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item) {
1209     QString id = item->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1210     for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1211     {
1212         if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString() == id)
1213             return i;
1214     }
1215     return -1;
1216 }
1217 //====================================================================
1218
1219 //====================================================================
1220 void vvMainWindow::DisplayChanged(QTreeWidgetItem *clicked_item, int column) {
1221     int index = GetSlicerIndexFromItem(clicked_item);
1222     if ( column >= COLUMN_CLOSE_IMAGE or column <= 0)
1223         return;
1224     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1225     {
1226         QTreeWidgetItem* current_row=DataTree->topLevelItem(i);
1227         if (DataTree->topLevelItem(index) == current_row)
1228         {
1229             vvSlicer* clicked_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1230             if (current_row == clicked_item) 
1231             {
1232                 //If we just activated a slicer
1233                 if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1234                 {
1235                     mSlicerManagers[i]->UpdateSlicer(column-1,clicked_item->data(column,Qt::CheckStateRole).toInt());
1236                     mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1237                     DisplaySliders(i,column-1);
1238                     std::map<std::string,int> overlay_counts;
1239                     for (int child = 0; child < current_row->childCount(); child++)
1240                     {
1241                         std::string overlay_type = 
1242                             current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1243                         overlay_counts[overlay_type]++;
1244                         current_row->child(child)->setData(column,Qt::CheckStateRole,
1245                                 current_row->data(column,Qt::CheckStateRole));
1246                         clicked_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,true);
1247                     }
1248                 }
1249                 else //We don't allow simply desactivating a slicer
1250                 {
1251                     clicked_item->setData(column,Qt::CheckStateRole,2);
1252                     return;
1253                 }
1254             }
1255             //if we clicked on the vector(or overlay) and not the image
1256             else
1257             {
1258                 if (clicked_item->data(column,Qt::CheckStateRole).toInt())
1259                 {
1260                     current_row->setData(column,Qt::CheckStateRole,2);
1261                     mSlicerManagers[i]->UpdateSlicer(column-1,2);
1262                     mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1263                     DisplaySliders(i,column-1);
1264                 }
1265                 int vis = clicked_item->data(column,Qt::CheckStateRole).toInt();
1266                 std::string overlay_type = clicked_item->data(1,Qt::UserRole).toString().toStdString();
1267                 int overlay_index=0;
1268                 for (int child = 0; child < current_row->childCount(); child++)
1269                 {
1270                     if (current_row->child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1271                         overlay_index++;
1272                     if (current_row->child(child) == clicked_item) break;
1273                 }
1274                 clicked_slicer->SetActorVisibility(
1275                         clicked_item->data(1,Qt::UserRole).toString().toStdString(), overlay_index-1,vis);
1276             }
1277         }
1278         else if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1279         {
1280             current_row->setData(column,Qt::CheckStateRole,0);
1281             mSlicerManagers[i]->UpdateSlicer(column-1,0);
1282             std::map<std::string,int> overlay_counts;
1283             for (int child = 0; child < current_row->childCount(); child++)
1284             {
1285                 std::string overlay_type = 
1286                     current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1287                 overlay_counts[overlay_type]++;
1288                 current_row->child(child)->setData(column,Qt::CheckStateRole,0);
1289                 vvSlicer * current_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1290                 current_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,false);
1291             }
1292         }
1293         //mSlicerManagers[i]->SetColorMap(-1);
1294     }
1295     mSlicerManagers[index]->GetSlicer(column-1)->Render();
1296 }
1297 //====================================================================
1298
1299 void vvMainWindow::InitSlicers()
1300 {
1301     if (mSlicerManagers.size())
1302     {
1303         mSlicerManagers.back()->GenerateDefaultLookupTable();
1304
1305         mSlicerManagers.back()->SetSlicerWindow(0,NOViewWidget->GetRenderWindow());
1306         mSlicerManagers.back()->SetSlicerWindow(1,NEViewWidget->GetRenderWindow());
1307         mSlicerManagers.back()->SetSlicerWindow(2,SOViewWidget->GetRenderWindow());
1308         mSlicerManagers.back()->SetSlicerWindow(3,SEViewWidget->GetRenderWindow());
1309     }
1310 }
1311
1312 //====================================================================
1313 void vvMainWindow::InitDisplay() {
1314     if (mSlicerManagers.size())
1315     {
1316         //BE CAREFUL : this is absolutely necessary to set the interactor style
1317         //in order to have the same style instanciation for all SlicerManagers in
1318         // a same window
1319         for (int j = 0; j < 4; j++)
1320         {
1321             vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
1322             style->SetAutoAdjustCameraClippingRange(1);
1323             bool AlreadySelected = false;
1324             for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1325             {
1326                 mSlicerManagers[i]->SetInteractorStyleNavigator(j,style);
1327
1328                 //select the image only if previous are not selected
1329                 if (DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 1)
1330                 {
1331                     mSlicerManagers[i]->UpdateSlicer(j,1);
1332                     AlreadySelected = true;
1333                 }
1334                 else if (i == DataTree->topLevelItemCount()-1 && !AlreadySelected)
1335                 {
1336                     if (DataTree->selectedItems().size() == 0)
1337                         DataTree->topLevelItem(i)->setSelected(1);
1338                     DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,2);
1339                     mSlicerManagers[i]->UpdateSlicer(j,1);
1340                     DisplaySliders(i,j);
1341                 }
1342                 else
1343                 {
1344                     DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,0);
1345                     mSlicerManagers[i]->UpdateSlicer(j,0);
1346                 }
1347             }
1348             style->Delete();
1349         }
1350     }
1351 }
1352 //====================================================================
1353
1354 //====================================================================
1355 void vvMainWindow::DisplaySliders(int slicer, int window) {
1356     int range[2];
1357     mSlicerManagers[slicer]->GetSlicer(window)->GetSliceRange(range);
1358     int position = mSlicerManagers[slicer]->GetSlicer(window)->GetSlice();
1359
1360     int tRange[2];
1361     tRange[0] = 0;
1362     tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
1363     int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetTSlice();
1364     bool showHorizontal = false;
1365     bool showVertical = false;
1366     if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1367             || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2
1368                 && mSlicerManagers[slicer]->GetType() != IMAGEWITHTIME
1369                 && mSlicerManagers[slicer]->GetType() != MERGEDWITHTIME))
1370         showVertical = true;
1371     if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1372             || mSlicerManagers[slicer]->GetType() == IMAGEWITHTIME
1373             || mSlicerManagers[slicer]->GetType() == MERGEDWITHTIME)
1374         showHorizontal = true;
1375
1376     if (showVertical)
1377         verticalSliders[window]->show();
1378     else
1379         verticalSliders[window]->hide();
1380     verticalSliders[window]->setRange(range[0],range[1]);
1381     verticalSliders[window]->setValue(position);
1382
1383     if (showHorizontal)
1384         horizontalSliders[window]->show();
1385     else
1386         horizontalSliders[window]->hide();
1387     horizontalSliders[window]->setRange(tRange[0],tRange[1]);
1388     horizontalSliders[window]->setValue(tPosition);
1389 }
1390 //====================================================================
1391
1392 //====================================================================
1393 void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column) {
1394     int index = GetSlicerIndexFromItem(item);
1395
1396     if (DataTree->topLevelItem(index) != item)
1397     {
1398         QString warning = "Do you really want to close the overlay : ";
1399         warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1400         QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
1401                            warning, 0, this);
1402         msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1403         msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1404         if (msgBox.exec() == QMessageBox::AcceptRole)
1405         {
1406             std::string overlay_type=item->data(1,Qt::UserRole).toString().toStdString();
1407             int overlay_index=0;
1408             for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1409             {
1410                 if (DataTree->topLevelItem(index)->\
1411                         child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1412                     overlay_index++;
1413                 if (DataTree->topLevelItem(index)->child(child) == item) break;
1414             }
1415             mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
1416             mSlicerManagers[index]->SetColorMap(0);
1417             DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
1418             mSlicerManagers[index]->Render();
1419         }
1420     }
1421     else if (DataTree->topLevelItemCount() <= 1)
1422     {
1423         QString warning = "Do you really want to close the image : ";
1424         warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1425         warning += "\nThis is the last image, you're about to close vv !!!";
1426         QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1427                            warning, 0, this);
1428         msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
1429         msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1430         if (msgBox.exec() == QMessageBox::AcceptRole)
1431         {
1432             this->close();
1433         }
1434     }
1435     else
1436     {
1437         QString warning = "Do you really want to close the image : ";
1438         warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1439         QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1440                            warning, 0, this);
1441         msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1442         msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1443         if (msgBox.exec() == QMessageBox::AcceptRole)
1444         {
1445             std::vector<vvSlicerManager*>::iterator Manageriter = mSlicerManagers.begin();
1446             DataTree->takeTopLevelItem(index);
1447             for (int i = 0; i < index; i++)
1448             {
1449                 Manageriter++;
1450             }
1451             linkPanel->removeImage(index);
1452             mSlicerManagers[index]->RemoveActors();
1453             delete mSlicerManagers[index];
1454             mSlicerManagers.erase(Manageriter);
1455             InitDisplay();
1456         }
1457     }
1458 }
1459 //====================================================================
1460
1461 //====================================================================
1462 void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column) {
1463     int index = GetSlicerIndexFromItem(item);
1464     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1465     if (item->data(1,Qt::UserRole).toString() == "vector")
1466         mSlicerManagers[index]->ReloadVF();
1467     else
1468         mSlicerManagers[index]->Reload();
1469     QApplication::restoreOverrideCursor();
1470 }
1471 //====================================================================
1472
1473 void vvMainWindow::CropImage()
1474 {
1475     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1476     vvCropDialog crop(mSlicerManagers,index);
1477     if(crop.exec())
1478         AddImage(crop.GetOutput(),"cropped.mhd");
1479 }
1480
1481 //====================================================================
1482 void vvMainWindow::SplitImage() {
1483     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1484     int dim = mSlicerManagers[index]->GetDimension();
1485     QString warning = "Do you really want to split the ";
1486     warning += QString::number(dim) + "D image ";
1487     warning += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString() + " into ";
1488     warning += QString::number(mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]) + " ";
1489     warning += QString::number(dim-1) + "D images.";
1490     QMessageBox msgBox(QMessageBox::Warning, tr("Split Image"),
1491                        warning, 0, this);
1492     msgBox.addButton(tr("Split"), QMessageBox::AcceptRole);
1493     msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1494     if (msgBox.exec() == QMessageBox::AcceptRole)
1495     {
1496         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1497         if (dim > 2)
1498         {
1499             std::string filename = DataTree->selectedItems()[0]->data(0,Qt::UserRole).toString().toStdString();
1500             int numberOfSlice = mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1];
1501             std::string path = itksys::SystemTools::GetFilenamePath(
1502                                    filename);
1503             path += "/";
1504             path += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString().toStdString();
1505             path += "%03d";
1506             path += itksys::SystemTools::GetFilenameLastExtension(
1507                         filename).c_str();
1508
1509             typedef itk::NumericSeriesFileNames NameGeneratorType;
1510             NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
1511             nameGenerator->SetSeriesFormat(path.c_str());
1512             nameGenerator->SetStartIndex(0);
1513             nameGenerator->SetEndIndex(numberOfSlice-1);
1514             nameGenerator->SetIncrementIndex(1);
1515
1516             for (int i = 0; i < numberOfSlice; i++)
1517             {
1518                 vvSlicerManager* imageManager = new vvSlicerManager(4);
1519                 imageManager->SetExtractedImage(nameGenerator->GetFileNames()[i],
1520                                                 mSlicerManagers[index]->GetSlicer(0)->GetImage(), i);
1521                 mSlicerManagers.push_back(imageManager);
1522
1523                 //create an item in the tree with good settings
1524                 QTreeWidgetItem *item = new QTreeWidgetItem();
1525                 item->setData(0,Qt::UserRole,nameGenerator->GetFileNames()[i].c_str());
1526                 std::string fileI = itksys::SystemTools::GetFilenameWithoutLastExtension(
1527                                         nameGenerator->GetFileNames()[i]).c_str();
1528                 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileI.c_str());
1529                 for (int j = 1; j <= 4; j++)
1530                 {
1531                     for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1532                     {
1533                         DataTree->topLevelItem(i)->setData(j,Qt::CheckStateRole,0);
1534                     }
1535                     item->setData(j,Qt::CheckStateRole,2);
1536                 }
1537
1538                 //Create the buttons for reload and close
1539                 QTreePushButton* cButton = new QTreePushButton;
1540                 cButton->setItem(item);
1541                 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1542                 cButton->setToolTip(tr("close image"));
1543                 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1544                 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1545                         this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1546
1547                 QTreePushButton* rButton = new QTreePushButton;
1548                 rButton->setItem(item);
1549                 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1550                 rButton->setToolTip(tr("reload image"));
1551                 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1552                 rButton->setEnabled(false);
1553                 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1554                         this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1555
1556                 DataTree->addTopLevelItem(item);
1557                 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1558                 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1559
1560                 //set the id of the image
1561                 QString id = nameGenerator->GetFileNames()[i].c_str() + QString::number(mSlicerManagers.size()-1);
1562                 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1563                 mSlicerManagers.back()->SetId(id.toStdString());
1564                 linkPanel->addImage(fileI, id.toStdString());
1565                 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
1566                         this,SLOT(CurrentImageChanged(std::string)));
1567                 connect(mSlicerManagers.back(),SIGNAL(
1568                             UpdatePosition(int, double, double, double, double, double, double, double)),this,
1569                         SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
1570                 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
1571                         this, SLOT(VectorChanged(int,double,double,double, double)));
1572                 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
1573                         this, SLOT(OverlayChanged(int,double,double)));
1574                 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
1575                         this, SLOT(FusionChanged(int,double)));
1576                 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
1577                         this,SLOT(WindowsChanged(int, int, int)));
1578                 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
1579                         this,SLOT(WindowLevelChanged(double, double, int, int)));
1580                 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
1581                         this,SLOT(UpdateSlice(int,int)));
1582                 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
1583                         this,SLOT(UpdateTSlice(int, int)));
1584                 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
1585                         this,SLOT(UpdateSliceRange(int,int,int,int,int)));
1586                 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
1587                         this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
1588                 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
1589                 UpdateTree();
1590                 qApp->processEvents();
1591                 InitSlicers();
1592                 InitDisplay();
1593                 qApp->processEvents();
1594             }
1595             QApplication::restoreOverrideCursor();
1596         }
1597         else
1598         {
1599             QApplication::restoreOverrideCursor();
1600             QString error = "Cannot split file (dimensions must be greater than 2) ";
1601             QMessageBox::information(this,tr("Splitting problem"),error);
1602         }
1603     }
1604 }
1605 //====================================================================
1606
1607 //====================================================================
1608 void vvMainWindow::MousePositionChanged(int visibility,double x, double y, double z, double X, double Y, double Z , double value) {
1609     infoPanel->setCurrentInfo(visibility,x,y,z,X,Y,Z,value);
1610 }
1611 //====================================================================
1612
1613 //====================================================================
1614 void vvMainWindow::VectorChanged(int visibility,double x, double y, double z, double value) {
1615     overlayPanel->getCurrentVectorInfo(visibility,x,y,z,value);
1616 }
1617 //====================================================================
1618
1619 //====================================================================
1620 void vvMainWindow::OverlayChanged(int visibility, double valueOver, double valueRef) {
1621     overlayPanel->getCurrentOverlayInfo(visibility,valueOver, valueRef);
1622 }
1623 //====================================================================
1624
1625 //====================================================================
1626 void vvMainWindow::FusionChanged(int visibility, double value) {
1627     overlayPanel->getCurrentFusionInfo(visibility,value);
1628 }
1629 //====================================================================
1630
1631 //====================================================================
1632 void vvMainWindow::WindowsChanged(int window, int view, int slice) {
1633     infoPanel->setViews(window, view, slice);
1634 }
1635 //====================================================================
1636
1637 //====================================================================
1638 void vvMainWindow::WindowLevelChanged(double window, double level,int preset,int colormap) {
1639     windowSpinBox->setValue(window);
1640     levelSpinBox->setValue(level);
1641     colorMapComboBox->setCurrentIndex(colormap);
1642     presetComboBox->setCurrentIndex(preset);
1643 }
1644 //====================================================================
1645
1646 //====================================================================
1647 void vvMainWindow::WindowLevelEdited() {
1648     presetComboBox->setCurrentIndex(6);
1649     UpdateWindowLevel();
1650 }
1651 //====================================================================
1652
1653 //====================================================================
1654 void vvMainWindow::UpdateWindowLevel() {
1655     if (DataTree->selectedItems().size())
1656     {
1657         if (presetComboBox->currentIndex() == 7) //For ventilation
1658             colorMapComboBox->setCurrentIndex(5);
1659         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1660         mSlicerManagers[index]->SetColorWindow(windowSpinBox->value());
1661         mSlicerManagers[index]->SetColorLevel(levelSpinBox->value());
1662         mSlicerManagers[index]->SetPreset(presetComboBox->currentIndex());
1663         mSlicerManagers[index]->Render();
1664     }
1665 }
1666 //====================================================================
1667
1668 //====================================================================
1669 void vvMainWindow::UpdateColorMap() {
1670     if (DataTree->selectedItems().size())
1671     {
1672         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1673         mSlicerManagers[index]->SetColorMap(colorMapComboBox->currentIndex());
1674         mSlicerManagers[index]->Render();
1675     }
1676 }
1677 //====================================================================
1678 void vvMainWindow::SwitchWindowLevel() {
1679     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1680     int window = mSlicerManagers[index]->GetColorWindow();
1681     presetComboBox->setCurrentIndex(6);
1682     windowSpinBox->setValue(-window);
1683     UpdateWindowLevel();
1684 }
1685 //====================================================================
1686
1687 //====================================================================
1688 void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps) {
1689     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1690     {
1691         if (mSlicerManagers[i]->GetId() == id)
1692         {
1693             //mSlicerManagers[i]->SetTSlice(temps);
1694             mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
1695             mSlicerManagers[i]->UpdateViews(0,slicer);
1696             break;
1697         }
1698     }
1699 }
1700 //====================================================================
1701
1702 //====================================================================
1703 void vvMainWindow::ShowContextMenu(QPoint point) {
1704     if (!DataTree->selectedItems().size())
1705     {
1706         contextActions[1]->setEnabled(0);
1707         contextActions[2]->setEnabled(0);
1708         contextActions[3]->setEnabled(0);
1709         contextActions[4]->setEnabled(0);
1710         contextActions[5]->setEnabled(0);
1711         contextActions[6]->setEnabled(0);
1712         contextActions[7]->setEnabled(0);
1713     }
1714     else
1715     {
1716         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1717         contextActions[1]->setEnabled(1);
1718         contextActions[2]->setEnabled(
1719             DataTree->itemWidget(DataTree->selectedItems()[0],
1720                                  COLUMN_RELOAD_IMAGE)->isEnabled());
1721         contextActions[3]->setEnabled(1);
1722         contextActions[5]->setEnabled(1);
1723         contextActions[6]->setEnabled(1);
1724         contextActions[7]->setEnabled(1);
1725
1726         if (mSlicerManagers[index]->GetDimension() < 3)
1727             contextActions[4]->setEnabled(0);
1728         else
1729             contextActions[4]->setEnabled(1);
1730     }
1731     contextMenu.exec(QCursor::pos());
1732 }
1733 //====================================================================
1734
1735 //====================================================================
1736 void vvMainWindow::CloseImage() {
1737     CloseImage(DataTree->selectedItems()[0],0);
1738 }
1739 //====================================================================
1740
1741 //====================================================================
1742 void vvMainWindow::ReloadImage() {
1743     ReloadImage(DataTree->selectedItems()[0],0);
1744 }
1745 //====================================================================
1746
1747 //====================================================================
1748 void vvMainWindow::SelectOverlayImage() {
1749     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1750
1751     //check if one overlay image is added
1752     for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1753         if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "overlay")
1754         {
1755             QString error = "Cannot add more than one compared image\n";
1756             error += "Please remove first ";
1757             error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1758             QMessageBox::information(this,tr("Problem adding compared image !"),error);
1759             return;
1760         }
1761
1762     QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
1763     Extensions += ";;All Files (*)";
1764     QString file = QFileDialog::getOpenFileName(this,tr("Load Overlay image"),mInputPathName,Extensions);
1765     if (!file.isEmpty())
1766         AddOverlayImage(index,file);
1767 }
1768 //====================================================================
1769
1770 //====================================================================
1771 void vvMainWindow::AddOverlayImage(int index, QString file) {
1772     mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1773     itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1774                                            file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1775     reader->SetFileName(file.toStdString().c_str());
1776     reader->ReadImageInformation();
1777     std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1778     int dimension = reader->GetNumberOfDimensions();
1779     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1780     vvProgressDialog progress("Opening " + file.toStdString());
1781     qApp->processEvents();
1782
1783     std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1784     if (mSlicerManagers[index]->SetOverlay(file.toStdString(),dimension, component))
1785     {
1786         //create an item in the tree with good settings
1787         QTreeWidgetItem *item = new QTreeWidgetItem();
1788         item->setData(0,Qt::UserRole,file.toStdString().c_str());
1789         item->setData(1,Qt::UserRole,tr("overlay"));
1790         item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1791         qApp->processEvents();
1792
1793         for (int j = 1; j <= 4; j++)
1794         {
1795             item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1796             mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("overlay",0,
1797                 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1798         }
1799
1800         //Create the buttons for reload and close
1801         qApp->processEvents();
1802         QTreePushButton* cButton = new QTreePushButton;
1803         cButton->setItem(item);
1804         cButton->setColumn(COLUMN_CLOSE_IMAGE);
1805         cButton->setToolTip(tr("close image"));
1806         cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1807         connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1808                 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1809
1810         QTreePushButton* rButton = new QTreePushButton;
1811         rButton->setItem(item);
1812         rButton->setColumn(COLUMN_RELOAD_IMAGE);
1813         rButton->setToolTip(tr("reload image"));
1814         rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1815         connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1816                 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1817
1818         DataTree->topLevelItem(index)->setExpanded(1);
1819         DataTree->topLevelItem(index)->addChild(item);
1820         DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1821         DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1822
1823         //set the id of the image
1824         QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1825         item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1826         UpdateTree();
1827         qApp->processEvents();
1828         ImageInfoChanged();
1829         QApplication::restoreOverrideCursor();
1830     }
1831     else
1832     {
1833         QApplication::restoreOverrideCursor();
1834         QString error = "Cannot import the new image.\n";
1835         error += mSlicerManagers[index]->GetLastError().c_str();
1836         QMessageBox::information(this,tr("Problem reading image !"),error);
1837     }
1838 }
1839
1840 void vvMainWindow::AddFusionImage()
1841 {
1842     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1843
1844     //check if one fusion image is added
1845     for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1846         if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion")
1847         {
1848             QString error = "Cannot add more than one fusion image\n";
1849             error += "Please remove first ";
1850             error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1851             QMessageBox::information(this,tr("Problem adding fusion image !"),error);
1852             return;
1853         }
1854
1855     QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
1856     Extensions += ";;All Files (*)";
1857     QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
1858     if (!file.isEmpty())
1859     {
1860         mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1861         itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1862                                                file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1863         reader->SetFileName(file.toStdString().c_str());
1864         reader->ReadImageInformation();
1865         std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1866         if (reader)
1867         {
1868             QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1869             vvProgressDialog progress("Opening fusion");
1870             qApp->processEvents();
1871
1872             std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1873             if (mSlicerManagers[index]->SetFusion(file.toStdString(),
1874                                                    reader->GetNumberOfDimensions(), component))
1875             {
1876                 //create an item in the tree with good settings
1877                 QTreeWidgetItem *item = new QTreeWidgetItem();
1878                 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1879                 item->setData(1,Qt::UserRole,tr("fusion"));
1880                 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1881                 qApp->processEvents();
1882
1883                 for (int j = 1; j <= 4; j++)
1884                 {
1885                     item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1886                     mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("fusion",0,
1887                         DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1888                 }
1889
1890                 //Create the buttons for reload and close
1891                 qApp->processEvents();
1892                 QTreePushButton* cButton = new QTreePushButton;
1893                 cButton->setItem(item);
1894                 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1895                 cButton->setToolTip(tr("close image"));
1896                 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1897                 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1898                         this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1899
1900                 QTreePushButton* rButton = new QTreePushButton;
1901                 rButton->setItem(item);
1902                 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1903                 rButton->setToolTip(tr("reload image"));
1904                 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1905                 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1906                         this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1907
1908                 DataTree->topLevelItem(index)->setExpanded(1);
1909                 DataTree->topLevelItem(index)->addChild(item);
1910                 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1911                 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1912
1913                 //set the id of the image
1914                 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1915                 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1916                 UpdateTree();
1917                 qApp->processEvents();
1918                 ImageInfoChanged();
1919                 QApplication::restoreOverrideCursor();
1920             }
1921             else
1922             {
1923                 QApplication::restoreOverrideCursor();
1924                 QString error = "Cannot import the new image.\n";
1925                 error += mSlicerManagers[index]->GetLastError().c_str();
1926                 QMessageBox::information(this,tr("Problem reading image !"),error);
1927             }
1928         }
1929         else
1930         {
1931             QString error = "Cannot import the new image.\n";
1932             QMessageBox::information(this,tr("Problem reading image !"),error);
1933         }
1934     }
1935 }
1936
1937
1938 void vvMainWindow::OpenField()
1939 {
1940     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1941     //check if a vector field has already been added
1942     for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1943         if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "vector")
1944         {
1945             QString error = "Cannot add more than one vector field\n";
1946             error += "Please remove first ";
1947             error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1948             QMessageBox::information(this,tr("Problem adding vector field!"),error);
1949             return;
1950         }
1951
1952     QString Extensions = "Images ( *.mhd)";
1953     Extensions += ";;Images ( *.vf)";
1954     QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
1955     if (!file.isEmpty())
1956         AddField(file,index);
1957 }
1958
1959 void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk)
1960 {
1961     //create an item in the tree with good settings
1962     QTreeWidgetItem *item = new QTreeWidgetItem();
1963     item->setData(0,Qt::UserRole,filename.toStdString().c_str());
1964     item->setData(1,Qt::UserRole,tr("vector"));
1965     item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename);
1966     qApp->processEvents();
1967
1968     for (int j = 1; j <= 4; j++)
1969     {
1970         item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1971         mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("vector",0,
1972             DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1973     }
1974
1975     //Create the buttons for reload and close
1976     qApp->processEvents();
1977     QTreePushButton* cButton = new QTreePushButton;
1978     cButton->setItem(item);
1979     cButton->setColumn(COLUMN_CLOSE_IMAGE);
1980     cButton->setToolTip(tr("close vector field"));
1981     cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1982     connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1983             this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1984
1985     QTreePushButton* rButton = new QTreePushButton;
1986     rButton->setItem(item);
1987     rButton->setColumn(COLUMN_RELOAD_IMAGE);
1988     rButton->setToolTip(tr("reload vector field"));
1989     rButton->setEnabled(from_disk);
1990     rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1991     connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1992             this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1993
1994     DataTree->topLevelItem(index)->setExpanded(1);
1995     DataTree->topLevelItem(index)->addChild(item);
1996     DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1997     DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1998
1999     //set the id of the image
2000     QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
2001     item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2002     UpdateTree();
2003     qApp->processEvents();
2004     ImageInfoChanged();
2005     QApplication::restoreOverrideCursor();
2006 }
2007
2008 void vvMainWindow::AddField(vvImage::Pointer vf,QString file,int index)
2009 {
2010     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2011     vvSlicerManager* imageManager = mSlicerManagers[index];
2012     if (imageManager->SetVF(vf,file.toStdString()))
2013     {
2014         AddFieldEntry(file,index,false);
2015     }
2016     else
2017     {
2018         QString error = "Cannot import the vector field for this image.\n";
2019         error += imageManager->GetLastError().c_str();
2020         QMessageBox::information(this,tr("Problem reading VF !"),error);
2021     }
2022     QApplication::restoreOverrideCursor();
2023 }
2024
2025 void vvMainWindow::AddField(QString file,int index)
2026 {
2027     if (QFile::exists(file))
2028     {
2029         mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
2030
2031         //init the progress events
2032         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2033         vvProgressDialog progress("Opening " + file.toStdString());
2034         qApp->processEvents();
2035
2036         //read the vector and put it in the current mSlicerManager
2037         vvSlicerManager* imageManager = mSlicerManagers[index];
2038         qApp->processEvents();
2039
2040         std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
2041         if (imageManager->SetVF(file.toStdString()))
2042         {
2043             imageManager->Render();
2044             AddFieldEntry(file,index,true);
2045         }
2046         else
2047         {
2048             QApplication::restoreOverrideCursor();
2049             QString error = "Cannot import the vector field for this image.\n";
2050             error += imageManager->GetLastError().c_str();
2051             QMessageBox::information(this,tr("Problem reading VF !"),error);
2052         }
2053     }
2054     else
2055         QMessageBox::information(this,tr("Problem reading VF !"),"File doesn't exist!");
2056
2057 }
2058 //====================================================================
2059
2060 //====================================================================
2061 void vvMainWindow::SetVFProperty(int subsampling, int scale, int log) {
2062     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2063     if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
2064     {
2065         for (int i = 0; i < 4; i++)
2066         {
2067             mSlicerManagers[index]->GetSlicer(i)->SetVFSubSampling(subsampling);
2068             mSlicerManagers[index]->GetSlicer(i)->SetVFScale(scale);
2069             if (log > 0)
2070                 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(1);
2071             else
2072                 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(0);
2073         }
2074     }
2075 }
2076 //====================================================================
2077
2078 //====================================================================
2079 void vvMainWindow::SetOverlayProperty(int color) {
2080     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2081     if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
2082     {
2083         mSlicerManagers[index]->SetOverlayColor(color);
2084         mSlicerManagers[index]->SetColorMap(0);
2085         mSlicerManagers[index]->Render();
2086     }
2087 }
2088 //====================================================================
2089
2090 //====================================================================
2091 void vvMainWindow::SetFusionProperty(int opacity, int colormap,double window, double level) {
2092     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2093     if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
2094     {
2095         mSlicerManagers[index]->SetFusionOpacity(opacity);
2096         mSlicerManagers[index]->SetFusionColorMap(colormap);
2097         mSlicerManagers[index]->SetFusionWindow(window);
2098         mSlicerManagers[index]->SetFusionLevel(level);
2099         mSlicerManagers[index]->SetColorMap(0);
2100         mSlicerManagers[index]->Render();
2101     }
2102 }
2103 //====================================================================
2104
2105 //====================================================================
2106 void vvMainWindow::SaveAs() {
2107     if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
2108     {
2109         QMessageBox::warning(this,tr("Unsupported type"),tr("Sorry, saving a vector field is unsupported for the moment"));
2110         return;
2111     }
2112
2113     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2114     int dimension = mSlicerManagers[index]->GetDimension();
2115     QStringList OutputListeFormat;
2116     OutputListeFormat.clear();
2117     if (dimension == 1)
2118     {
2119         OutputListeFormat.push_back(".mhd");
2120     }
2121     if (dimension == 2)
2122     {
2123         OutputListeFormat.push_back(".bmp");
2124         OutputListeFormat.push_back(".png");
2125         OutputListeFormat.push_back(".jpeg");
2126         OutputListeFormat.push_back(".tif");
2127         OutputListeFormat.push_back(".mhd");
2128         OutputListeFormat.push_back(".hdr");
2129         OutputListeFormat.push_back(".vox");
2130     }
2131     else if (dimension == 3)
2132     {
2133         OutputListeFormat.push_back(".mhd");
2134         OutputListeFormat.push_back(".hdr");
2135         OutputListeFormat.push_back(".vox");
2136     }
2137     else if (dimension == 4)
2138     {
2139         OutputListeFormat.push_back(".mhd");
2140     }
2141     QString Extensions = "AllFiles(*.*)";
2142     for (int i = 0; i < OutputListeFormat.count(); i++)
2143     {
2144         Extensions += ";;Images ( *";
2145         Extensions += OutputListeFormat[i];
2146         Extensions += ")";
2147     }
2148     QString fileName = QFileDialog::getSaveFileName(this,
2149                        tr("Save As"),
2150                        mSlicerManagers[index]->GetFileName().c_str(),
2151                        Extensions);
2152     if (!fileName.isEmpty())
2153     {
2154         std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
2155         if (OutputListeFormat.contains(
2156                     fileformat.c_str()))
2157         {
2158             QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2159             std::string action = "Saving";
2160             vvProgressDialog progress("Saving "+fileName.toStdString());
2161             qApp->processEvents();
2162             vvImageWriter *writer = new vvImageWriter;
2163             writer->SetOutputFileName(fileName.toStdString());
2164             writer->SetInput(mSlicerManagers[index]->GetImage());
2165             writer->Update();
2166             QApplication::restoreOverrideCursor();
2167             if (writer->GetLastError().size())
2168             {
2169                 QString error = "Saving did not succeed\n";
2170                 error += writer->GetLastError().c_str();
2171                 QMessageBox::information(this,tr("Saving Problem"),error);
2172                 SaveAs();
2173             }
2174         }
2175         else
2176         {
2177             QString error = fileformat.c_str();
2178             if (error.isEmpty())
2179                 error += "no file format specified !";
2180             else
2181                 error += " format unknown !!!\n";
2182             QMessageBox::information(this,tr("Saving Problem"),error);
2183             SaveAs();
2184         }
2185     }
2186 }
2187 //====================================================================
2188
2189 //====================================================================
2190 void vvMainWindow::AddLink(QString image1,QString image2) {
2191     for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2192     {
2193         if (image1.toStdString() == mSlicerManagers[i]->GetId())
2194         {
2195             mSlicerManagers[i]->AddLink(image2.toStdString());
2196         }
2197         if (image2.toStdString() == mSlicerManagers[i]->GetId())
2198         {
2199             mSlicerManagers[i]->AddLink(image1.toStdString());
2200         }
2201     }
2202 }
2203 //====================================================================
2204
2205 //====================================================================
2206 void vvMainWindow::RemoveLink(QString image1,QString image2) {
2207     for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2208     {
2209         if (image1.toStdString() == mSlicerManagers[i]->GetId())
2210         {
2211             mSlicerManagers[i]->RemoveLink(image2.toStdString());
2212         }
2213         if (image2.toStdString() == mSlicerManagers[i]->GetId())
2214         {
2215             mSlicerManagers[i]->RemoveLink(image1.toStdString());
2216         }
2217     }
2218 }
2219 //====================================================================
2220
2221 void vvMainWindow::HorizontalSliderMoved(int value,int column, int slicer_index)
2222 {
2223     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2224     {
2225         if (DataTree->topLevelItem(i)->data(column,Qt::CheckStateRole).toInt() > 1)
2226         {
2227             for (int j = 0; j < 4; j++)
2228             {
2229                 mSlicerManagers[i]->SetTSliceInSlicer(value,j);
2230                 //if (mSlicerManagers[i]->GetSlicer(j)->GetImageActor()->GetVisibility())
2231                     //UpdateTSlice(j,value);
2232             }
2233             mSlicerManagers[i]->GetSlicer(slicer_index)->Render();
2234             break;
2235         }
2236     }
2237 }
2238
2239 //====================================================================
2240 void vvMainWindow::NOHorizontalSliderMoved() {
2241     HorizontalSliderMoved(NOHorizontalSlider->value(),COLUMN_UL_VIEW,0);
2242 }
2243 //====================================================================
2244
2245 //====================================================================
2246 void vvMainWindow::NEHorizontalSliderMoved() {
2247     HorizontalSliderMoved(NEHorizontalSlider->value(),COLUMN_UR_VIEW,1);
2248 }
2249 //====================================================================
2250
2251 //====================================================================
2252 void vvMainWindow::SOHorizontalSliderMoved() {
2253     HorizontalSliderMoved(SOHorizontalSlider->value(),COLUMN_DL_VIEW,2);
2254 }
2255 //====================================================================
2256
2257 //====================================================================
2258 void vvMainWindow::SEHorizontalSliderMoved() {
2259     HorizontalSliderMoved(SEHorizontalSlider->value(),COLUMN_DR_VIEW,3);
2260 }
2261 //====================================================================
2262
2263 //====================================================================
2264 void vvMainWindow::NOVerticalSliderChanged() {
2265     int value = NOVerticalSlider->value();
2266     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2267     {
2268         if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
2269         {
2270             mSlicerManagers[i]->GetSlicer(0)->SetSlice(value);
2271             break;
2272         }
2273     }
2274 }
2275 //====================================================================
2276
2277 //====================================================================
2278 void vvMainWindow::NEVerticalSliderChanged() {
2279     int value = NEVerticalSlider->value();
2280     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2281     {
2282         if (DataTree->topLevelItem(i)->data(COLUMN_UR_VIEW,Qt::CheckStateRole).toInt() > 1)
2283         {
2284             mSlicerManagers[i]->GetSlicer(1)->SetSlice(value);
2285             break;
2286         }
2287     }
2288 }
2289 //====================================================================
2290
2291 //====================================================================
2292 void vvMainWindow::SOVerticalSliderChanged() {
2293     int value = SOVerticalSlider->value();
2294     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2295     {
2296         if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
2297         {
2298             mSlicerManagers[i]->GetSlicer(2)->SetSlice(value);
2299             break;
2300         }
2301     }
2302 }
2303 //====================================================================
2304
2305 //====================================================================
2306 void vvMainWindow::SEVerticalSliderChanged() {
2307     int value = SEVerticalSlider->value();
2308     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2309     {
2310         if (DataTree->topLevelItem(i)->data(COLUMN_DR_VIEW,Qt::CheckStateRole).toInt() > 1)
2311         {
2312             mSlicerManagers[i]->GetSlicer(3)->SetSlice(value);
2313             break;
2314         }
2315     }
2316 }
2317 //====================================================================
2318
2319 //====================================================================
2320 void vvMainWindow::UpdateSlice(int slicer, int slice) {
2321     if (slicer == 0)
2322         NOVerticalSlider->setValue(slice);
2323     else if (slicer == 1)
2324         NEVerticalSlider->setValue(slice);
2325     else if (slicer == 2)
2326         SOVerticalSlider->setValue(slice);
2327     else if (slicer == 3)
2328         SEVerticalSlider->setValue(slice);
2329 }
2330 //====================================================================
2331
2332 //====================================================================
2333 void vvMainWindow::UpdateTSlice(int slicer, int slice) {
2334     switch (slicer)
2335     {
2336     case 0:
2337         NOHorizontalSlider->setValue(slice);
2338         break;
2339     case 1:
2340         NEHorizontalSlider->setValue(slice);
2341         break;
2342     case 2:
2343         SOHorizontalSlider->setValue(slice);
2344         break;
2345     case 3:
2346         SEHorizontalSlider->setValue(slice);
2347         break;
2348     }
2349 }
2350 //====================================================================
2351
2352 //====================================================================
2353 void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax) {
2354     int position = int((min+max)/2);
2355     int tPosition = int((tmin+tmax)/2);
2356     if (slicer == 0)
2357     {
2358         NOVerticalSlider->setValue(position);
2359         NOVerticalSlider->setRange(min,max);
2360         NOHorizontalSlider->setRange(tmin,tmax);
2361         NOHorizontalSlider->setValue(tPosition);
2362     }
2363     else if (slicer == 1)
2364     {
2365         NEVerticalSlider->setValue(position);
2366         NEVerticalSlider->setRange(min,max);
2367         NEHorizontalSlider->setRange(tmin,tmax);
2368         NEHorizontalSlider->setValue(tPosition);
2369     }
2370     else if (slicer == 2)
2371     {
2372         SOVerticalSlider->setValue(position);
2373         SOVerticalSlider->setRange(min,max);
2374         SOHorizontalSlider->setRange(tmin,tmax);
2375         SOHorizontalSlider->setValue(tPosition);
2376     }
2377     else if (slicer == 3)
2378     {
2379         SEVerticalSlider->setValue(position);
2380         SEVerticalSlider->setRange(min,max);
2381         SEHorizontalSlider->setRange(tmin,tmax);
2382         SEHorizontalSlider->setValue(tPosition);
2383     }
2384 }
2385 //====================================================================
2386
2387 //====================================================================
2388 void vvMainWindow::SaveNOScreenshot() {
2389     vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2390     w2i->SetInput(NOViewWidget->GetRenderWindow());
2391     w2i->Update();
2392     SaveScreenshot(w2i->GetOutput());
2393     w2i->Delete();
2394 }
2395 //====================================================================
2396
2397 //====================================================================
2398 void vvMainWindow::SaveNEScreenshot() {
2399     vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2400     w2i->SetInput(NEViewWidget->GetRenderWindow());
2401     w2i->Update();
2402     SaveScreenshot(w2i->GetOutput());
2403     w2i->Delete();
2404 }
2405 //====================================================================
2406
2407 //====================================================================
2408 void vvMainWindow::SaveSOScreenshot() {
2409     vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2410     w2i->SetInput(SOViewWidget->GetRenderWindow());
2411     w2i->Update();
2412     SaveScreenshot(w2i->GetOutput());
2413     w2i->Delete();
2414 }
2415 //====================================================================
2416
2417 //====================================================================
2418 void vvMainWindow::SaveSEScreenshot() {
2419     vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2420     w2i->SetInput(SEViewWidget->GetRenderWindow());
2421     w2i->Update();
2422     SaveScreenshot(w2i->GetOutput());
2423     w2i->Delete();
2424 }
2425 //====================================================================
2426
2427 //====================================================================
2428 void vvMainWindow::SaveScreenshot(vtkImageData* image) {
2429     QString Extensions = "Images( *.png);;";
2430     Extensions += "Images( *.jpg);;";
2431     Extensions += "Images( *.bmp);;";
2432     Extensions += "Images( *.tif);;";
2433     Extensions += "Images( *.ppm)";
2434     QString fileName = QFileDialog::getSaveFileName(this,
2435                        tr("Save As"),
2436                        itksys::SystemTools::GetFilenamePath(
2437                            mSlicerManagers[0]->GetFileName()).c_str(),
2438                        Extensions);
2439     if (!fileName.isEmpty())
2440     {
2441         const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4;
2442         if (!strcmp(ext, ".bmp"))
2443         {
2444             vtkBMPWriter *bmp = vtkBMPWriter::New();
2445             bmp->SetInput(image);
2446             bmp->SetFileName(fileName.toStdString().c_str());
2447             bmp->Write();
2448             bmp->Delete();
2449         }
2450         else if (!strcmp(ext, ".tif"))
2451         {
2452             vtkTIFFWriter *tif = vtkTIFFWriter::New();
2453             tif->SetInput(image);
2454             tif->SetFileName(fileName.toStdString().c_str());
2455             tif->Write();
2456             tif->Delete();
2457         }
2458         else if (!strcmp(ext, ".ppm"))
2459         {
2460             vtkPNMWriter *pnm = vtkPNMWriter::New();
2461             pnm->SetInput(image);
2462             pnm->SetFileName(fileName.toStdString().c_str());
2463             pnm->Write();
2464             pnm->Delete();
2465         }
2466         else if (!strcmp(ext, ".png"))
2467         {
2468             vtkPNGWriter *png = vtkPNGWriter::New();
2469             png->SetInput(image);
2470             png->SetFileName(fileName.toStdString().c_str());
2471             png->Write();
2472             png->Delete();
2473         }
2474         else if (!strcmp(ext, ".jpg"))
2475         {
2476             vtkJPEGWriter *jpg = vtkJPEGWriter::New();
2477             jpg->SetInput(image);
2478             jpg->SetFileName(fileName.toStdString().c_str());
2479             jpg->Write();
2480             jpg->Delete();
2481         }
2482         else
2483         {
2484             QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!"));
2485         }
2486     }
2487
2488 }
2489 //====================================================================
2490
2491 //====================================================================
2492 void vvMainWindow::GoToCursor() {
2493     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2494     for (int column = 1; column < 5; column++)
2495     {
2496         if (DataTree->selectedItems()[0]->data(column,Qt::CheckStateRole).toInt() > 1)
2497         {
2498             double* cursorPos = mSlicerManagers[index]->GetSlicer(column-1)->GetCursorPosition();
2499             mSlicerManagers[index]->GetSlicer(column-1)->SetCurrentPosition(
2500                 cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]);
2501             mSlicerManagers[index]->UpdateViews(1,column-1);
2502             mSlicerManagers[index]->UpdateLinked(column-1);
2503             break;
2504         }
2505     }
2506 }
2507 //====================================================================
2508
2509 //====================================================================
2510 void vvMainWindow::PlayPause() {
2511     if (playMode)
2512     {
2513         playMode = 0;
2514         playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_play.png")));
2515         ImageInfoChanged();
2516         return;
2517     }
2518     else
2519     {
2520         int image_number=DataTree->topLevelItemCount();
2521         bool has_temporal;
2522         for (int i=0;i<image_number;i++)
2523             if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1)
2524             {
2525                 has_temporal=true;
2526                 break;
2527             }
2528         if (has_temporal)
2529         {
2530             playMode = 1;
2531             playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_pause.png")));
2532             QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2533         }
2534     }
2535 }
2536 //====================================================================
2537
2538 //====================================================================
2539 void vvMainWindow::PlayNext() {
2540     if (playMode && !this->isHidden())
2541     {
2542         int image_number=DataTree->topLevelItemCount();
2543         ///Only play one slicer per SM, and only if the SM is being displayed
2544         for (int i=0;i<image_number;i++)
2545             for (int j=0;j<4;j++)
2546                 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1 and
2547                         DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0)
2548                 {
2549                     mSlicerManagers[i]->SetNextTSlice(j);
2550                     break;
2551                 }
2552         QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2553     }
2554 }
2555 //====================================================================
2556
2557 void vvMainWindow::ShowLastImage()
2558 {
2559     if (mSlicerManagers.size() > 1)
2560     {
2561         QTreeWidgetItem * item=DataTree->topLevelItem(DataTree->topLevelItemCount()-1);
2562         CurrentImageChanged(mSlicerManagers.back()->GetId()); //select new image
2563         item->setData(1,Qt::CheckStateRole,2); //show the new image in the first panel
2564         DisplayChanged(item,1);
2565     }
2566 }
2567
2568 //====================================================================
2569 void vvMainWindow::UpdateRenderWindows() {
2570     if (NOViewWidget->GetRenderWindow()) NOViewWidget->GetRenderWindow()->Render();
2571     if (NEViewWidget->GetRenderWindow()) NEViewWidget->GetRenderWindow()->Render();
2572     if (SOViewWidget->GetRenderWindow()) SOViewWidget->GetRenderWindow()->Render();
2573     if (SEViewWidget->GetRenderWindow()) SEViewWidget->GetRenderWindow()->Render();
2574 }
2575 //====================================================================
2576
2577 //====================================================================
2578 void vvMainWindow::ResampleCurrentImage() {
2579     vvResamplerDialog resampler;
2580     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2581     resampler.SetSlicerManagers(mSlicerManagers,index);
2582     if (resampler.exec()) 
2583         AddImage(resampler.GetOutput(),resampler.GetOutputFileName());
2584 }
2585 //====================================================================
2586
2587 //====================================================================
2588 void vvMainWindow::SegmentationOnCurrentImage() {
2589     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2590
2591     vvSegmentationDialog segmentation;
2592     segmentation.SetImage(mSlicerManagers[index]->GetSlicer(0)->GetImage());
2593     segmentation.exec();
2594 }
2595 //====================================================================
2596
2597 void vvMainWindow::SurfaceViewerLaunch()
2598 {
2599     vvSurfaceViewerDialog surfaceViewer;
2600     surfaceViewer.exec();
2601 }
2602
2603 //====================================================================
2604 void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
2605 {
2606     vvSlicerManager* m = new vvSlicerManager(4);
2607     m->SetImage(image);
2608     m->SetFilename(filename);
2609     AddImage(m);
2610 }
2611
2612 //====================================================================
2613 void vvMainWindow::AddImage(vvSlicerManager * slicer_manager) {
2614     mSlicerManagers.push_back(slicer_manager);
2615
2616     std::string filename = slicer_manager->GetFileName();
2617
2618     //create an item in the tree with good settings
2619     QTreeWidgetItem *item = new QTreeWidgetItem();
2620     item->setData(0,Qt::UserRole,slicer_manager->GetFileName().c_str());//files[i].c_str());
2621     item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
2622     qApp->processEvents();
2623
2624     for (int j = 1; j <= 4; j++) item->setData(j,Qt::CheckStateRole,1);
2625
2626     //Create the buttons for reload and close
2627     qApp->processEvents();
2628     QTreePushButton* cButton = new QTreePushButton;
2629     cButton->setItem(item);
2630     cButton->setColumn(COLUMN_CLOSE_IMAGE);
2631     cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2632     connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2633             this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2634
2635     QTreePushButton* rButton = new QTreePushButton;
2636     rButton->setItem(item);
2637     rButton->setColumn(COLUMN_RELOAD_IMAGE);
2638     rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2639     rButton->setEnabled(0);
2640     connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2641             this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2642
2643     DataTree->addTopLevelItem(item);
2644     DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2645     DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2646
2647     //set the id of the image
2648     QString id = slicer_manager->GetFileName().c_str() + QString::number(mSlicerManagers.size()-1);
2649     item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2650     mSlicerManagers.back()->SetId(id.toStdString());
2651
2652     linkPanel->addImage(filename, id.toStdString());
2653
2654     connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
2655             this,SLOT(CurrentImageChanged(std::string)));
2656     connect(mSlicerManagers.back(),SIGNAL(
2657                 UpdatePosition(int, double, double, double, double, double, double, double)),this,
2658             SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
2659     connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
2660             this, SLOT(VectorChanged(int,double,double,double, double)));
2661     connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
2662             this, SLOT(OverlayChanged(int,double,double)));
2663     connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
2664             this, SLOT(FusionChanged(int,double)));
2665     connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
2666             this,SLOT(WindowsChanged(int, int, int)));
2667     connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
2668             this,SLOT(WindowLevelChanged(double, double, int, int)));
2669     connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
2670             this,SLOT(UpdateSlice(int,int)));
2671     connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
2672             this,SLOT(UpdateTSlice(int, int)));
2673     connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
2674             this,SLOT(UpdateSliceRange(int,int,int,int,int)));
2675     connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
2676             this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
2677     connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
2678     UpdateTree();
2679     qApp->processEvents();
2680     InitSlicers();
2681     ShowLastImage();
2682     InitDisplay();
2683     qApp->processEvents();
2684
2685 }
2686 //====================================================================