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