]> Creatis software - clitk.git/blob - vv/vvMainWindow.cxx
WIP on overlay
[clitk.git] / vv / vvMainWindow.cxx
1 /*=========================================================================
2
3 Program:   vv
4 Module:    $RCSfile: vvMainWindow.cxx,v $
5 Language:  C++
6 Date:      $Date: 2010/01/26 15:04:33 $
7 Version:   $Revision: 1.2 $
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         presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1057         colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1058
1059         if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
1060         {
1061             overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1062             overlayPanel->getVFProperty(mSlicerManagers[index]->GetSlicer(0)->GetVFSubSampling(),
1063                                         mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
1064                                         mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
1065         }
1066         else
1067         {
1068             overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1069             overlayPanel->getVFProperty(-1,-1,-1);
1070         }
1071         if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
1072         {
1073             overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1074             overlayPanel->getOverlayProperty(mSlicerManagers[index]->GetOverlayColor());
1075         }
1076         else
1077         {
1078             overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1079             overlayPanel->getOverlayProperty(-1);
1080         }
1081         if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
1082         {
1083             overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1084             overlayPanel->getFusionProperty(mSlicerManagers[index]->GetFusionOpacity(),
1085                                             mSlicerManagers[index]->GetFusionColorMap(),
1086                                             mSlicerManagers[index]->GetFusionWindow(),
1087                                             mSlicerManagers[index]->GetFusionLevel());
1088         }
1089         else
1090         {
1091             overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1092             overlayPanel->getFusionProperty(-1, -1,-1,-1);
1093         }
1094     }
1095 }
1096 //====================================================================
1097
1098 //====================================================================
1099 void vvMainWindow::ShowDocumentation() {
1100     documentation->show();
1101 }
1102 //====================================================================
1103 void vvMainWindow::ShowHelpDialog() {
1104     help_dialog->show();
1105 }
1106 //====================================================================
1107
1108 //====================================================================
1109 void vvMainWindow::ChangeViewMode() {
1110     QListIterator<int> it0(splitter_3->sizes());
1111     QListIterator<int> it1(splitter_3->sizes());
1112     int max0 = 0;
1113     int max1 = 1;
1114     while (it0.hasNext())
1115     {
1116         max0 += it0.next();
1117     }
1118     while (it1.hasNext())
1119     {
1120         max1 += it1.next();
1121     }
1122     QList<int> size0;
1123     QList<int> size1;
1124     if (viewMode == 1)
1125     {
1126         viewMode = 0;
1127         size0.push_back(max0);
1128         size0.push_back(0);
1129         size1.push_back(max1);
1130         size1.push_back(0);
1131         splitter_3->setSizes(size0);
1132         OSplitter->setSizes(size1);
1133         DataTree->setColumnHidden(2,1);
1134         DataTree->setColumnHidden(3,1);
1135         DataTree->setColumnHidden(4,1);
1136     }
1137     else
1138     {
1139         viewMode = 1;
1140         size0.push_back(int(max0/2));
1141         size0.push_back(int(max0/2));
1142         size1.push_back(int(max1/2));
1143         size1.push_back(int(max1/2));
1144         splitter_3->setSizes(size0);
1145         OSplitter->setSizes(size1);
1146         DataTree->setColumnHidden(2,0);
1147         DataTree->setColumnHidden(3,0);
1148         DataTree->setColumnHidden(4,0);
1149     }
1150 }
1151 //====================================================================
1152
1153 //====================================================================
1154 QString vvMainWindow::GetSizeInBytes(unsigned long size) {
1155     QString result = "";// QString::number(size);
1156     //result += " bytes (";
1157     if (size > 1000000000)
1158     {
1159         size /= 1000000000;
1160         result += QString::number(size);
1161         result += "Gb";//)";
1162     }
1163     else if (size > 1000000)
1164     {
1165         size /= 1000000;
1166         result += QString::number(size);
1167         result += "Mb";//)";
1168     }
1169     else if (size > 1000)
1170     {
1171         size /= 1000;
1172         result += QString::number(size);
1173         result += "kb";//)";
1174     }
1175     return result;
1176 }
1177 //====================================================================
1178
1179 //====================================================================
1180 QString vvMainWindow::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
1181     QString result;
1182     for (unsigned int i= 0; i < vectorDouble.size(); i++)
1183     {
1184         if (i != 0)
1185             result += " ";
1186         result += QString::number(vectorDouble[i]);
1187     }
1188     return result;
1189 }
1190 //====================================================================
1191
1192 //====================================================================
1193 QString vvMainWindow::GetVectorIntAsString(std::vector<int> vectorInt) {
1194     QString result;
1195     for (unsigned int i= 0; i < vectorInt.size(); i++)
1196     {
1197         if (i != 0)
1198             result += " ";
1199         result += QString::number(vectorInt[i]);
1200     }
1201     return result;
1202 }
1203 //====================================================================
1204
1205 //====================================================================
1206 int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item) {
1207     QString id = item->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1208     for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1209     {
1210         if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString() == id)
1211             return i;
1212     }
1213     return -1;
1214 }
1215 //====================================================================
1216
1217 //====================================================================
1218 void vvMainWindow::DisplayChanged(QTreeWidgetItem *clicked_item, int column) {
1219     int index = GetSlicerIndexFromItem(clicked_item);
1220     if ( column >= COLUMN_CLOSE_IMAGE or column <= 0)
1221         return;
1222     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1223     {
1224         QTreeWidgetItem* current_row=DataTree->topLevelItem(i);
1225         if (DataTree->topLevelItem(index) == current_row)
1226         {
1227             vvSlicer* clicked_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1228             if (current_row == clicked_item) 
1229             {
1230                 //If we just activated a slicer
1231                 if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1232                 {
1233                     mSlicerManagers[i]->UpdateSlicer(column-1,clicked_item->data(column,Qt::CheckStateRole).toInt());
1234                     mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1235                     DisplaySliders(i,column-1);
1236                     std::map<std::string,int> overlay_counts;
1237                     for (int child = 0; child < current_row->childCount(); child++)
1238                     {
1239                         std::string overlay_type = 
1240                             current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1241                         overlay_counts[overlay_type]++;
1242                         current_row->child(child)->setData(column,Qt::CheckStateRole,
1243                                 current_row->data(column,Qt::CheckStateRole));
1244                         clicked_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,true);
1245                     }
1246                 }
1247                 else //We don't allow simply desactivating a slicer
1248                 {
1249                     clicked_item->setData(column,Qt::CheckStateRole,2);
1250                     return;
1251                 }
1252             }
1253             //if we clicked on the vector(or overlay) and not the image
1254             else
1255             {
1256                 if (clicked_item->data(column,Qt::CheckStateRole).toInt())
1257                 {
1258                     current_row->setData(column,Qt::CheckStateRole,2);
1259                     mSlicerManagers[i]->UpdateSlicer(column-1,2);
1260                     mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1261                     DisplaySliders(i,column-1);
1262                 }
1263                 int vis = clicked_item->data(column,Qt::CheckStateRole).toInt();
1264                 std::string overlay_type = clicked_item->data(1,Qt::UserRole).toString().toStdString();
1265                 int overlay_index=0;
1266                 for (int child = 0; child < current_row->childCount(); child++)
1267                 {
1268                     if (current_row->child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1269                         overlay_index++;
1270                     if (current_row->child(child) == clicked_item) break;
1271                 }
1272                 clicked_slicer->SetActorVisibility(
1273                         clicked_item->data(1,Qt::UserRole).toString().toStdString(), overlay_index-1,vis);
1274             }
1275         }
1276         else if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1277         {
1278             current_row->setData(column,Qt::CheckStateRole,0);
1279             mSlicerManagers[i]->UpdateSlicer(column-1,0);
1280             std::map<std::string,int> overlay_counts;
1281             for (int child = 0; child < current_row->childCount(); child++)
1282             {
1283                 std::string overlay_type = 
1284                     current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1285                 overlay_counts[overlay_type]++;
1286                 current_row->child(child)->setData(column,Qt::CheckStateRole,0);
1287                 vvSlicer * current_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1288                 current_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,false);
1289             }
1290         }
1291         //mSlicerManagers[i]->SetColorMap(-1);
1292     }
1293     mSlicerManagers[index]->GetSlicer(column-1)->Render();
1294 }
1295 //====================================================================
1296
1297 void vvMainWindow::InitSlicers()
1298 {
1299     if (mSlicerManagers.size())
1300     {
1301         mSlicerManagers.back()->GenerateDefaultLookupTable();
1302
1303         mSlicerManagers.back()->SetSlicerWindow(0,NOViewWidget->GetRenderWindow());
1304         mSlicerManagers.back()->SetSlicerWindow(1,NEViewWidget->GetRenderWindow());
1305         mSlicerManagers.back()->SetSlicerWindow(2,SOViewWidget->GetRenderWindow());
1306         mSlicerManagers.back()->SetSlicerWindow(3,SEViewWidget->GetRenderWindow());
1307     }
1308 }
1309
1310 //====================================================================
1311 void vvMainWindow::InitDisplay() {
1312     if (mSlicerManagers.size())
1313     {
1314         //BE CAREFUL : this is absolutely necessary to set the interactor style
1315         //in order to have the same style instanciation for all SlicerManagers in
1316         // a same window
1317         for (int j = 0; j < 4; j++)
1318         {
1319             vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
1320             style->SetAutoAdjustCameraClippingRange(1);
1321             bool AlreadySelected = false;
1322             for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1323             {
1324                 mSlicerManagers[i]->SetInteractorStyleNavigator(j,style);
1325
1326                 //select the image only if previous are not selected
1327                 if (DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 1)
1328                 {
1329                     mSlicerManagers[i]->UpdateSlicer(j,1);
1330                     AlreadySelected = true;
1331                 }
1332                 else if (i == DataTree->topLevelItemCount()-1 && !AlreadySelected)
1333                 {
1334                     if (DataTree->selectedItems().size() == 0)
1335                         DataTree->topLevelItem(i)->setSelected(1);
1336                     DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,2);
1337                     mSlicerManagers[i]->UpdateSlicer(j,1);
1338                     DisplaySliders(i,j);
1339                 }
1340                 else
1341                 {
1342                     DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,0);
1343                     mSlicerManagers[i]->UpdateSlicer(j,0);
1344                 }
1345             }
1346             style->Delete();
1347         }
1348     }
1349 }
1350 //====================================================================
1351
1352 //====================================================================
1353 void vvMainWindow::DisplaySliders(int slicer, int window) {
1354     int range[2];
1355     mSlicerManagers[slicer]->GetSlicer(window)->GetSliceRange(range);
1356     int position = mSlicerManagers[slicer]->GetSlicer(window)->GetSlice();
1357
1358     int tRange[2];
1359     tRange[0] = 0;
1360     tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
1361     int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetTSlice();
1362     bool showHorizontal = false;
1363     bool showVertical = false;
1364     if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1365             || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2
1366                 && mSlicerManagers[slicer]->GetType() != IMAGEWITHTIME
1367                 && mSlicerManagers[slicer]->GetType() != MERGEDWITHTIME))
1368         showVertical = true;
1369     if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1370             || mSlicerManagers[slicer]->GetType() == IMAGEWITHTIME
1371             || mSlicerManagers[slicer]->GetType() == MERGEDWITHTIME)
1372         showHorizontal = true;
1373
1374     if (showVertical)
1375         verticalSliders[window]->show();
1376     else
1377         verticalSliders[window]->hide();
1378     verticalSliders[window]->setRange(range[0],range[1]);
1379     verticalSliders[window]->setValue(position);
1380
1381     if (showHorizontal)
1382         horizontalSliders[window]->show();
1383     else
1384         horizontalSliders[window]->hide();
1385     horizontalSliders[window]->setRange(tRange[0],tRange[1]);
1386     horizontalSliders[window]->setValue(tPosition);
1387 }
1388 //====================================================================
1389
1390 //====================================================================
1391 void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column) {
1392     int index = GetSlicerIndexFromItem(item);
1393
1394     if (DataTree->topLevelItem(index) != item)
1395     {
1396         QString warning = "Do you really want to close the overlay : ";
1397         warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1398         QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
1399                            warning, 0, this);
1400         msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1401         msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1402         if (msgBox.exec() == QMessageBox::AcceptRole)
1403         {
1404             std::string overlay_type=item->data(1,Qt::UserRole).toString().toStdString();
1405             int overlay_index=0;
1406             for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1407             {
1408                 if (DataTree->topLevelItem(index)->\
1409                         child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1410                     overlay_index++;
1411                 if (DataTree->topLevelItem(index)->child(child) == item) break;
1412             }
1413             mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
1414             mSlicerManagers[index]->SetColorMap(0);
1415             DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
1416             mSlicerManagers[index]->Render();
1417         }
1418     }
1419     else if (DataTree->topLevelItemCount() <= 1)
1420     {
1421         QString warning = "Do you really want to close the image : ";
1422         warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1423         warning += "\nThis is the last image, you're about to close vv !!!";
1424         QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1425                            warning, 0, this);
1426         msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
1427         msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1428         if (msgBox.exec() == QMessageBox::AcceptRole)
1429         {
1430             this->close();
1431         }
1432     }
1433     else
1434     {
1435         QString warning = "Do you really want to close the image : ";
1436         warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1437         QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1438                            warning, 0, this);
1439         msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1440         msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1441         if (msgBox.exec() == QMessageBox::AcceptRole)
1442         {
1443             std::vector<vvSlicerManager*>::iterator Manageriter = mSlicerManagers.begin();
1444             DataTree->takeTopLevelItem(index);
1445             for (int i = 0; i < index; i++)
1446             {
1447                 Manageriter++;
1448             }
1449             linkPanel->removeImage(index);
1450             mSlicerManagers[index]->RemoveActors();
1451             delete mSlicerManagers[index];
1452             mSlicerManagers.erase(Manageriter);
1453             InitDisplay();
1454         }
1455     }
1456 }
1457 //====================================================================
1458
1459 //====================================================================
1460 void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column) {
1461     int index = GetSlicerIndexFromItem(item);
1462     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1463     QString role=item->data(1,Qt::UserRole).toString();
1464     if ( role == "vector")
1465         mSlicerManagers[index]->ReloadVF();
1466     else if (role == "overlay")
1467         mSlicerManagers[index]->ReloadOverlay();
1468     else if (role == "fusion")
1469         mSlicerManagers[index]->ReloadFusion();
1470     else
1471         mSlicerManagers[index]->Reload();
1472     QApplication::restoreOverrideCursor();
1473 }
1474 //====================================================================
1475
1476 void vvMainWindow::CropImage()
1477 {
1478     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1479     vvCropDialog crop(mSlicerManagers,index);
1480     if(crop.exec())
1481         AddImage(crop.GetOutput(),"cropped.mhd");
1482 }
1483
1484 //====================================================================
1485 void vvMainWindow::SplitImage() {
1486     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1487     int dim = mSlicerManagers[index]->GetDimension();
1488     QString warning = "Do you really want to split the ";
1489     warning += QString::number(dim) + "D image ";
1490     warning += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString() + " into ";
1491     warning += QString::number(mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]) + " ";
1492     warning += QString::number(dim-1) + "D images.";
1493     QMessageBox msgBox(QMessageBox::Warning, tr("Split Image"),
1494                        warning, 0, this);
1495     msgBox.addButton(tr("Split"), QMessageBox::AcceptRole);
1496     msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1497     if (msgBox.exec() == QMessageBox::AcceptRole)
1498     {
1499         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1500         if (dim > 2)
1501         {
1502             std::string filename = DataTree->selectedItems()[0]->data(0,Qt::UserRole).toString().toStdString();
1503             int numberOfSlice = mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1];
1504             std::string path = itksys::SystemTools::GetFilenamePath(
1505                                    filename);
1506             path += "/";
1507             path += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString().toStdString();
1508             path += "%03d";
1509             path += itksys::SystemTools::GetFilenameLastExtension(
1510                         filename).c_str();
1511
1512             typedef itk::NumericSeriesFileNames NameGeneratorType;
1513             NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
1514             nameGenerator->SetSeriesFormat(path.c_str());
1515             nameGenerator->SetStartIndex(0);
1516             nameGenerator->SetEndIndex(numberOfSlice-1);
1517             nameGenerator->SetIncrementIndex(1);
1518
1519             for (int i = 0; i < numberOfSlice; i++)
1520             {
1521                 vvSlicerManager* imageManager = new vvSlicerManager(4);
1522                 imageManager->SetExtractedImage(nameGenerator->GetFileNames()[i],
1523                                                 mSlicerManagers[index]->GetSlicer(0)->GetImage(), i);
1524                 mSlicerManagers.push_back(imageManager);
1525
1526                 //create an item in the tree with good settings
1527                 QTreeWidgetItem *item = new QTreeWidgetItem();
1528                 item->setData(0,Qt::UserRole,nameGenerator->GetFileNames()[i].c_str());
1529                 std::string fileI = itksys::SystemTools::GetFilenameWithoutLastExtension(
1530                                         nameGenerator->GetFileNames()[i]).c_str();
1531                 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileI.c_str());
1532                 for (int j = 1; j <= 4; j++)
1533                 {
1534                     for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1535                     {
1536                         DataTree->topLevelItem(i)->setData(j,Qt::CheckStateRole,0);
1537                     }
1538                     item->setData(j,Qt::CheckStateRole,2);
1539                 }
1540
1541                 //Create the buttons for reload and close
1542                 QTreePushButton* cButton = new QTreePushButton;
1543                 cButton->setItem(item);
1544                 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1545                 cButton->setToolTip(tr("close image"));
1546                 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1547                 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1548                         this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1549
1550                 QTreePushButton* rButton = new QTreePushButton;
1551                 rButton->setItem(item);
1552                 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1553                 rButton->setToolTip(tr("reload image"));
1554                 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1555                 rButton->setEnabled(false);
1556                 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1557                         this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1558
1559                 DataTree->addTopLevelItem(item);
1560                 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1561                 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1562
1563                 //set the id of the image
1564                 QString id = nameGenerator->GetFileNames()[i].c_str() + QString::number(mSlicerManagers.size()-1);
1565                 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1566                 mSlicerManagers.back()->SetId(id.toStdString());
1567                 linkPanel->addImage(fileI, id.toStdString());
1568                 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
1569                         this,SLOT(CurrentImageChanged(std::string)));
1570                 connect(mSlicerManagers.back(),SIGNAL(
1571                             UpdatePosition(int, double, double, double, double, double, double, double)),this,
1572                         SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
1573                 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
1574                         this, SLOT(VectorChanged(int,double,double,double, double)));
1575                 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
1576                         this, SLOT(OverlayChanged(int,double,double)));
1577                 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
1578                         this, SLOT(FusionChanged(int,double)));
1579                 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
1580                         this,SLOT(WindowsChanged(int, int, int)));
1581                 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
1582                         this,SLOT(WindowLevelChanged(double, double, int, int)));
1583                 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
1584                         this,SLOT(UpdateSlice(int,int)));
1585                 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
1586                         this,SLOT(UpdateTSlice(int, int)));
1587                 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
1588                         this,SLOT(UpdateSliceRange(int,int,int,int,int)));
1589                 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
1590                         this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
1591                 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
1592                 UpdateTree();
1593                 qApp->processEvents();
1594                 InitSlicers();
1595                 InitDisplay();
1596                 qApp->processEvents();
1597             }
1598             QApplication::restoreOverrideCursor();
1599         }
1600         else
1601         {
1602             QApplication::restoreOverrideCursor();
1603             QString error = "Cannot split file (dimensions must be greater than 2) ";
1604             QMessageBox::information(this,tr("Splitting problem"),error);
1605         }
1606     }
1607 }
1608 //====================================================================
1609
1610 //====================================================================
1611 void vvMainWindow::MousePositionChanged(int visibility,double x, double y, double z, double X, double Y, double Z , double value) {
1612     infoPanel->setCurrentInfo(visibility,x,y,z,X,Y,Z,value);
1613 }
1614 //====================================================================
1615
1616 //====================================================================
1617 void vvMainWindow::VectorChanged(int visibility,double x, double y, double z, double value) {
1618     overlayPanel->getCurrentVectorInfo(visibility,x,y,z,value);
1619 }
1620 //====================================================================
1621
1622 //====================================================================
1623 void vvMainWindow::OverlayChanged(int visibility, double valueOver, double valueRef) {
1624     overlayPanel->getCurrentOverlayInfo(visibility,valueOver, valueRef);
1625 }
1626 //====================================================================
1627
1628 //====================================================================
1629 void vvMainWindow::FusionChanged(int visibility, double value) {
1630     overlayPanel->getCurrentFusionInfo(visibility,value);
1631 }
1632 //====================================================================
1633
1634 //====================================================================
1635 void vvMainWindow::WindowsChanged(int window, int view, int slice) {
1636     infoPanel->setViews(window, view, slice);
1637 }
1638 //====================================================================
1639
1640 //====================================================================
1641 void vvMainWindow::WindowLevelChanged(double window, double level,int preset,int colormap) {
1642     windowSpinBox->setValue(window);
1643     levelSpinBox->setValue(level);
1644     colorMapComboBox->setCurrentIndex(colormap);
1645     presetComboBox->setCurrentIndex(preset);
1646 }
1647 //====================================================================
1648
1649 //====================================================================
1650 void vvMainWindow::WindowLevelEdited() {
1651     presetComboBox->setCurrentIndex(6);
1652     UpdateWindowLevel();
1653 }
1654 //====================================================================
1655
1656 //====================================================================
1657 void vvMainWindow::UpdateWindowLevel() {
1658     if (DataTree->selectedItems().size())
1659     {
1660         if (presetComboBox->currentIndex() == 7) //For ventilation
1661             colorMapComboBox->setCurrentIndex(5);
1662         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1663         mSlicerManagers[index]->SetColorWindow(windowSpinBox->value());
1664         mSlicerManagers[index]->SetColorLevel(levelSpinBox->value());
1665         mSlicerManagers[index]->SetPreset(presetComboBox->currentIndex());
1666         mSlicerManagers[index]->Render();
1667     }
1668 }
1669 //====================================================================
1670
1671 //====================================================================
1672 void vvMainWindow::UpdateColorMap() {
1673     if (DataTree->selectedItems().size())
1674     {
1675         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1676         mSlicerManagers[index]->SetColorMap(colorMapComboBox->currentIndex());
1677         mSlicerManagers[index]->Render();
1678     }
1679 }
1680 //====================================================================
1681 void vvMainWindow::SwitchWindowLevel() {
1682     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1683     int window = mSlicerManagers[index]->GetColorWindow();
1684     presetComboBox->setCurrentIndex(6);
1685     windowSpinBox->setValue(-window);
1686     UpdateWindowLevel();
1687 }
1688 //====================================================================
1689
1690 //====================================================================
1691 void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps) {
1692     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1693     {
1694         if (mSlicerManagers[i]->GetId() == id)
1695         {
1696             //mSlicerManagers[i]->SetTSlice(temps);
1697             mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
1698             mSlicerManagers[i]->UpdateViews(0,slicer);
1699             break;
1700         }
1701     }
1702 }
1703 //====================================================================
1704
1705 //====================================================================
1706 void vvMainWindow::ShowContextMenu(QPoint point) {
1707     if (!DataTree->selectedItems().size())
1708     {
1709         contextActions[1]->setEnabled(0);
1710         contextActions[2]->setEnabled(0);
1711         contextActions[3]->setEnabled(0);
1712         contextActions[4]->setEnabled(0);
1713         contextActions[5]->setEnabled(0);
1714         contextActions[6]->setEnabled(0);
1715         contextActions[7]->setEnabled(0);
1716     }
1717     else
1718     {
1719         int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1720         contextActions[1]->setEnabled(1);
1721         contextActions[2]->setEnabled(
1722             DataTree->itemWidget(DataTree->selectedItems()[0],
1723                                  COLUMN_RELOAD_IMAGE)->isEnabled());
1724         contextActions[3]->setEnabled(1);
1725         contextActions[5]->setEnabled(1);
1726         contextActions[6]->setEnabled(1);
1727         contextActions[7]->setEnabled(1);
1728
1729         if (mSlicerManagers[index]->GetDimension() < 3)
1730             contextActions[4]->setEnabled(0);
1731         else
1732             contextActions[4]->setEnabled(1);
1733     }
1734     contextMenu.exec(QCursor::pos());
1735 }
1736 //====================================================================
1737
1738 //====================================================================
1739 void vvMainWindow::CloseImage() {
1740     CloseImage(DataTree->selectedItems()[0],0);
1741 }
1742 //====================================================================
1743
1744 //====================================================================
1745 void vvMainWindow::ReloadImage() {
1746     ReloadImage(DataTree->selectedItems()[0],0);
1747 }
1748 //====================================================================
1749
1750 //====================================================================
1751 void vvMainWindow::SelectOverlayImage() {
1752     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1753
1754     //check if one overlay image is added
1755     for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1756         if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "overlay")
1757         {
1758             QString error = "Cannot add more than one compared image\n";
1759             error += "Please remove first ";
1760             error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1761             QMessageBox::information(this,tr("Problem adding compared image !"),error);
1762             return;
1763         }
1764
1765     QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
1766     Extensions += ";;All Files (*)";
1767     QString file = QFileDialog::getOpenFileName(this,tr("Load Overlay image"),mInputPathName,Extensions);
1768     if (!file.isEmpty())
1769         AddOverlayImage(index,file);
1770 }
1771 //====================================================================
1772
1773 //====================================================================
1774 void vvMainWindow::AddOverlayImage(int index, QString file) {
1775     mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1776     itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1777                                            file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1778     reader->SetFileName(file.toStdString().c_str());
1779     reader->ReadImageInformation();
1780     std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1781     int dimension = reader->GetNumberOfDimensions();
1782     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1783     vvProgressDialog progress("Opening " + file.toStdString());
1784     qApp->processEvents();
1785
1786     std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1787     if (mSlicerManagers[index]->SetOverlay(file.toStdString(),dimension, component))
1788     {
1789         //create an item in the tree with good settings
1790         QTreeWidgetItem *item = new QTreeWidgetItem();
1791         item->setData(0,Qt::UserRole,file.toStdString().c_str());
1792         item->setData(1,Qt::UserRole,tr("overlay"));
1793         item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1794         qApp->processEvents();
1795
1796         for (int j = 1; j <= 4; j++)
1797         {
1798             item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1799             mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("overlay",0,
1800                 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1801         }
1802
1803         //Create the buttons for reload and close
1804         qApp->processEvents();
1805         QTreePushButton* cButton = new QTreePushButton;
1806         cButton->setItem(item);
1807         cButton->setColumn(COLUMN_CLOSE_IMAGE);
1808         cButton->setToolTip(tr("close image"));
1809         cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1810         connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1811                 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1812
1813         QTreePushButton* rButton = new QTreePushButton;
1814         rButton->setItem(item);
1815         rButton->setColumn(COLUMN_RELOAD_IMAGE);
1816         rButton->setToolTip(tr("reload image"));
1817         rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1818         connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1819                 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1820
1821         DataTree->topLevelItem(index)->setExpanded(1);
1822         DataTree->topLevelItem(index)->addChild(item);
1823         DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1824         DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1825
1826         //set the id of the image
1827         QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1828         item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1829         UpdateTree();
1830         qApp->processEvents();
1831         ImageInfoChanged();
1832         QApplication::restoreOverrideCursor();
1833     }
1834     else
1835     {
1836         QApplication::restoreOverrideCursor();
1837         QString error = "Cannot import the new image.\n";
1838         error += mSlicerManagers[index]->GetLastError().c_str();
1839         QMessageBox::information(this,tr("Problem reading image !"),error);
1840     }
1841 }
1842
1843 void vvMainWindow::AddFusionImage()
1844 {
1845     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1846
1847     //check if one fusion image is added
1848     for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1849         if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion")
1850         {
1851             QString error = "Cannot add more than one fusion image\n";
1852             error += "Please remove first ";
1853             error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1854             QMessageBox::information(this,tr("Problem adding fusion image !"),error);
1855             return;
1856         }
1857
1858     QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
1859     Extensions += ";;All Files (*)";
1860     QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
1861     if (!file.isEmpty())
1862     {
1863         mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1864         itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1865                                                file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1866         reader->SetFileName(file.toStdString().c_str());
1867         reader->ReadImageInformation();
1868         std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1869         if (reader)
1870         {
1871             QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1872             vvProgressDialog progress("Opening fusion");
1873             qApp->processEvents();
1874
1875             std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1876             if (mSlicerManagers[index]->SetFusion(file.toStdString(),
1877                                                    reader->GetNumberOfDimensions(), component))
1878             {
1879                 //create an item in the tree with good settings
1880                 QTreeWidgetItem *item = new QTreeWidgetItem();
1881                 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1882                 item->setData(1,Qt::UserRole,tr("fusion"));
1883                 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1884                 qApp->processEvents();
1885
1886                 for (int j = 1; j <= 4; j++)
1887                 {
1888                     item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1889                     mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("fusion",0,
1890                         DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1891                 }
1892
1893                 //Create the buttons for reload and close
1894                 qApp->processEvents();
1895                 QTreePushButton* cButton = new QTreePushButton;
1896                 cButton->setItem(item);
1897                 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1898                 cButton->setToolTip(tr("close image"));
1899                 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1900                 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1901                         this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1902
1903                 QTreePushButton* rButton = new QTreePushButton;
1904                 rButton->setItem(item);
1905                 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1906                 rButton->setToolTip(tr("reload image"));
1907                 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1908                 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1909                         this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1910
1911                 DataTree->topLevelItem(index)->setExpanded(1);
1912                 DataTree->topLevelItem(index)->addChild(item);
1913                 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1914                 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1915
1916                 //set the id of the image
1917                 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1918                 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1919                 UpdateTree();
1920                 qApp->processEvents();
1921                 ImageInfoChanged();
1922                 QApplication::restoreOverrideCursor();
1923             }
1924             else
1925             {
1926                 QApplication::restoreOverrideCursor();
1927                 QString error = "Cannot import the new image.\n";
1928                 error += mSlicerManagers[index]->GetLastError().c_str();
1929                 QMessageBox::information(this,tr("Problem reading image !"),error);
1930             }
1931         }
1932         else
1933         {
1934             QString error = "Cannot import the new image.\n";
1935             QMessageBox::information(this,tr("Problem reading image !"),error);
1936         }
1937     }
1938 }
1939
1940
1941 void vvMainWindow::OpenField()
1942 {
1943     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1944     //check if a vector field has already been added
1945     for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1946         if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "vector")
1947         {
1948             QString error = "Cannot add more than one vector field\n";
1949             error += "Please remove first ";
1950             error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1951             QMessageBox::information(this,tr("Problem adding vector field!"),error);
1952             return;
1953         }
1954
1955     QString Extensions = "Images ( *.mhd)";
1956     Extensions += ";;Images ( *.vf)";
1957     QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
1958     if (!file.isEmpty())
1959         AddField(file,index);
1960 }
1961
1962 void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk)
1963 {
1964     //create an item in the tree with good settings
1965     QTreeWidgetItem *item = new QTreeWidgetItem();
1966     item->setData(0,Qt::UserRole,filename.toStdString().c_str());
1967     item->setData(1,Qt::UserRole,tr("vector"));
1968     item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename);
1969     qApp->processEvents();
1970
1971     for (int j = 1; j <= 4; j++)
1972     {
1973         item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1974         mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("vector",0,
1975             DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1976     }
1977
1978     //Create the buttons for reload and close
1979     qApp->processEvents();
1980     QTreePushButton* cButton = new QTreePushButton;
1981     cButton->setItem(item);
1982     cButton->setColumn(COLUMN_CLOSE_IMAGE);
1983     cButton->setToolTip(tr("close vector field"));
1984     cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1985     connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1986             this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1987
1988     QTreePushButton* rButton = new QTreePushButton;
1989     rButton->setItem(item);
1990     rButton->setColumn(COLUMN_RELOAD_IMAGE);
1991     rButton->setToolTip(tr("reload vector field"));
1992     rButton->setEnabled(from_disk);
1993     rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1994     connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1995             this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1996
1997     DataTree->topLevelItem(index)->setExpanded(1);
1998     DataTree->topLevelItem(index)->addChild(item);
1999     DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2000     DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2001
2002     //set the id of the image
2003     QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
2004     item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2005     UpdateTree();
2006     qApp->processEvents();
2007     ImageInfoChanged();
2008     QApplication::restoreOverrideCursor();
2009 }
2010
2011 void vvMainWindow::AddField(vvImage::Pointer vf,QString file,int index)
2012 {
2013     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2014     vvSlicerManager* imageManager = mSlicerManagers[index];
2015     if (imageManager->SetVF(vf,file.toStdString()))
2016     {
2017         AddFieldEntry(file,index,false);
2018     }
2019     else
2020     {
2021         QString error = "Cannot import the vector field for this image.\n";
2022         error += imageManager->GetLastError().c_str();
2023         QMessageBox::information(this,tr("Problem reading VF !"),error);
2024     }
2025     QApplication::restoreOverrideCursor();
2026 }
2027
2028 void vvMainWindow::AddField(QString file,int index)
2029 {
2030     if (QFile::exists(file))
2031     {
2032         mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
2033
2034         //init the progress events
2035         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2036         vvProgressDialog progress("Opening " + file.toStdString());
2037         qApp->processEvents();
2038
2039         //read the vector and put it in the current mSlicerManager
2040         vvSlicerManager* imageManager = mSlicerManagers[index];
2041         qApp->processEvents();
2042
2043         std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
2044         if (imageManager->SetVF(file.toStdString()))
2045         {
2046             imageManager->Render();
2047             AddFieldEntry(file,index,true);
2048         }
2049         else
2050         {
2051             QApplication::restoreOverrideCursor();
2052             QString error = "Cannot import the vector field for this image.\n";
2053             error += imageManager->GetLastError().c_str();
2054             QMessageBox::information(this,tr("Problem reading VF !"),error);
2055         }
2056     }
2057     else
2058         QMessageBox::information(this,tr("Problem reading VF !"),"File doesn't exist!");
2059
2060 }
2061 //====================================================================
2062
2063 //====================================================================
2064 void vvMainWindow::SetVFProperty(int subsampling, int scale, int log) {
2065     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2066     if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
2067     {
2068         for (int i = 0; i < 4; i++)
2069         {
2070             mSlicerManagers[index]->GetSlicer(i)->SetVFSubSampling(subsampling);
2071             mSlicerManagers[index]->GetSlicer(i)->SetVFScale(scale);
2072             if (log > 0)
2073                 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(1);
2074             else
2075                 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(0);
2076         }
2077     }
2078 }
2079 //====================================================================
2080
2081 //====================================================================
2082 void vvMainWindow::SetOverlayProperty(int color) {
2083     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2084     if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
2085     {
2086         mSlicerManagers[index]->SetOverlayColor(color);
2087         mSlicerManagers[index]->SetColorMap(0);
2088         mSlicerManagers[index]->Render();
2089     }
2090 }
2091 //====================================================================
2092
2093 //====================================================================
2094 void vvMainWindow::SetFusionProperty(int opacity, int colormap,double window, double level) {
2095     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2096     if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
2097     {
2098         mSlicerManagers[index]->SetFusionOpacity(opacity);
2099         mSlicerManagers[index]->SetFusionColorMap(colormap);
2100         mSlicerManagers[index]->SetFusionWindow(window);
2101         mSlicerManagers[index]->SetFusionLevel(level);
2102         mSlicerManagers[index]->SetColorMap(0);
2103         mSlicerManagers[index]->Render();
2104     }
2105 }
2106 //====================================================================
2107
2108 //====================================================================
2109 void vvMainWindow::SaveAs() {
2110     if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
2111     {
2112         QMessageBox::warning(this,tr("Unsupported type"),tr("Sorry, saving a vector field is unsupported for the moment"));
2113         return;
2114     }
2115
2116     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2117     int dimension = mSlicerManagers[index]->GetDimension();
2118     QStringList OutputListeFormat;
2119     OutputListeFormat.clear();
2120     if (dimension == 1)
2121     {
2122         OutputListeFormat.push_back(".mhd");
2123     }
2124     if (dimension == 2)
2125     {
2126         OutputListeFormat.push_back(".bmp");
2127         OutputListeFormat.push_back(".png");
2128         OutputListeFormat.push_back(".jpeg");
2129         OutputListeFormat.push_back(".tif");
2130         OutputListeFormat.push_back(".mhd");
2131         OutputListeFormat.push_back(".hdr");
2132         OutputListeFormat.push_back(".vox");
2133     }
2134     else if (dimension == 3)
2135     {
2136         OutputListeFormat.push_back(".mhd");
2137         OutputListeFormat.push_back(".hdr");
2138         OutputListeFormat.push_back(".vox");
2139     }
2140     else if (dimension == 4)
2141     {
2142         OutputListeFormat.push_back(".mhd");
2143     }
2144     QString Extensions = "AllFiles(*.*)";
2145     for (int i = 0; i < OutputListeFormat.count(); i++)
2146     {
2147         Extensions += ";;Images ( *";
2148         Extensions += OutputListeFormat[i];
2149         Extensions += ")";
2150     }
2151     QString fileName = QFileDialog::getSaveFileName(this,
2152                        tr("Save As"),
2153                        mSlicerManagers[index]->GetFileName().c_str(),
2154                        Extensions);
2155     if (!fileName.isEmpty())
2156     {
2157         std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
2158         if (OutputListeFormat.contains(
2159                     fileformat.c_str()))
2160         {
2161             QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2162             std::string action = "Saving";
2163             vvProgressDialog progress("Saving "+fileName.toStdString());
2164             qApp->processEvents();
2165             vvImageWriter *writer = new vvImageWriter;
2166             writer->SetOutputFileName(fileName.toStdString());
2167             writer->SetInput(mSlicerManagers[index]->GetImage());
2168             writer->Update();
2169             QApplication::restoreOverrideCursor();
2170             if (writer->GetLastError().size())
2171             {
2172                 QString error = "Saving did not succeed\n";
2173                 error += writer->GetLastError().c_str();
2174                 QMessageBox::information(this,tr("Saving Problem"),error);
2175                 SaveAs();
2176             }
2177         }
2178         else
2179         {
2180             QString error = fileformat.c_str();
2181             if (error.isEmpty())
2182                 error += "no file format specified !";
2183             else
2184                 error += " format unknown !!!\n";
2185             QMessageBox::information(this,tr("Saving Problem"),error);
2186             SaveAs();
2187         }
2188     }
2189 }
2190 //====================================================================
2191
2192 //====================================================================
2193 void vvMainWindow::AddLink(QString image1,QString image2) {
2194     for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2195     {
2196         if (image1.toStdString() == mSlicerManagers[i]->GetId())
2197         {
2198             mSlicerManagers[i]->AddLink(image2.toStdString());
2199         }
2200         if (image2.toStdString() == mSlicerManagers[i]->GetId())
2201         {
2202             mSlicerManagers[i]->AddLink(image1.toStdString());
2203         }
2204     }
2205 }
2206 //====================================================================
2207
2208 //====================================================================
2209 void vvMainWindow::RemoveLink(QString image1,QString image2) {
2210     for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2211     {
2212         if (image1.toStdString() == mSlicerManagers[i]->GetId())
2213         {
2214             mSlicerManagers[i]->RemoveLink(image2.toStdString());
2215         }
2216         if (image2.toStdString() == mSlicerManagers[i]->GetId())
2217         {
2218             mSlicerManagers[i]->RemoveLink(image1.toStdString());
2219         }
2220     }
2221 }
2222 //====================================================================
2223
2224 void vvMainWindow::HorizontalSliderMoved(int value,int column, int slicer_index)
2225 {
2226     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2227     {
2228         if (DataTree->topLevelItem(i)->data(column,Qt::CheckStateRole).toInt() > 1)
2229         {
2230             for (int j = 0; j < 4; j++)
2231             {
2232                 mSlicerManagers[i]->SetTSliceInSlicer(value,j);
2233                 //if (mSlicerManagers[i]->GetSlicer(j)->GetImageActor()->GetVisibility())
2234                     //UpdateTSlice(j,value);
2235             }
2236             mSlicerManagers[i]->GetSlicer(slicer_index)->Render();
2237             break;
2238         }
2239     }
2240 }
2241
2242 //====================================================================
2243 void vvMainWindow::NOHorizontalSliderMoved() {
2244     HorizontalSliderMoved(NOHorizontalSlider->value(),COLUMN_UL_VIEW,0);
2245 }
2246 //====================================================================
2247
2248 //====================================================================
2249 void vvMainWindow::NEHorizontalSliderMoved() {
2250     HorizontalSliderMoved(NEHorizontalSlider->value(),COLUMN_UR_VIEW,1);
2251 }
2252 //====================================================================
2253
2254 //====================================================================
2255 void vvMainWindow::SOHorizontalSliderMoved() {
2256     HorizontalSliderMoved(SOHorizontalSlider->value(),COLUMN_DL_VIEW,2);
2257 }
2258 //====================================================================
2259
2260 //====================================================================
2261 void vvMainWindow::SEHorizontalSliderMoved() {
2262     HorizontalSliderMoved(SEHorizontalSlider->value(),COLUMN_DR_VIEW,3);
2263 }
2264 //====================================================================
2265
2266 //====================================================================
2267 void vvMainWindow::NOVerticalSliderChanged() {
2268     int value = NOVerticalSlider->value();
2269     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2270     {
2271         if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
2272         {
2273             mSlicerManagers[i]->GetSlicer(0)->SetSlice(value);
2274             break;
2275         }
2276     }
2277 }
2278 //====================================================================
2279
2280 //====================================================================
2281 void vvMainWindow::NEVerticalSliderChanged() {
2282     int value = NEVerticalSlider->value();
2283     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2284     {
2285         if (DataTree->topLevelItem(i)->data(COLUMN_UR_VIEW,Qt::CheckStateRole).toInt() > 1)
2286         {
2287             mSlicerManagers[i]->GetSlicer(1)->SetSlice(value);
2288             break;
2289         }
2290     }
2291 }
2292 //====================================================================
2293
2294 //====================================================================
2295 void vvMainWindow::SOVerticalSliderChanged() {
2296     int value = SOVerticalSlider->value();
2297     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2298     {
2299         if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
2300         {
2301             mSlicerManagers[i]->GetSlicer(2)->SetSlice(value);
2302             break;
2303         }
2304     }
2305 }
2306 //====================================================================
2307
2308 //====================================================================
2309 void vvMainWindow::SEVerticalSliderChanged() {
2310     int value = SEVerticalSlider->value();
2311     for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2312     {
2313         if (DataTree->topLevelItem(i)->data(COLUMN_DR_VIEW,Qt::CheckStateRole).toInt() > 1)
2314         {
2315             mSlicerManagers[i]->GetSlicer(3)->SetSlice(value);
2316             break;
2317         }
2318     }
2319 }
2320 //====================================================================
2321
2322 //====================================================================
2323 void vvMainWindow::UpdateSlice(int slicer, int slice) {
2324     if (slicer == 0)
2325         NOVerticalSlider->setValue(slice);
2326     else if (slicer == 1)
2327         NEVerticalSlider->setValue(slice);
2328     else if (slicer == 2)
2329         SOVerticalSlider->setValue(slice);
2330     else if (slicer == 3)
2331         SEVerticalSlider->setValue(slice);
2332 }
2333 //====================================================================
2334
2335 //====================================================================
2336 void vvMainWindow::UpdateTSlice(int slicer, int slice) {
2337     switch (slicer)
2338     {
2339     case 0:
2340         NOHorizontalSlider->setValue(slice);
2341         break;
2342     case 1:
2343         NEHorizontalSlider->setValue(slice);
2344         break;
2345     case 2:
2346         SOHorizontalSlider->setValue(slice);
2347         break;
2348     case 3:
2349         SEHorizontalSlider->setValue(slice);
2350         break;
2351     }
2352 }
2353 //====================================================================
2354
2355 //====================================================================
2356 void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax) {
2357     int position = int((min+max)/2);
2358     int tPosition = int((tmin+tmax)/2);
2359     if (slicer == 0)
2360     {
2361         NOVerticalSlider->setValue(position);
2362         NOVerticalSlider->setRange(min,max);
2363         NOHorizontalSlider->setRange(tmin,tmax);
2364         NOHorizontalSlider->setValue(tPosition);
2365     }
2366     else if (slicer == 1)
2367     {
2368         NEVerticalSlider->setValue(position);
2369         NEVerticalSlider->setRange(min,max);
2370         NEHorizontalSlider->setRange(tmin,tmax);
2371         NEHorizontalSlider->setValue(tPosition);
2372     }
2373     else if (slicer == 2)
2374     {
2375         SOVerticalSlider->setValue(position);
2376         SOVerticalSlider->setRange(min,max);
2377         SOHorizontalSlider->setRange(tmin,tmax);
2378         SOHorizontalSlider->setValue(tPosition);
2379     }
2380     else if (slicer == 3)
2381     {
2382         SEVerticalSlider->setValue(position);
2383         SEVerticalSlider->setRange(min,max);
2384         SEHorizontalSlider->setRange(tmin,tmax);
2385         SEHorizontalSlider->setValue(tPosition);
2386     }
2387 }
2388 //====================================================================
2389
2390 //====================================================================
2391 void vvMainWindow::SaveNOScreenshot() {
2392     vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2393     w2i->SetInput(NOViewWidget->GetRenderWindow());
2394     w2i->Update();
2395     SaveScreenshot(w2i->GetOutput());
2396     w2i->Delete();
2397 }
2398 //====================================================================
2399
2400 //====================================================================
2401 void vvMainWindow::SaveNEScreenshot() {
2402     vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2403     w2i->SetInput(NEViewWidget->GetRenderWindow());
2404     w2i->Update();
2405     SaveScreenshot(w2i->GetOutput());
2406     w2i->Delete();
2407 }
2408 //====================================================================
2409
2410 //====================================================================
2411 void vvMainWindow::SaveSOScreenshot() {
2412     vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2413     w2i->SetInput(SOViewWidget->GetRenderWindow());
2414     w2i->Update();
2415     SaveScreenshot(w2i->GetOutput());
2416     w2i->Delete();
2417 }
2418 //====================================================================
2419
2420 //====================================================================
2421 void vvMainWindow::SaveSEScreenshot() {
2422     vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2423     w2i->SetInput(SEViewWidget->GetRenderWindow());
2424     w2i->Update();
2425     SaveScreenshot(w2i->GetOutput());
2426     w2i->Delete();
2427 }
2428 //====================================================================
2429
2430 //====================================================================
2431 void vvMainWindow::SaveScreenshot(vtkImageData* image) {
2432     QString Extensions = "Images( *.png);;";
2433     Extensions += "Images( *.jpg);;";
2434     Extensions += "Images( *.bmp);;";
2435     Extensions += "Images( *.tif);;";
2436     Extensions += "Images( *.ppm)";
2437     QString fileName = QFileDialog::getSaveFileName(this,
2438                        tr("Save As"),
2439                        itksys::SystemTools::GetFilenamePath(
2440                            mSlicerManagers[0]->GetFileName()).c_str(),
2441                        Extensions);
2442     if (!fileName.isEmpty())
2443     {
2444         const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4;
2445         if (!strcmp(ext, ".bmp"))
2446         {
2447             vtkBMPWriter *bmp = vtkBMPWriter::New();
2448             bmp->SetInput(image);
2449             bmp->SetFileName(fileName.toStdString().c_str());
2450             bmp->Write();
2451             bmp->Delete();
2452         }
2453         else if (!strcmp(ext, ".tif"))
2454         {
2455             vtkTIFFWriter *tif = vtkTIFFWriter::New();
2456             tif->SetInput(image);
2457             tif->SetFileName(fileName.toStdString().c_str());
2458             tif->Write();
2459             tif->Delete();
2460         }
2461         else if (!strcmp(ext, ".ppm"))
2462         {
2463             vtkPNMWriter *pnm = vtkPNMWriter::New();
2464             pnm->SetInput(image);
2465             pnm->SetFileName(fileName.toStdString().c_str());
2466             pnm->Write();
2467             pnm->Delete();
2468         }
2469         else if (!strcmp(ext, ".png"))
2470         {
2471             vtkPNGWriter *png = vtkPNGWriter::New();
2472             png->SetInput(image);
2473             png->SetFileName(fileName.toStdString().c_str());
2474             png->Write();
2475             png->Delete();
2476         }
2477         else if (!strcmp(ext, ".jpg"))
2478         {
2479             vtkJPEGWriter *jpg = vtkJPEGWriter::New();
2480             jpg->SetInput(image);
2481             jpg->SetFileName(fileName.toStdString().c_str());
2482             jpg->Write();
2483             jpg->Delete();
2484         }
2485         else
2486         {
2487             QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!"));
2488         }
2489     }
2490
2491 }
2492 //====================================================================
2493
2494 //====================================================================
2495 void vvMainWindow::GoToCursor() {
2496     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2497     for (int column = 1; column < 5; column++)
2498     {
2499         if (DataTree->selectedItems()[0]->data(column,Qt::CheckStateRole).toInt() > 1)
2500         {
2501             double* cursorPos = mSlicerManagers[index]->GetSlicer(column-1)->GetCursorPosition();
2502             mSlicerManagers[index]->GetSlicer(column-1)->SetCurrentPosition(
2503                 cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]);
2504             mSlicerManagers[index]->UpdateViews(1,column-1);
2505             mSlicerManagers[index]->UpdateLinked(column-1);
2506             break;
2507         }
2508     }
2509 }
2510 //====================================================================
2511
2512 //====================================================================
2513 void vvMainWindow::PlayPause() {
2514     if (playMode)
2515     {
2516         playMode = 0;
2517         playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_play.png")));
2518         ImageInfoChanged();
2519         return;
2520     }
2521     else
2522     {
2523         int image_number=DataTree->topLevelItemCount();
2524         bool has_temporal;
2525         for (int i=0;i<image_number;i++)
2526             if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1)
2527             {
2528                 has_temporal=true;
2529                 break;
2530             }
2531         if (has_temporal)
2532         {
2533             playMode = 1;
2534             playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_pause.png")));
2535             QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2536         }
2537     }
2538 }
2539 //====================================================================
2540
2541 //====================================================================
2542 void vvMainWindow::PlayNext() {
2543     if (playMode && !this->isHidden())
2544     {
2545         int image_number=DataTree->topLevelItemCount();
2546         ///Only play one slicer per SM, and only if the SM is being displayed
2547         for (int i=0;i<image_number;i++)
2548             for (int j=0;j<4;j++)
2549                 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1 and
2550                         DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0)
2551                 {
2552                     mSlicerManagers[i]->SetNextTSlice(j);
2553                     break;
2554                 }
2555         QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2556     }
2557 }
2558 //====================================================================
2559
2560 void vvMainWindow::ShowLastImage()
2561 {
2562     if (mSlicerManagers.size() > 1)
2563     {
2564         QTreeWidgetItem * item=DataTree->topLevelItem(DataTree->topLevelItemCount()-1);
2565         CurrentImageChanged(mSlicerManagers.back()->GetId()); //select new image
2566         item->setData(1,Qt::CheckStateRole,2); //show the new image in the first panel
2567         DisplayChanged(item,1);
2568     }
2569 }
2570
2571 //====================================================================
2572 void vvMainWindow::UpdateRenderWindows() {
2573     if (NOViewWidget->GetRenderWindow()) NOViewWidget->GetRenderWindow()->Render();
2574     if (NEViewWidget->GetRenderWindow()) NEViewWidget->GetRenderWindow()->Render();
2575     if (SOViewWidget->GetRenderWindow()) SOViewWidget->GetRenderWindow()->Render();
2576     if (SEViewWidget->GetRenderWindow()) SEViewWidget->GetRenderWindow()->Render();
2577 }
2578 //====================================================================
2579
2580 //====================================================================
2581 void vvMainWindow::ResampleCurrentImage() {
2582     vvResamplerDialog resampler;
2583     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2584     resampler.SetSlicerManagers(mSlicerManagers,index);
2585     if (resampler.exec()) 
2586         AddImage(resampler.GetOutput(),resampler.GetOutputFileName());
2587 }
2588 //====================================================================
2589
2590 //====================================================================
2591 void vvMainWindow::SegmentationOnCurrentImage() {
2592     int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2593
2594     vvSegmentationDialog segmentation;
2595     segmentation.SetImage(mSlicerManagers[index]->GetSlicer(0)->GetImage());
2596     segmentation.exec();
2597 }
2598 //====================================================================
2599
2600 void vvMainWindow::SurfaceViewerLaunch()
2601 {
2602     vvSurfaceViewerDialog surfaceViewer;
2603     surfaceViewer.exec();
2604 }
2605
2606 //====================================================================
2607 void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
2608 {
2609     vvSlicerManager* m = new vvSlicerManager(4);
2610     m->SetImage(image);
2611     m->SetFilename(filename);
2612     AddImage(m);
2613 }
2614
2615 //====================================================================
2616 void vvMainWindow::AddImage(vvSlicerManager * slicer_manager) {
2617     mSlicerManagers.push_back(slicer_manager);
2618
2619     std::string filename = slicer_manager->GetFileName();
2620
2621     //create an item in the tree with good settings
2622     QTreeWidgetItem *item = new QTreeWidgetItem();
2623     item->setData(0,Qt::UserRole,slicer_manager->GetFileName().c_str());//files[i].c_str());
2624     item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
2625     qApp->processEvents();
2626
2627     for (int j = 1; j <= 4; j++) item->setData(j,Qt::CheckStateRole,1);
2628
2629     //Create the buttons for reload and close
2630     qApp->processEvents();
2631     QTreePushButton* cButton = new QTreePushButton;
2632     cButton->setItem(item);
2633     cButton->setColumn(COLUMN_CLOSE_IMAGE);
2634     cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2635     connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2636             this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2637
2638     QTreePushButton* rButton = new QTreePushButton;
2639     rButton->setItem(item);
2640     rButton->setColumn(COLUMN_RELOAD_IMAGE);
2641     rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2642     rButton->setEnabled(0);
2643     connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2644             this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2645
2646     DataTree->addTopLevelItem(item);
2647     DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2648     DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2649
2650     //set the id of the image
2651     QString id = slicer_manager->GetFileName().c_str() + QString::number(mSlicerManagers.size()-1);
2652     item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2653     mSlicerManagers.back()->SetId(id.toStdString());
2654
2655     linkPanel->addImage(filename, id.toStdString());
2656
2657     connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
2658             this,SLOT(CurrentImageChanged(std::string)));
2659     connect(mSlicerManagers.back(),SIGNAL(
2660                 UpdatePosition(int, double, double, double, double, double, double, double)),this,
2661             SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
2662     connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
2663             this, SLOT(VectorChanged(int,double,double,double, double)));
2664     connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
2665             this, SLOT(OverlayChanged(int,double,double)));
2666     connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
2667             this, SLOT(FusionChanged(int,double)));
2668     connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
2669             this,SLOT(WindowsChanged(int, int, int)));
2670     connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
2671             this,SLOT(WindowLevelChanged(double, double, int, int)));
2672     connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
2673             this,SLOT(UpdateSlice(int,int)));
2674     connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
2675             this,SLOT(UpdateTSlice(int, int)));
2676     connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
2677             this,SLOT(UpdateSliceRange(int,int,int,int,int)));
2678     connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
2679             this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
2680     connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
2681     UpdateTree();
2682     qApp->processEvents();
2683     InitSlicers();
2684     ShowLastImage();
2685     InitDisplay();
2686     qApp->processEvents();
2687
2688 }
2689 //====================================================================