- return -1;
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::DisplayChanged(QTreeWidgetItem *clicked_item, int column) {
- int index = GetSlicerIndexFromItem(clicked_item);
- if ( column >= COLUMN_CLOSE_IMAGE or column <= 0)
- return;
- for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
- {
- QTreeWidgetItem* current_row=DataTree->topLevelItem(i);
- if (DataTree->topLevelItem(index) == current_row)
- {
- vvSlicer* clicked_slicer=mSlicerManagers[i]->GetSlicer(column-1);
- if (current_row == clicked_item)
- {
- //If we just activated a slicer
- if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
- {
- mSlicerManagers[i]->UpdateSlicer(column-1,clicked_item->data(column,Qt::CheckStateRole).toInt());
- mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
- DisplaySliders(i,column-1);
- std::map<std::string,int> overlay_counts;
- for (int child = 0; child < current_row->childCount(); child++)
- {
- std::string overlay_type =
- current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
- overlay_counts[overlay_type]++;
- current_row->child(child)->setData(column,Qt::CheckStateRole,
- current_row->data(column,Qt::CheckStateRole));
- clicked_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,true);
- }
- }
- else //We don't allow simply desactivating a slicer
- {
- clicked_item->setData(column,Qt::CheckStateRole,2);
- return;
- }
- }
- //if we clicked on the vector(or overlay) and not the image
- else
- {
- if (clicked_item->data(column,Qt::CheckStateRole).toInt())
- {
- current_row->setData(column,Qt::CheckStateRole,2);
- mSlicerManagers[i]->UpdateSlicer(column-1,2);
- mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
- DisplaySliders(i,column-1);
- }
- int vis = clicked_item->data(column,Qt::CheckStateRole).toInt();
- std::string overlay_type = clicked_item->data(1,Qt::UserRole).toString().toStdString();
- int overlay_index=0;
- for (int child = 0; child < current_row->childCount(); child++)
- {
- if (current_row->child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
- overlay_index++;
- if (current_row->child(child) == clicked_item) break;
- }
- clicked_slicer->SetActorVisibility(
- clicked_item->data(1,Qt::UserRole).toString().toStdString(), overlay_index-1,vis);
- }
- }
- else if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
- {
- current_row->setData(column,Qt::CheckStateRole,0);
- mSlicerManagers[i]->UpdateSlicer(column-1,0);
- std::map<std::string,int> overlay_counts;
- for (int child = 0; child < current_row->childCount(); child++)
- {
- std::string overlay_type =
- current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
- overlay_counts[overlay_type]++;
- current_row->child(child)->setData(column,Qt::CheckStateRole,0);
- vvSlicer * current_slicer=mSlicerManagers[i]->GetSlicer(column-1);
- current_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,false);
- }
- }
- //mSlicerManagers[i]->SetColorMap(-1);
- }
- mSlicerManagers[index]->GetSlicer(column-1)->Render();
-}
-//====================================================================
-
-void vvMainWindow::InitSlicers()
-{
- if (mSlicerManagers.size())
- {
- mSlicerManagers.back()->GenerateDefaultLookupTable();
-
- mSlicerManagers.back()->SetSlicerWindow(0,NOViewWidget->GetRenderWindow());
- mSlicerManagers.back()->SetSlicerWindow(1,NEViewWidget->GetRenderWindow());
- mSlicerManagers.back()->SetSlicerWindow(2,SOViewWidget->GetRenderWindow());
- mSlicerManagers.back()->SetSlicerWindow(3,SEViewWidget->GetRenderWindow());
- }
-}
-
-//====================================================================
-void vvMainWindow::InitDisplay() {
- if (mSlicerManagers.size())
- {
- //BE CAREFUL : this is absolutely necessary to set the interactor style
- //in order to have the same style instanciation for all SlicerManagers in
- // a same window
- for (int j = 0; j < 4; j++)
- {
- vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
- style->SetAutoAdjustCameraClippingRange(1);
- bool AlreadySelected = false;
- for (int i = 0; i < DataTree->topLevelItemCount(); i++)
- {
- mSlicerManagers[i]->SetInteractorStyleNavigator(j,style);
-
- //select the image only if previous are not selected
- if (DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 1)
- {
- mSlicerManagers[i]->UpdateSlicer(j,1);
- AlreadySelected = true;
- }
- else if (i == DataTree->topLevelItemCount()-1 && !AlreadySelected)
- {
- if (DataTree->selectedItems().size() == 0)
- DataTree->topLevelItem(i)->setSelected(1);
- DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,2);
- mSlicerManagers[i]->UpdateSlicer(j,1);
- DisplaySliders(i,j);
- }
- else
- {
- DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,0);
- mSlicerManagers[i]->UpdateSlicer(j,0);
- }
- }
- style->Delete();
- }
- }
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::DisplaySliders(int slicer, int window) {
- int range[2];
- mSlicerManagers[slicer]->GetSlicer(window)->GetSliceRange(range);
- int position = mSlicerManagers[slicer]->GetSlicer(window)->GetSlice();
-
- int tRange[2];
- tRange[0] = 0;
- tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
- int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetTSlice();
- bool showHorizontal = false;
- bool showVertical = false;
- if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
- || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2
- && mSlicerManagers[slicer]->GetType() != IMAGEWITHTIME
- && mSlicerManagers[slicer]->GetType() != MERGEDWITHTIME))
- showVertical = true;
- if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
- || mSlicerManagers[slicer]->GetType() == IMAGEWITHTIME
- || mSlicerManagers[slicer]->GetType() == MERGEDWITHTIME)
- showHorizontal = true;
-
- if (showVertical)
- verticalSliders[window]->show();
- else
- verticalSliders[window]->hide();
- verticalSliders[window]->setRange(range[0],range[1]);
- verticalSliders[window]->setValue(position);
-
- if (showHorizontal)
- horizontalSliders[window]->show();
- else
- horizontalSliders[window]->hide();
- horizontalSliders[window]->setRange(tRange[0],tRange[1]);
- horizontalSliders[window]->setValue(tPosition);
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column) {
- int index = GetSlicerIndexFromItem(item);
-
- if (DataTree->topLevelItem(index) != item)
- {
- QString warning = "Do you really want to close the overlay : ";
- warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
- QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
- warning, 0, this);
- msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
- msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
- if (msgBox.exec() == QMessageBox::AcceptRole)
- {
- std::string overlay_type=item->data(1,Qt::UserRole).toString().toStdString();
- int overlay_index=0;
- for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
- {
- if (DataTree->topLevelItem(index)->\
- child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
- overlay_index++;
- if (DataTree->topLevelItem(index)->child(child) == item) break;
- }
- mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
- mSlicerManagers[index]->SetColorMap(0);
- DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
- mSlicerManagers[index]->Render();
- }
- }
- else if (DataTree->topLevelItemCount() <= 1)
- {
- QString warning = "Do you really want to close the image : ";
- warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
- warning += "\nThis is the last image, you're about to close vv !!!";
- QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
- warning, 0, this);
- msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
- msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
- if (msgBox.exec() == QMessageBox::AcceptRole)
- {
- this->close();
- }
- }
- else
- {
- QString warning = "Do you really want to close the image : ";
- warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
- QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
- warning, 0, this);
- msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
- msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
- if (msgBox.exec() == QMessageBox::AcceptRole)
- {
- std::vector<vvSlicerManager*>::iterator Manageriter = mSlicerManagers.begin();
- DataTree->takeTopLevelItem(index);
- for (int i = 0; i < index; i++)
- {
- Manageriter++;
- }
- linkPanel->removeImage(index);
- mSlicerManagers[index]->RemoveActors();
- delete mSlicerManagers[index];
- mSlicerManagers.erase(Manageriter);
- InitDisplay();
- }
- }
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column) {
- int index = GetSlicerIndexFromItem(item);
- QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
- if (item->data(1,Qt::UserRole).toString() == "vector")
- mSlicerManagers[index]->ReloadVF();
- else
- mSlicerManagers[index]->Reload();
- QApplication::restoreOverrideCursor();
-}
-//====================================================================
-
-void vvMainWindow::CropImage()
-{
- int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
- vvCropDialog crop(mSlicerManagers,index);
- if(crop.exec())
- AddImage(crop.GetOutput(),"cropped.mhd");
-}
-
-//====================================================================
-void vvMainWindow::SplitImage() {
- int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
- int dim = mSlicerManagers[index]->GetDimension();
- QString warning = "Do you really want to split the ";
- warning += QString::number(dim) + "D image ";
- warning += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString() + " into ";
- warning += QString::number(mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]) + " ";
- warning += QString::number(dim-1) + "D images.";
- QMessageBox msgBox(QMessageBox::Warning, tr("Split Image"),
- warning, 0, this);
- msgBox.addButton(tr("Split"), QMessageBox::AcceptRole);
- msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
- if (msgBox.exec() == QMessageBox::AcceptRole)
- {
- QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
- if (dim > 2)
- {
- std::string filename = DataTree->selectedItems()[0]->data(0,Qt::UserRole).toString().toStdString();
- int numberOfSlice = mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1];
- std::string path = itksys::SystemTools::GetFilenamePath(
- filename);
- path += "/";
- path += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString().toStdString();
- path += "%03d";
- path += itksys::SystemTools::GetFilenameLastExtension(
- filename).c_str();
-
- typedef itk::NumericSeriesFileNames NameGeneratorType;
- NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
- nameGenerator->SetSeriesFormat(path.c_str());
- nameGenerator->SetStartIndex(0);
- nameGenerator->SetEndIndex(numberOfSlice-1);
- nameGenerator->SetIncrementIndex(1);
-
- for (int i = 0; i < numberOfSlice; i++)
- {
- vvSlicerManager* imageManager = new vvSlicerManager(4);
- imageManager->SetExtractedImage(nameGenerator->GetFileNames()[i],
- mSlicerManagers[index]->GetSlicer(0)->GetImage(), i);
- mSlicerManagers.push_back(imageManager);
-
- //create an item in the tree with good settings
- QTreeWidgetItem *item = new QTreeWidgetItem();
- item->setData(0,Qt::UserRole,nameGenerator->GetFileNames()[i].c_str());
- std::string fileI = itksys::SystemTools::GetFilenameWithoutLastExtension(
- nameGenerator->GetFileNames()[i]).c_str();
- item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileI.c_str());
- for (int j = 1; j <= 4; j++)
- {
- for (int i = 0; i < DataTree->topLevelItemCount(); i++)
- {
- DataTree->topLevelItem(i)->setData(j,Qt::CheckStateRole,0);
- }
- item->setData(j,Qt::CheckStateRole,2);
- }
-
- //Create the buttons for reload and close
- QTreePushButton* cButton = new QTreePushButton;
- cButton->setItem(item);
- cButton->setColumn(COLUMN_CLOSE_IMAGE);
- cButton->setToolTip(tr("close image"));
- cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
- connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
- this,SLOT(CloseImage(QTreeWidgetItem*, int)));
-
- QTreePushButton* rButton = new QTreePushButton;
- rButton->setItem(item);
- rButton->setColumn(COLUMN_RELOAD_IMAGE);
- rButton->setToolTip(tr("reload image"));
- rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
- rButton->setEnabled(false);
- connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
- this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
-
- DataTree->addTopLevelItem(item);
- DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
- DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
-
- //set the id of the image
- QString id = nameGenerator->GetFileNames()[i].c_str() + QString::number(mSlicerManagers.size()-1);
- item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
- mSlicerManagers.back()->SetId(id.toStdString());
- linkPanel->addImage(fileI, id.toStdString());
- connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
- this,SLOT(CurrentImageChanged(std::string)));
- connect(mSlicerManagers.back(),SIGNAL(
- UpdatePosition(int, double, double, double, double, double, double, double)),this,
- SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
- connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
- this, SLOT(VectorChanged(int,double,double,double, double)));
- connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
- this, SLOT(OverlayChanged(int,double,double)));
- connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
- this, SLOT(FusionChanged(int,double)));
- connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
- this,SLOT(WindowsChanged(int, int, int)));
- connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
- this,SLOT(WindowLevelChanged(double, double, int, int)));
- connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
- this,SLOT(UpdateSlice(int,int)));
- connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
- this,SLOT(UpdateTSlice(int, int)));
- connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
- this,SLOT(UpdateSliceRange(int,int,int,int,int)));
- connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
- this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
- connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
- UpdateTree();
- qApp->processEvents();
- InitSlicers();
- InitDisplay();
- qApp->processEvents();
- }
- QApplication::restoreOverrideCursor();
- }
- else
- {
- QApplication::restoreOverrideCursor();
- QString error = "Cannot split file (dimensions must be greater than 2) ";
- QMessageBox::information(this,tr("Splitting problem"),error);
- }
- }
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::MousePositionChanged(int visibility,double x, double y, double z, double X, double Y, double Z , double value) {
- infoPanel->setCurrentInfo(visibility,x,y,z,X,Y,Z,value);
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::VectorChanged(int visibility,double x, double y, double z, double value) {
- overlayPanel->getCurrentVectorInfo(visibility,x,y,z,value);
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::OverlayChanged(int visibility, double valueOver, double valueRef) {
- overlayPanel->getCurrentOverlayInfo(visibility,valueOver, valueRef);
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::FusionChanged(int visibility, double value) {
- overlayPanel->getCurrentFusionInfo(visibility,value);
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::WindowsChanged(int window, int view, int slice) {
- infoPanel->setViews(window, view, slice);
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::WindowLevelChanged(double window, double level,int preset,int colormap) {
- windowSpinBox->setValue(window);
- levelSpinBox->setValue(level);
- colorMapComboBox->setCurrentIndex(colormap);
- presetComboBox->setCurrentIndex(preset);
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::WindowLevelEdited() {
- presetComboBox->setCurrentIndex(6);
- UpdateWindowLevel();
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::UpdateWindowLevel() {
- if (DataTree->selectedItems().size())
- {
- if (presetComboBox->currentIndex() == 7) //For ventilation
- colorMapComboBox->setCurrentIndex(5);
- int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
- mSlicerManagers[index]->SetColorWindow(windowSpinBox->value());
- mSlicerManagers[index]->SetColorLevel(levelSpinBox->value());
- mSlicerManagers[index]->SetPreset(presetComboBox->currentIndex());
- mSlicerManagers[index]->Render();
- }
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::UpdateColorMap() {
- if (DataTree->selectedItems().size())
- {
- int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
- mSlicerManagers[index]->SetColorMap(colorMapComboBox->currentIndex());
- mSlicerManagers[index]->Render();
- }
-}
-//====================================================================
-void vvMainWindow::SwitchWindowLevel() {
- int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
- int window = mSlicerManagers[index]->GetColorWindow();
- presetComboBox->setCurrentIndex(6);
- windowSpinBox->setValue(-window);
- UpdateWindowLevel();
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps) {
- for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
- {
- if (mSlicerManagers[i]->GetId() == id)
- {
- //mSlicerManagers[i]->SetTSlice(temps);
- mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
- mSlicerManagers[i]->UpdateViews(0,slicer);
- break;
- }
- }
-}
-//====================================================================
-
-//====================================================================
-void vvMainWindow::ShowContextMenu(QPoint point) {
- if (!DataTree->selectedItems().size())
- {
- contextActions[1]->setEnabled(0);
- contextActions[2]->setEnabled(0);
- contextActions[3]->setEnabled(0);
- contextActions[4]->setEnabled(0);
- contextActions[5]->setEnabled(0);
- contextActions[6]->setEnabled(0);
- contextActions[7]->setEnabled(0);
- }
- else
- {
- int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
- contextActions[1]->setEnabled(1);
- contextActions[2]->setEnabled(
- DataTree->itemWidget(DataTree->selectedItems()[0],
- COLUMN_RELOAD_IMAGE)->isEnabled());
- contextActions[3]->setEnabled(1);
- contextActions[5]->setEnabled(1);
- contextActions[6]->setEnabled(1);
- contextActions[7]->setEnabled(1);
-
- if (mSlicerManagers[index]->GetDimension() < 3)
- contextActions[4]->setEnabled(0);
- else
- contextActions[4]->setEnabled(1);