X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolWidgetBase.cxx;h=9c85336e2ab4f9a174b693850af92908b85f3710;hb=HEAD;hp=aceaa7033b621b8a02a8fcd2a3f88fcbc695cc64;hpb=0b7c9b1e1215634b02cbd38d4e4ba101d6111ba8;p=clitk.git diff --git a/vv/vvToolWidgetBase.cxx b/vv/vvToolWidgetBase.cxx index aceaa70..9c85336 100644 --- a/vv/vvToolWidgetBase.cxx +++ b/vv/vvToolWidgetBase.cxx @@ -1,9 +1,9 @@ /*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Authors belong to: + Authors belong to: - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even @@ -14,36 +14,122 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ +===========================================================================**/ + +// vv #include "vvToolWidgetBase.h" #include "vvMainWindowBase.h" #include "vvSlicerManager.h" + +// Qt #include +#include +#include +#include //------------------------------------------------------------------------------ -vvToolWidgetBase::vvToolWidgetBase(vvMainWindowBase * parent, Qt::WindowFlags f) - :QDialog(parent, f), - Ui::vvToolWidgetBase() { +// Static initialisation +int vvToolWidgetBase::mTabNumber = -1; +QWidget * vvToolWidgetBase::mStaticWidgetForTab = NULL; +QVBoxLayout * vvToolWidgetBase::mStaticVerticalLayout = NULL; +bool vvToolWidgetBase::mIsAnotherToolWaitInput = false; - // Set Modality : dialog is not modal but stay always on top because - // parent is set at construction - mIsInitialized = false; - mFilter = 0; - mMainWindowBase = parent; - setModal(false); +//------------------------------------------------------------------------------ +vvToolWidgetBase::vvToolWidgetBase(vvMainWindowBase * parent, Qt::WindowFlags f, bool initialize): + QWidget(parent, f), + Ui::vvToolWidgetBase() +{ + mMainWindow = parent; setAttribute(Qt::WA_DeleteOnClose); + if (initialize) Initialization(); + if (isWindow()) { // In this case, the tool is a floating windows + // this->grabKeyboard(); // for the ESC key to close the dialog + mPreventToUseTwoToolsOnSameInput = false; + } + else { // In this case it is inserted into a tab + DD("Not implemented yet TODO !!"); + exit(0); + // Prevent to load two tools at the same time + DD(mIsAnotherToolWaitInput); + if (mIsAnotherToolWaitInput) { + // setVisible(false); + QWidget::close(); + DD("before return"); + return; + } + else mIsAnotherToolWaitInput = true; + mPreventToUseTwoToolsOnSameInput = true; + // Setup the UI in a new widget + + mWidgetForTab = new QWidget(this); + // <-- try to set mToolWidget instead of this ? NO (loop) + // <-- try to set parent instead of this ? NO, change nothing + + QVBoxLayout * verticalLayout = new QVBoxLayout;//(mWidgetForTab); + verticalLayout->addWidget(mToolInputSelectionWidget); + verticalLayout->addWidget(mToolWidget); + verticalLayout->setContentsMargins(1, 1, 1, 1); + mWidgetForTab->setLayout(verticalLayout); + DD(mWidgetForTab->isVisible()); + mWidgetForTab->setVisible(true); + DD(mWidgetForTab->isVisible()); + + // Is this the first time we add a tab ? + if (parent->GetTab()->widget(mTabNumber) == NULL) { // Yes, create main widget + DD("Create main widget"); + mStaticWidgetForTab = new QWidget(parent->GetTab());//parent, f); + // <-- try to set mToolWidget instead of nothing ? NO loop + // <-- try to set parent->GetTab() instead of nothing ? + mStaticVerticalLayout = new QVBoxLayout;//(mStaticWidgetForTab); + mStaticWidgetForTab->setLayout(mStaticVerticalLayout); + + /*mWidgetForTab = new QWidget(mStaticWidgetForTab); + QVBoxLayout * verticalLayout = new QVBoxLayout;//(mWidgetForTab); + verticalLayout->addWidget(mToolInputSelectionWidget); + verticalLayout->addWidget(mToolWidget); + verticalLayout->setContentsMargins(1, 1, 1, 1); + mWidgetForTab->setLayout(verticalLayout); + DD(mWidgetForTab->isVisible()); + mWidgetForTab->setVisible(true); + DD(mWidgetForTab->isVisible());*/ + + //<---------- mStaticVerticalLayout->addWidget(mWidgetForTab); + + mTabNumber = parent->GetTab()->addTab(mStaticWidgetForTab, ""); + DD(mStaticWidgetForTab->isVisible()); + mStaticWidgetForTab->setVisible(true); + DD(mStaticWidgetForTab->isVisible()); + // mWidgetForTab->setParent(mStaticWidgetForTab); + } + else { + DD("insert into widget"); + mStaticVerticalLayout->addWidget(mWidgetForTab); + SwapCurrentWidget(); + mToolWidget->setEnabled(true); + } + parent->GetTab()->setCurrentIndex(mTabNumber); + mMainButtonBox->hide(); // No OK/Cancel by default in this case + } +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolWidgetBase::Initialization() +{ mCurrentSlicerManager = 0; - + mIsInitialized = false; + mFilter = 0; + setWindowModality(Qt::NonModal); // GUI Initialization - setupUi(this); - - // Connect signals & slots - connect(mMainWindowBase, SIGNAL(AnImageIsBeingClosed(vvSlicerManager*)), - this, SLOT(AnImageIsBeingClosed(vvSlicerManager*))); + setupUi(this); ///////////////////////////// TRIAL + // Connect signals & slots + connect(mMainWindow, SIGNAL(AnImageIsBeingClosed(vvSlicerManager*)), this, SLOT(AnImageIsBeingClosed(vvSlicerManager*))); + connect(mMainWindow, SIGNAL(SelectedImageHasChanged(vvSlicerManager*)), this, SLOT(SelectedImageHasChanged(vvSlicerManager*))); connect(mToolInputSelectionWidget, SIGNAL(accepted()), this, SLOT(InputIsSelected())); connect(mToolInputSelectionWidget, SIGNAL(rejected()), this, SLOT(close())); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(apply())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); + connect(mMainButtonBox, SIGNAL(accepted()), this, SLOT(apply())); + connect(mMainButtonBox, SIGNAL(rejected()), this, SLOT(close())); // Disable main widget while input image is not selected mToolWidget->setEnabled(false); @@ -52,92 +138,170 @@ vvToolWidgetBase::vvToolWidgetBase(vvMainWindowBase * parent, Qt::WindowFlags f) //------------------------------------------------------------------------------ -vvToolWidgetBase::~vvToolWidgetBase() { - +vvToolWidgetBase::~vvToolWidgetBase() +{ +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolWidgetBase::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Escape) { + reject(); + event->accept(); + return; + } + else { + QWidget::keyPressEvent(event); + } + // event->ignore(); + //mMainWindow->keyPressEvent(event); + // QWidget::keyPressEvent(event); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolWidgetBase::accept() +{ + apply(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// void vvToolWidgetBase::SetNumberOfNeededInputs(int nb) { -// mNumberOfInputs = nb; -// mListOfFilters.resize(nb); -// for(int i=0; iGetSlicerManagers().size()); +void vvToolWidgetBase::AddInputSelector(QString s, clitk::ImageToImageGenericFilterBase * f, bool allowSkip) +{ int j=0; mFilter = f; mSlicerManagersCompatible.clear(); mToolInputSelectionWidget->setToolTip(QString("%1").arg(mFilter->GetAvailableImageTypes().c_str())); - for(unsigned int i=0; iGetSlicerManagers().size(); i++) { - // DD(i); - vvImage * s = mMainWindowBase->GetSlicerManagers()[i]->GetImage(); - // DD(s->GetScalarTypeAsString()); - if (mFilter->CheckImageType(s->GetNumberOfDimensions(), - s->GetNumberOfScalarComponents(), - s->GetScalarTypeAsString())) { - mSlicerManagersCompatible.push_back(mMainWindowBase->GetSlicerManagers()[i]); - if ((int)i == mMainWindowBase->GetSlicerManagerCurrentIndex()) mCurrentCompatibleIndex = j; + mCurrentCompatibleIndex = 0; + for(unsigned int i=0; iGetSlicerManagers().size(); i++) { + vvImage * s = mMainWindow->GetSlicerManagers()[i]->GetImage(); + if (mFilter->CheckImageType(s->GetNumberOfDimensions(), + s->GetNumberOfScalarComponents(), + s->GetScalarTypeAsITKString())) { + mSlicerManagersCompatible.push_back(mMainWindow->GetSlicerManagers()[i]); + if ((int)i == mMainWindow->GetSlicerManagerCurrentIndex()) mCurrentCompatibleIndex = j; j++; } } if (mSlicerManagersCompatible.size() == 0) { - QMessageBox::information(this, "No image","Sorry, could not perform operation. No (compatible) opened image type."); - close(); + std::ostringstream osstream; + osstream << "Sorry, could not perform operation. No (compatible) image. " + << mFilter->GetAvailableImageTypes(); + QMessageBox::information(this, "No image", osstream.str().c_str()); + reject(); return; } + if (mPreventToUseTwoToolsOnSameInput) { + CheckInputList(mSlicerManagersCompatible, mCurrentCompatibleIndex); + if (mSlicerManagersCompatible.size() == 0) { + QMessageBox::information(mMainWindow, tr("Error"), "Sorry, no other loaded images can use this tool. Abort"); + reject(); + return; + } + } mToolInputSelectionWidget->AddInputSelector(s, mSlicerManagersCompatible, mCurrentCompatibleIndex, allowSkip); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolWidgetBase::AddInputSelector(QString s, bool allowSkip) { - // DD("AddInput without filter"); - // DD(mMainWindowBase->GetSlicerManagers().size()); +void vvToolWidgetBase::AddInputSelector(QString s, bool allowSkip) +{ mSlicerManagersCompatible.clear(); - for(unsigned int i=0; iGetSlicerManagers().size(); i++) { - mSlicerManagersCompatible.push_back(mMainWindowBase->GetSlicerManagers()[i]); + for(unsigned int i=0; iGetSlicerManagers().size(); i++) { + mSlicerManagersCompatible.push_back(mMainWindow->GetSlicerManagers()[i]); } - if (mMainWindowBase->GetSlicerManagers().size() == 0) { - QMessageBox::information(this, "No image","Sorry, could not perform operation. No opened image type."); + if (mMainWindow->GetSlicerManagers().size() == 0) { + QMessageBox::information(this, "No image","Sorry, could not perform operation. No (compatible) image."); close(); return; } - mToolInputSelectionWidget->AddInputSelector(s, mMainWindowBase->GetSlicerManagers(), - mMainWindowBase->GetSlicerManagerCurrentIndex(), allowSkip); + mCurrentCompatibleIndex = mMainWindow->GetSlicerManagerCurrentIndex(); + if (mPreventToUseTwoToolsOnSameInput) { + CheckInputList(mSlicerManagersCompatible, mCurrentCompatibleIndex); + if (mSlicerManagersCompatible.size() == 0) { + QMessageBox::information(mMainWindow, tr("Error"), "Sorry, no other loaded images can use this tool. Abort"); + close(); + return; + } + } + mToolInputSelectionWidget->AddInputSelector(s, mSlicerManagersCompatible, mCurrentCompatibleIndex, allowSkip); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolWidgetBase::show() { +void vvToolWidgetBase::HideInputSelector() +{ + mToolInputSelectionWidget->hide(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolWidgetBase::show() +{ if (!mIsInitialized) { - // DD("show -> init"); mToolInputSelectionWidget->Initialize(); mIsInitialized = true; } - QDialog::show(); + QWidget::show(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -bool vvToolWidgetBase::close() { - // DD("vvToolWidgetBase::close()"); - return QDialog::close(); +void vvToolWidgetBase::closeEvent(QCloseEvent *event) +{ + mIsAnotherToolWaitInput = false; + if (isWindow()) { + event->accept();//return QWidget::close(); + return; + } + else { + if (!mStaticWidgetForTab) { + event->accept();//return QWidget::close(); + return; + } + mStaticVerticalLayout->removeWidget(mWidgetForTab); + mWidgetForTab->close(); + delete mWidgetForTab; + QList l =mStaticWidgetForTab->children(); + if (l.size() > 1) { + QWidget * c = dynamic_cast(l[1]); + c->setVisible(true); + } + } + event->accept(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +bool vvToolWidgetBase::close() +{ + QApplication::restoreOverrideCursor(); + return QWidget::close(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolWidgetBase::AnImageIsBeingClosed(vvSlicerManager * m) { +void vvToolWidgetBase::AnImageIsBeingClosed(vvSlicerManager * m) +{ mToolInputSelectionWidget->AnImageIsBeingClosed(m); if (m == mCurrentSlicerManager) { close(); @@ -147,46 +311,53 @@ void vvToolWidgetBase::AnImageIsBeingClosed(vvSlicerManager * m) { //------------------------------------------------------------------------------ -void vvToolWidgetBase::InitializeInputs() { - /* - if (mFilter) { - int j=0; - mToolInputSelectionWidget->setToolTip(QString("%1").arg(mFilter->GetAvailableImageTypes().c_str())); - for(unsigned int i=0; iGetSlicerManagers().size(); i++) { - vvImage * s = mMainWindowBase->GetSlicerManagers()[i]->GetImage(); - if (mFilter->CheckImageType(s->GetNumberOfDimensions(), - s->GetNumberOfScalarComponents(), - s->GetScalarTypeAsString())) { - mSlicerManagersCompatible.push_back(mMainWindowBase->GetSlicerManagers()[i]); - if ((int)i == mMainWindowBase->GetSlicerManagerCurrentIndex()) mCurrentCompatibleIndex = j; - j++; +void vvToolWidgetBase::SwapCurrentWidget() +{ + mStaticWidgetForTab->setUpdatesEnabled(false); + QList l =mStaticWidgetForTab->children(); + for(int i=1; i(l[i]); + if (l[i] == mWidgetForTab) { + c->setVisible(true); } + else { + c->setVisible(false); } + } + mStaticWidgetForTab->setUpdatesEnabled(true); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolWidgetBase::SelectedImageHasChanged(vvSlicerManager * m) +{ + if (!isWindow()) { // When the tool is not in a window, it is in a tab : we only display if needed + if (mCurrentSlicerManager == NULL) return; + if (mToolWidget == NULL) return; + if (m != mCurrentSlicerManager) { // current tool is not selected + mToolWidget->setEnabled(false); } - else { - mSlicerManagersCompatible = mMainWindowBase->GetSlicerManagers(); - mCurrentCompatibleIndex = mMainWindowBase->GetSlicerManagerCurrentIndex(); + else { // The current tool is selected + SwapCurrentWidget(); + mToolWidget->setEnabled(true); } - mToolInputSelectionWidget->Initialize(mSlicerManagersCompatible, - mCurrentCompatibleIndex); - mIsInitialized = true; - */ + } } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// void vvToolWidgetBase::SetNumberOfNeededInputs(int i) { -// DD("SetNumberOfNeededInputs"); -// DD(i); -// } +void vvToolWidgetBase::InitializeInputs() +{ +} //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolWidgetBase::InputIsSelected() { - // DD("InputIsSelected"); - buttonBox->setEnabled(true); +void vvToolWidgetBase::InputIsSelected() +{ + mMainButtonBox->setEnabled(true); std::vector & l = mToolInputSelectionWidget->GetSelectedInputs(); mCurrentSlicerManager = l[0]; mCurrentImage = mCurrentSlicerManager->GetImage(); @@ -194,12 +365,14 @@ void vvToolWidgetBase::InputIsSelected() { if (!mCurrentSlicerManager) close(); if (l.size() == 1) InputIsSelected(mCurrentSlicerManager); else InputIsSelected(l); + mIsAnotherToolWaitInput = false; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolWidgetBase::InputIsSelected(vvSlicerManager * m) { +void vvToolWidgetBase::InputIsSelected(vvSlicerManager * m) +{ std::cerr << "You MUST overwrite this method vvToolWidgetBase::InputIsSelected(vvSlicerManager * m) if you use one single input" << std::endl; exit(0); } @@ -207,10 +380,9 @@ void vvToolWidgetBase::InputIsSelected(vvSlicerManager * m) { //------------------------------------------------------------------------------ -void vvToolWidgetBase::InputIsSelected(std::vector & l) { - buttonBox->setEnabled(true); - // DD("InputIsSelected(vector)"); - // DD(l.size()); +void vvToolWidgetBase::InputIsSelected(std::vector & l) +{ + mMainButtonBox->setEnabled(true); if (l.size() == 1) InputIsSelected(l[0]); else { std::cerr << "You MUST overwrite this method vvToolWidgetBase::InputIsSelected(vector m) if you use several input" << std::endl;