Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkMultiWidgetLayoutManager.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
14 
15 #include <mitkLogMacros.h>
17 #include <QmitkRenderWindow.h>
19 
20 // qt
21 #include <QHBoxLayout>
22 #include <qsplitter.h>
23 
25  : QObject(multiwidget)
26  , m_MultiWidget(multiwidget)
27  , m_CurrentRenderWindowWidget(nullptr)
28 {
29  // nothing here
30 }
31 
33 {
34  if (nullptr == m_MultiWidget)
35  {
36  return;
37  }
38 
39  // retrieve the render window name from the sending render window
40  auto renderWindow = dynamic_cast<QmitkRenderWindow*>(QObject::sender());
41  m_CurrentRenderWindowWidget = m_MultiWidget->GetRenderWindowWidget(renderWindow).get();
42 
43  switch (layoutDesign)
44  {
46  {
48  break;
49  }
51  {
53  break;
54  }
56  {
58  break;
59  }
61  {
63  break;
64  }
66  {
68  break;
69  }
71  {
73  break;
74  }
76  {
78  break;
79  }
81  {
83  break;
84  }
86  {
88  break;
89  }
91  {
93  break;
94  }
96  {
98  break;
99  }
100  case LayoutDesign::NONE:
101  {
102  break;
103  }
104  };
105 }
106 
108 {
109  m_CurrentRenderWindowWidget = renderWindowWidget;
110 }
111 
113 {
114  MITK_INFO << "Set default layout" << std::endl;
115 
116  m_MultiWidget->ActivateMenuWidget(false);
117 
118  delete m_MultiWidget->layout();
119 
120  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
121  hBoxLayout->setContentsMargins(0, 0, 0, 0);
122  m_MultiWidget->setLayout(hBoxLayout);
123  hBoxLayout->setMargin(0);
124 
125  auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget);
126  hBoxLayout->addWidget(mainSplit);
127 
128  QList<int> splitterSizeRow;
129  for (int row = 0; row < m_MultiWidget->GetRowCount(); ++row)
130  {
131  splitterSizeRow.push_back(1000);
132 
133  QList<int> splitterSizeColumn;
134  auto splitter = new QSplitter(mainSplit);
135  for (int column = 0; column < m_MultiWidget->GetColumnCount(); ++column)
136  {
137  splitterSizeColumn.push_back(1000);
138  auto renderWindowWidget = m_MultiWidget->GetRenderWindowWidget(row, column);
139  splitter->addWidget(renderWindowWidget.get());
140  renderWindowWidget->show();
141  }
142  splitter->setSizes(splitterSizeColumn);
143  }
144 
145  mainSplit->setSizes(splitterSizeRow);
146 
147  m_MultiWidget->ActivateMenuWidget(true);
148 
149  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
150  for (auto& renderWindow : allRenderWindows)
151  {
152  renderWindow->LayoutDesignListChanged(LayoutDesign::DEFAULT);
153  }
154 }
155 
157 {
158  MITK_INFO << "Set all 2D top and 3D bottom layout" << std::endl;
159 
160  m_MultiWidget->ActivateMenuWidget(false);
161 
162  delete m_MultiWidget->layout();
163 
164  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
165  hBoxLayout->setContentsMargins(0, 0, 0, 0);
166  m_MultiWidget->setLayout(hBoxLayout);
167  hBoxLayout->setMargin(0);
168 
169  auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget);
170  hBoxLayout->addWidget(mainSplit);
171 
172  auto subSplit2D = new QSplitter(mainSplit);
173  QList<int> splitterSize;
174  auto all2DRenderWindowWidgets = m_MultiWidget->Get2DRenderWindowWidgets();
175  for (const auto& renderWindowWidget : all2DRenderWindowWidgets)
176  {
177  subSplit2D->addWidget(renderWindowWidget.second.get());
178  renderWindowWidget.second->show();
179  splitterSize.push_back(1000);
180  }
181  subSplit2D->setSizes(splitterSize);
182 
183  auto subSplit3D = new QSplitter(mainSplit);
184  splitterSize.clear();
185  auto all3DRenderWindowWidgets = m_MultiWidget->Get3DRenderWindowWidgets();
186  for (const auto& renderWindowWidget : all3DRenderWindowWidgets)
187  {
188  subSplit3D->addWidget(renderWindowWidget.second.get());
189  renderWindowWidget.second->show();
190  splitterSize.push_back(1000);
191  }
192  subSplit3D->setSizes(splitterSize);
193 
194  // set size for main splitter
195  splitterSize.clear();
196  splitterSize.push_back(600);
197  splitterSize.push_back(1000);
198  mainSplit->setSizes(splitterSize);
199 
200  m_MultiWidget->ActivateMenuWidget(true);
201 
202  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
203  for (auto& renderWindow : allRenderWindows)
204  {
205  renderWindow->LayoutDesignListChanged(LayoutDesign::ALL_2D_TOP_3D_BOTTOM);
206  }
207 }
208 
210 {
211  MITK_INFO << "Set all 2D left and 3D right layout" << std::endl;
212 
213  m_MultiWidget->ActivateMenuWidget(false);
214 
215  delete m_MultiWidget->layout();
216 
217  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
218  hBoxLayout->setContentsMargins(0, 0, 0, 0);
219  m_MultiWidget->setLayout(hBoxLayout);
220  hBoxLayout->setMargin(0);
221 
222  auto mainSplit = new QSplitter(m_MultiWidget);
223  hBoxLayout->addWidget(mainSplit);
224 
225  auto subSplit2D = new QSplitter(Qt::Vertical, mainSplit);
226  QList<int> splitterSize;
227  auto all2DRenderWindowWidgets = m_MultiWidget->Get2DRenderWindowWidgets();
228  for (const auto& renderWindowWidget : all2DRenderWindowWidgets)
229  {
230  subSplit2D->addWidget(renderWindowWidget.second.get());
231  renderWindowWidget.second->show();
232  splitterSize.push_back(1000);
233  }
234  subSplit2D->setSizes(splitterSize);
235 
236  auto subSplit3D = new QSplitter(mainSplit);
237  splitterSize.clear();
238  auto all3DRenderWindowWidgets = m_MultiWidget->Get3DRenderWindowWidgets();
239  for (const auto& renderWindowWidget : all3DRenderWindowWidgets)
240  {
241  subSplit3D->addWidget(renderWindowWidget.second.get());
242  renderWindowWidget.second->show();
243  splitterSize.push_back(1000);
244  }
245  subSplit3D->setSizes(splitterSize);
246 
247  // set size for main splitter
248  splitterSize.clear();
249  splitterSize.push_back(600);
250  splitterSize.push_back(1000);
251  mainSplit->setSizes(splitterSize);
252 
253  m_MultiWidget->ActivateMenuWidget(true);
254 
255  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
256  for (auto& renderWindow : allRenderWindows)
257  {
258  renderWindow->LayoutDesignListChanged(LayoutDesign::ALL_2D_LEFT_3D_RIGHT);
259  }
260 }
261 
263 {
264  MITK_INFO << "Set single 2D layout" << std::endl;
265 
266  m_MultiWidget->ActivateMenuWidget(false);
267 
268  delete m_MultiWidget->layout();
269 
270  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
271  hBoxLayout->setContentsMargins(0, 0, 0, 0);
272  m_MultiWidget->setLayout(hBoxLayout);
273  hBoxLayout->setMargin(0);
274 
275  auto mainSplit = new QSplitter(m_MultiWidget);
276  hBoxLayout->addWidget(mainSplit);
277  mainSplit->addWidget(m_CurrentRenderWindowWidget);
278  m_CurrentRenderWindowWidget->show();
279 
280  m_MultiWidget->ActivateMenuWidget(true);
281 
282  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
283  for (auto& renderWindow : allRenderWindows)
284  {
285  renderWindow->LayoutDesignListChanged(LayoutDesign::ONE_BIG);
286  }
287 }
288 
290 {
291  MITK_INFO << "Set only 2D layout" << std::endl;
292 
293  m_MultiWidget->ActivateMenuWidget(false);
294 
295  delete m_MultiWidget->layout();
296 
297  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
298  hBoxLayout->setContentsMargins(0, 0, 0, 0);
299  m_MultiWidget->setLayout(hBoxLayout);
300  hBoxLayout->setMargin(0);
301 
302  auto mainSplit = new QSplitter(m_MultiWidget);
303  hBoxLayout->addWidget(mainSplit);
304 
305  QList<int> splitterSize;
306  auto all2DRenderWindowWidgets = m_MultiWidget->Get2DRenderWindowWidgets();
307  for (const auto& renderWindowWidget : all2DRenderWindowWidgets)
308  {
309  mainSplit->addWidget(renderWindowWidget.second.get());
310  renderWindowWidget.second->show();
311  splitterSize.push_back(1000);
312  }
313  mainSplit->setSizes(splitterSize);
314 
315  m_MultiWidget->ActivateMenuWidget(true);
316 
317  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
318  for (auto& renderWindow : allRenderWindows)
319  {
320  renderWindow->LayoutDesignListChanged(LayoutDesign::ONLY_2D_HORIZONTAL);
321  }
322 }
323 
325 {
326  MITK_INFO << "Set only 2D layout" << std::endl;
327 
328  m_MultiWidget->ActivateMenuWidget(false);
329 
330  delete m_MultiWidget->layout();
331 
332  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
333  hBoxLayout->setContentsMargins(0, 0, 0, 0);
334  m_MultiWidget->setLayout(hBoxLayout);
335  hBoxLayout->setMargin(0);
336 
337  auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget);
338  hBoxLayout->addWidget(mainSplit);
339 
340  QList<int> splitterSize;
341  auto all2DRenderWindowWidgets = m_MultiWidget->Get2DRenderWindowWidgets();
342  for (const auto& renderWindowWidget : all2DRenderWindowWidgets)
343  {
344  mainSplit->addWidget(renderWindowWidget.second.get());
345  renderWindowWidget.second->show();
346  splitterSize.push_back(1000);
347  }
348  mainSplit->setSizes(splitterSize);
349 
350  m_MultiWidget->ActivateMenuWidget(true);
351 
352  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
353  for (auto& renderWindow : allRenderWindows)
354  {
355  renderWindow->LayoutDesignListChanged(LayoutDesign::ONLY_2D_VERTICAL);
356  }
357 }
358 
360 {
361  MITK_INFO << "Set one top and all 3D bottom layout" << std::endl;
362 
363  m_MultiWidget->ActivateMenuWidget(false);
364 
365  delete m_MultiWidget->layout();
366 
367  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
368  hBoxLayout->setContentsMargins(0, 0, 0, 0);
369  m_MultiWidget->setLayout(hBoxLayout);
370  hBoxLayout->setMargin(0);
371 
372  auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget);
373  hBoxLayout->addWidget(mainSplit);
374 
375  mainSplit->addWidget(m_CurrentRenderWindowWidget);
376  m_CurrentRenderWindowWidget->show();
377 
378  auto subSplit3D = new QSplitter(mainSplit);
379  QList<int> splitterSize;
380  auto all3DRenderWindowWidgets = m_MultiWidget->Get3DRenderWindowWidgets();
381  for (const auto& renderWindowWidget : all3DRenderWindowWidgets)
382  {
383  subSplit3D->addWidget(renderWindowWidget.second.get());
384  renderWindowWidget.second->show();
385  splitterSize.push_back(1000);
386  }
387  subSplit3D->setSizes(splitterSize);
388 
389  // set size for main splitter
390  splitterSize.clear();
391  splitterSize.push_back(1000);
392  splitterSize.push_back(1000);
393  mainSplit->setSizes(splitterSize);
394 
395  m_MultiWidget->ActivateMenuWidget(true);
396 
397  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
398  for (auto& renderWindow : allRenderWindows)
399  {
400  renderWindow->LayoutDesignListChanged(LayoutDesign::ONE_TOP_3D_BOTTOM);
401  }
402 }
403 
405 {
406  MITK_INFO << "Set one left and all 3D right layout" << std::endl;
407 
408  m_MultiWidget->ActivateMenuWidget(false);
409 
410  delete m_MultiWidget->layout();
411 
412  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
413  hBoxLayout->setContentsMargins(0, 0, 0, 0);
414  m_MultiWidget->setLayout(hBoxLayout);
415  hBoxLayout->setMargin(0);
416 
417  auto mainSplit = new QSplitter(m_MultiWidget);
418  hBoxLayout->addWidget(mainSplit);
419 
420  mainSplit->addWidget(m_CurrentRenderWindowWidget);
421  m_CurrentRenderWindowWidget->show();
422 
423  auto subSplit3D = new QSplitter(Qt::Vertical, mainSplit);
424  QList<int> splitterSize;
425  auto all3DRenderWindowWidgets = m_MultiWidget->Get3DRenderWindowWidgets();
426  for (const auto& renderWindowWidget : all3DRenderWindowWidgets)
427  {
428  subSplit3D->addWidget(renderWindowWidget.second.get());
429  renderWindowWidget.second->show();
430  splitterSize.push_back(1000);
431  }
432  subSplit3D->setSizes(splitterSize);
433 
434  // set size for main splitter
435  splitterSize.clear();
436  splitterSize.push_back(1000);
437  splitterSize.push_back(1000);
438  mainSplit->setSizes(splitterSize);
439 
440  m_MultiWidget->ActivateMenuWidget(true);
441 
442  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
443  for (auto& renderWindow : allRenderWindows)
444  {
445  renderWindow->LayoutDesignListChanged(LayoutDesign::ONE_LEFT_3D_RIGHT);
446  }
447 }
448 
450 {
451  MITK_INFO << "Set default layout" << std::endl;
452 
453  m_MultiWidget->ActivateMenuWidget(false);
454 
455  delete m_MultiWidget->layout();
456 
457  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
458  hBoxLayout->setContentsMargins(0, 0, 0, 0);
459  m_MultiWidget->setLayout(hBoxLayout);
460  hBoxLayout->setMargin(0);
461 
462  auto mainSplit = new QSplitter(m_MultiWidget);
463  hBoxLayout->addWidget(mainSplit);
464 
465  QList<int> splitterSize;
466  auto allRenderWindowWidgets = m_MultiWidget->GetRenderWindowWidgets();
467  for (const auto& renderWindowWidget : allRenderWindowWidgets)
468  {
469  if (nullptr != renderWindowWidget.second)
470  {
471  mainSplit->addWidget(renderWindowWidget.second.get());
472  renderWindowWidget.second->show();
473  splitterSize.push_back(1000);
474  }
475  }
476 
477  // set size for main splitter
478  mainSplit->setSizes(splitterSize);
479 
480  m_MultiWidget->ActivateMenuWidget(true);
481 
482  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
483  for (auto& renderWindow : allRenderWindows)
484  {
485  renderWindow->LayoutDesignListChanged(LayoutDesign::ALL_HORIZONTAL);
486  }
487 }
488 
490 {
491  MITK_INFO << "Set all vertical" << std::endl;
492 
493  m_MultiWidget->ActivateMenuWidget(false);
494 
495  delete m_MultiWidget->layout();
496 
497  auto hBoxLayout = new QHBoxLayout(m_MultiWidget);
498  hBoxLayout->setContentsMargins(0, 0, 0, 0);
499  m_MultiWidget->setLayout(hBoxLayout);
500  hBoxLayout->setMargin(0);
501 
502  auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget);
503  hBoxLayout->addWidget(mainSplit);
504 
505  QList<int> splitterSize;
506  auto allRenderWindowWidgets = m_MultiWidget->GetRenderWindowWidgets();
507  for (const auto& renderWindowWidget : allRenderWindowWidgets)
508  {
509  mainSplit->addWidget(renderWindowWidget.second.get());
510  renderWindowWidget.second->show();
511  splitterSize.push_back(1000);
512  }
513 
514  // set size for splitter
515  mainSplit->setSizes(splitterSize);
516 
517  m_MultiWidget->ActivateMenuWidget(true);
518 
519  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
520  for (auto& renderWindow : allRenderWindows)
521  {
522  renderWindow->LayoutDesignListChanged(LayoutDesign::ALL_VERTICAL);
523  }
524 }
525 
527 {
528  MITK_INFO << "Remove single render window" << std::endl;
529 
530  m_MultiWidget->ActivateMenuWidget(false);
531 
532  m_CurrentRenderWindowWidget->hide();
533 
534  m_MultiWidget->ActivateMenuWidget(true);
535 
536  auto allRenderWindows = m_MultiWidget->GetRenderWindows();
537  for (auto& renderWindow : allRenderWindows)
538  {
539  renderWindow->LayoutDesignListChanged(LayoutDesign::NONE);
540  }
541 }
virtual void ActivateMenuWidget(bool state)
void SetOneLeft3DRightLayout()
The current render window is put beneath all 3D render windows, which are spread vertically beneath t...
void SetAllHorizontalLayout()
All 2D and 3D render windows are spread horizontally.
void SetOneBigLayout()
The current render window is displayed as a single &#39;full screen&#39; render window.
RenderWindowWidgetMap GetRenderWindowWidgets() const
#define MITK_INFO
Definition: mitkLogMacros.h:18
QmitkMultiWidgetLayoutManager(QmitkAbstractMultiWidget *multiwidget)
RenderWindowWidgetPointer GetRenderWindowWidget(int row, int column) const
void SetOnly2DHorizontalLayout()
All 2D render windows are spread horizontally, no 3D render windows.
The &#39;QmitkRenderWindowWidget&#39; is a QFrame that holds a render window and some associates properties...
RenderWindowHash GetRenderWindows() const
RenderWindowWidgetMap Get2DRenderWindowWidgets() const
RenderWindowWidgetMap Get3DRenderWindowWidgets() const
void SetAll2DLeft3DRightLayout()
All 2D render windows are spread vertically beneath all 3D render windows.
void SetOnly2DVerticalLayout()
All 2D render windows are spread vertically, no 3D render windows.
void SetDefaultLayout()
The default layout shows all render windows in a rectangle.
void SetAllVerticalLayout()
All 2D and 3D render windows are spread vertically.
MITK implementation of the QVTKWidget.
void SetCurrentRenderWindowWidget(QmitkRenderWindowWidget *renderWindowWidget)
Allow setting the current render window widget without relying on the sending object.
void SetOneTop3DBottomLayout()
The current render window is put above all 3D render windows, which are spread horizontally below the...
void RemoveOneLayout()
Hide the current render window.
The &#39;QmitkAbstractMultiWidget&#39; is a &#39;QWidget&#39; that can be subclassed to display multiple render windo...
void SetLayoutDesign(LayoutDesign layoutDesign)
This function is called by render window widgets. Given a specific layout design the layout of the mu...
void SetAll2DTop3DBottomLayout()
All 2D render windows are spread horizontally above all 3D render windows.