]> Creatis software - clitk.git/blob - vv/vvToolWidgetBase.cxx
some small correction
[clitk.git] / vv / vvToolWidgetBase.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 // vv
20 #include "vvToolWidgetBase.h"
21 #include "vvMainWindowBase.h"
22 #include "vvSlicerManager.h"
23
24 // Qt
25 #include <QMessageBox>
26 #include <QKeyEvent>
27 #include <QDockWidget>
28
29 //------------------------------------------------------------------------------
30 // Static initialisation
31 int vvToolWidgetBase::mTabNumber = -1;
32 QWidget * vvToolWidgetBase::mStaticWidgetForTab = NULL;
33 QVBoxLayout * vvToolWidgetBase::mStaticVerticalLayout = NULL;
34 bool vvToolWidgetBase::mIsAnotherToolWaitInput = false;
35
36 //------------------------------------------------------------------------------
37 vvToolWidgetBase::vvToolWidgetBase(vvMainWindowBase * parent, Qt::WindowFlags f, bool initialize):
38   QWidget(parent, f),
39   Ui::vvToolWidgetBase()
40 {
41   mMainWindow = parent;
42   setAttribute(Qt::WA_DeleteOnClose);
43   if (initialize) Initialization();
44   // DD(isWindow());
45   if (isWindow()) { // In this case, the tool is a floating windows
46     // this->grabKeyboard();   // for the ESC key to close the dialog
47     mPreventToUseTwoToolsOnSameInput = false;
48   }
49   else { // In this case it is inserted into a tab
50     DD("Not implemented yet TODO !!");
51     exit(0);
52     // Prevent to load two tools at the same time
53     DD(mIsAnotherToolWaitInput);
54     if (mIsAnotherToolWaitInput) {
55       //      setVisible(false);
56       QWidget::close();
57       DD("before return");
58       return;
59     }
60     else mIsAnotherToolWaitInput = true;
61     mPreventToUseTwoToolsOnSameInput = true;
62     // Setup the UI in a new widget
63
64     mWidgetForTab = new QWidget(this); 
65                                 // <-- try to set mToolWidget instead of this ? NO  (loop)
66                                 // <-- try to set parent instead of this ? NO, change nothing
67
68     QVBoxLayout * verticalLayout = new QVBoxLayout;//(mWidgetForTab);
69     verticalLayout->addWidget(mToolInputSelectionWidget);
70     verticalLayout->addWidget(mToolWidget);
71     verticalLayout->setContentsMargins(1, 1, 1, 1);
72     mWidgetForTab->setLayout(verticalLayout);
73     DD(mWidgetForTab->isVisible());
74     mWidgetForTab->setVisible(true);
75     DD(mWidgetForTab->isVisible());
76
77     // Is this the first time we add a tab ? 
78     if (parent->GetTab()->widget(mTabNumber) == NULL) { // Yes, create main widget
79       DD("Create main widget");
80       mStaticWidgetForTab = new QWidget(parent->GetTab());//parent, f); 
81                                 // <-- try to set mToolWidget instead of nothing ? NO loop
82                                 // <-- try to set parent->GetTab() instead of nothing ? 
83       mStaticVerticalLayout = new QVBoxLayout;//(mStaticWidgetForTab);
84       mStaticWidgetForTab->setLayout(mStaticVerticalLayout);
85
86       /*mWidgetForTab = new QWidget(mStaticWidgetForTab);
87     QVBoxLayout * verticalLayout = new QVBoxLayout;//(mWidgetForTab);
88     verticalLayout->addWidget(mToolInputSelectionWidget);
89     verticalLayout->addWidget(mToolWidget);
90     verticalLayout->setContentsMargins(1, 1, 1, 1);
91     mWidgetForTab->setLayout(verticalLayout);
92     DD(mWidgetForTab->isVisible());
93     mWidgetForTab->setVisible(true);
94     DD(mWidgetForTab->isVisible());*/
95
96       //<----------      mStaticVerticalLayout->addWidget(mWidgetForTab); 
97
98       mTabNumber = parent->GetTab()->addTab(mStaticWidgetForTab, "");
99       DD(mStaticWidgetForTab->isVisible());
100       mStaticWidgetForTab->setVisible(true);
101       DD(mStaticWidgetForTab->isVisible());
102       //      mWidgetForTab->setParent(mStaticWidgetForTab);
103     }
104     else {
105       DD("insert into widget");
106       mStaticVerticalLayout->addWidget(mWidgetForTab);
107       SwapCurrentWidget();
108       mToolWidget->setEnabled(true);
109     }
110     parent->GetTab()->setCurrentIndex(mTabNumber); 
111     buttonBox->hide(); // No OK/Cancel by default in this case
112   }
113 }
114 //------------------------------------------------------------------------------
115
116
117 //------------------------------------------------------------------------------
118 void vvToolWidgetBase::Initialization() 
119 {
120   mCurrentSlicerManager = 0;
121   mIsInitialized = false;
122   mFilter = 0;
123   setWindowModality(Qt::NonModal);
124   // GUI Initialization
125   setupUi(this); ///////////////////////////// TRIAL
126   // Connect signals & slots
127   connect(mMainWindow, SIGNAL(AnImageIsBeingClosed(vvSlicerManager*)), this, SLOT(AnImageIsBeingClosed(vvSlicerManager*)));
128   connect(mMainWindow, SIGNAL(SelectedImageHasChanged(vvSlicerManager*)), this, SLOT(SelectedImageHasChanged(vvSlicerManager*)));
129   connect(mToolInputSelectionWidget, SIGNAL(accepted()), this, SLOT(InputIsSelected()));
130   connect(mToolInputSelectionWidget, SIGNAL(rejected()), this, SLOT(close()));
131   connect(buttonBox, SIGNAL(accepted()), this, SLOT(apply()));
132   connect(buttonBox, SIGNAL(rejected()), this, SLOT(close()));
133
134   // Disable main widget while input image is not selected
135   mToolWidget->setEnabled(false);
136 }
137 //------------------------------------------------------------------------------
138
139
140 //------------------------------------------------------------------------------
141 vvToolWidgetBase::~vvToolWidgetBase()
142 {
143 }
144 //------------------------------------------------------------------------------
145
146
147 //------------------------------------------------------------------------------
148 void vvToolWidgetBase::keyPressEvent(QKeyEvent *event) 
149 {
150  //  DD("KEYPRESSEVENT");
151   if (event->key() == Qt::Key_Escape) {
152     reject();
153     event->accept();
154     return;
155   } 
156   else {
157     QWidget::keyPressEvent(event);
158   }
159   //  event->ignore();
160   //mMainWindow->keyPressEvent(event);
161   // QWidget::keyPressEvent(event);
162 }
163 //------------------------------------------------------------------------------
164
165
166 //------------------------------------------------------------------------------
167 void vvToolWidgetBase::accept()
168 {
169   apply();
170 }
171 //------------------------------------------------------------------------------
172
173
174 //------------------------------------------------------------------------------
175 void vvToolWidgetBase::reject()
176 {
177   close();
178 }
179 //------------------------------------------------------------------------------
180
181
182 //------------------------------------------------------------------------------
183 void vvToolWidgetBase::AddInputSelector(QString s, clitk::ImageToImageGenericFilterBase * f, bool allowSkip)
184 {
185   int j=0;
186   mFilter = f;
187   mSlicerManagersCompatible.clear();
188   mToolInputSelectionWidget->setToolTip(QString("%1").arg(mFilter->GetAvailableImageTypes().c_str()));
189   for(unsigned int i=0; i<mMainWindow->GetSlicerManagers().size(); i++) {
190     vvImage * s = mMainWindow->GetSlicerManagers()[i]->GetImage();
191     if (mFilter->CheckImageType(s->GetNumberOfDimensions(),
192                                 s->GetNumberOfScalarComponents(),
193                                 s->GetScalarTypeAsITKString())) {
194       mSlicerManagersCompatible.push_back(mMainWindow->GetSlicerManagers()[i]);
195       if ((int)i == mMainWindow->GetSlicerManagerCurrentIndex()) mCurrentCompatibleIndex = j;
196       j++;
197     }
198   }
199   if (mSlicerManagersCompatible.size() == 0) {
200     std::ostringstream osstream;
201     osstream << "Sorry, could not perform operation. No (compatible) image. "
202              << mFilter->GetAvailableImageTypes();
203     QMessageBox::information(this, "No image", osstream.str().c_str());
204     reject();
205     return;
206   }
207   if (mPreventToUseTwoToolsOnSameInput) {
208     CheckInputList(mSlicerManagersCompatible, mCurrentCompatibleIndex);
209     if (mSlicerManagersCompatible.size() == 0) {
210       QMessageBox::information(mMainWindow, tr("Error"), "Sorry, no other loaded images can use this tool. Abort");
211       reject();
212       return;
213     }
214   }
215   mToolInputSelectionWidget->AddInputSelector(s, mSlicerManagersCompatible, mCurrentCompatibleIndex, allowSkip);
216 }
217 //------------------------------------------------------------------------------
218
219
220 //------------------------------------------------------------------------------
221 void vvToolWidgetBase::AddInputSelector(QString s, bool allowSkip)
222 {
223   mSlicerManagersCompatible.clear();
224   for(unsigned int i=0; i<mMainWindow->GetSlicerManagers().size(); i++) {
225     mSlicerManagersCompatible.push_back(mMainWindow->GetSlicerManagers()[i]);
226   }
227   if (mMainWindow->GetSlicerManagers().size() == 0) {
228     QMessageBox::information(this, "No image","Sorry, could not perform operation. No (compatible) image.");
229     close();
230     return;
231   }
232   mCurrentCompatibleIndex = mMainWindow->GetSlicerManagerCurrentIndex();
233   if (mPreventToUseTwoToolsOnSameInput) {
234     CheckInputList(mSlicerManagersCompatible,  mCurrentCompatibleIndex);
235     if (mSlicerManagersCompatible.size() == 0) {
236       QMessageBox::information(mMainWindow, tr("Error"), "Sorry, no other loaded images can use this tool. Abort");
237       close();
238       return;
239     }
240   }
241   mToolInputSelectionWidget->AddInputSelector(s, mSlicerManagersCompatible, mCurrentCompatibleIndex, allowSkip);
242 }
243 //------------------------------------------------------------------------------
244
245
246 //------------------------------------------------------------------------------
247 void vvToolWidgetBase::HideInputSelector()
248 {
249   QList<int> s;
250   s.push_back(0);
251   s.push_back(1);
252   splitter->setSizes(s);
253 }
254 //------------------------------------------------------------------------------
255
256
257 //------------------------------------------------------------------------------
258 void vvToolWidgetBase::show()
259 {
260   if (!mIsInitialized) {
261     mToolInputSelectionWidget->Initialize();
262     mIsInitialized = true;
263   }
264   QWidget::show();
265 }
266 //------------------------------------------------------------------------------
267
268
269 //------------------------------------------------------------------------------
270 void vvToolWidgetBase::closeEvent(QCloseEvent *event) 
271 {
272  //  DD("closeEvent");
273   mIsAnotherToolWaitInput = false;
274   if (isWindow()) {
275     event->accept();//return QWidget::close();
276     return;
277   }
278   else {
279     if (!mStaticWidgetForTab) {
280       event->accept();//return QWidget::close();
281       return;
282     }
283     mStaticVerticalLayout->removeWidget(mWidgetForTab);
284     mWidgetForTab->close();
285     delete mWidgetForTab;
286     QList<QObject*> l =mStaticWidgetForTab->children(); 
287     if (l.size() > 1) {
288       QWidget * c = dynamic_cast<QWidget*>(l[1]);
289       c->setVisible(true);
290     }
291   }
292   event->accept();
293 }
294 //------------------------------------------------------------------------------
295
296
297 //------------------------------------------------------------------------------
298 bool vvToolWidgetBase::close()
299 {
300   // DD("vvToolWidgetBase::close()");
301   QApplication::restoreOverrideCursor();
302   return QWidget::close();
303 }
304 //------------------------------------------------------------------------------
305
306
307 //------------------------------------------------------------------------------
308 void vvToolWidgetBase::AnImageIsBeingClosed(vvSlicerManager * m)
309 {
310   mToolInputSelectionWidget->AnImageIsBeingClosed(m);
311   if (m == mCurrentSlicerManager) {
312     close();
313   }
314 }
315 //------------------------------------------------------------------------------
316
317
318 //------------------------------------------------------------------------------
319 void vvToolWidgetBase::SwapCurrentWidget()
320 {
321   mStaticWidgetForTab->setUpdatesEnabled(false);
322   QList<QObject*> l =mStaticWidgetForTab->children(); 
323   for(int i=1; i<l.size(); i++) {
324     QWidget * c = dynamic_cast<QWidget*>(l[i]);
325     if (l[i] == mWidgetForTab) {
326       c->setVisible(true);
327     }
328     else {
329       c->setVisible(false);
330     }
331   } 
332   mStaticWidgetForTab->setUpdatesEnabled(true);
333 }
334 //------------------------------------------------------------------------------
335
336
337 //------------------------------------------------------------------------------
338 void vvToolWidgetBase::SelectedImageHasChanged(vvSlicerManager * m)
339 {
340   if (!isWindow()) { // When the tool is not in a window, it is in a tab : we only display if needed
341     if (mCurrentSlicerManager == NULL) return;
342     if (mToolWidget == NULL) return;
343     if (m != mCurrentSlicerManager) { // current tool is not selected
344       mToolWidget->setEnabled(false);
345     }
346     else { // The current tool is selected
347       SwapCurrentWidget();
348       mToolWidget->setEnabled(true);
349     }
350   }
351 }
352 //------------------------------------------------------------------------------
353
354
355 //------------------------------------------------------------------------------
356 void vvToolWidgetBase::InitializeInputs()
357 {
358 }
359 //------------------------------------------------------------------------------
360
361
362 //------------------------------------------------------------------------------
363 void vvToolWidgetBase::InputIsSelected()
364 {
365   //  DD("vvToolWidgetBase::InputIsSelected()");
366   //DD(mWidgetForTab->isVisible());
367   //DD(mToolWidget->isVisible());
368   //DD(mStaticWidgetForTab->isVisible());
369
370   buttonBox->setEnabled(true);
371   std::vector<vvSlicerManager*> & l = mToolInputSelectionWidget->GetSelectedInputs();
372   mCurrentSlicerManager = l[0];
373   mCurrentImage = mCurrentSlicerManager->GetImage();
374   mToolWidget->setEnabled(true);
375   if (!mCurrentSlicerManager) close();
376   if (l.size() == 1) InputIsSelected(mCurrentSlicerManager);
377   else InputIsSelected(l);
378   mIsAnotherToolWaitInput = false;
379 }
380 //------------------------------------------------------------------------------
381
382
383 //------------------------------------------------------------------------------
384 void vvToolWidgetBase::InputIsSelected(vvSlicerManager * m)
385 {
386   std::cerr << "You MUST overwrite this method vvToolWidgetBase::InputIsSelected(vvSlicerManager * m) if you use one single input" << std::endl;
387   exit(0);
388 }
389 //------------------------------------------------------------------------------
390
391
392 //------------------------------------------------------------------------------
393 void vvToolWidgetBase::InputIsSelected(std::vector<vvSlicerManager*> & l)
394 {
395   buttonBox->setEnabled(true);
396   if (l.size() == 1) InputIsSelected(l[0]);
397   else {
398     std::cerr << "You MUST overwrite this method vvToolWidgetBase::InputIsSelected(vector<vvSlicerManager *> m) if you use several input" << std::endl;
399     exit(0);
400   }
401 }
402 //------------------------------------------------------------------------------