Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkMxNMultiWidget.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 
13 #include "QmitkMxNMultiWidget.h"
15 
16 // mitk core
20 
21 // qt
22 #include <QGridLayout>
23 
25  Qt::WindowFlags f/* = 0*/,
26  const QString& multiWidgetName/* = "mxnmulti"*/)
27  : QmitkAbstractMultiWidget(parent, f, multiWidgetName)
28  , m_CrosshairVisibility(false)
29 {
30  // nothing here
31 }
32 
34 {
35  SetLayout(1, 1);
36  ActivateMenuWidget(true);
37  SetDisplayActionEventHandler(std::make_unique<mitk::DisplayActionEventHandlerDesynchronized>());
38  auto displayActionEventHandler = GetDisplayActionEventHandler();
39  if (nullptr != displayActionEventHandler)
40  {
41  displayActionEventHandler->InitActions();
42  }
43 }
44 
46 {
48 }
49 
51 {
53 }
54 
55 void QmitkMxNMultiWidget::Synchronize(bool synchronized)
56 {
57  if (synchronized)
58  {
59  SetDisplayActionEventHandler(std::make_unique<mitk::DisplayActionEventHandlerSynchronized>());
60  }
61  else
62  {
63  SetDisplayActionEventHandler(std::make_unique<mitk::DisplayActionEventHandlerDesynchronized>());
64  }
65 
66  auto displayActionEventHandler = GetDisplayActionEventHandler();
67  if (nullptr != displayActionEventHandler)
68  {
69  displayActionEventHandler->InitActions();
70  }
71 }
72 
74 {
75  if ("axial" == widgetName || "sagittal" == widgetName || "coronal" == widgetName || "3d" == widgetName)
76  {
77  return GetActiveRenderWindowWidget()->GetRenderWindow();
78  }
79 
81 }
82 
84 {
85  // currently no mapping between view directions and render windows
86  // simply return the currently active render window
87  return GetActiveRenderWindowWidget()->GetRenderWindow();
88 }
89 
91 {
92  auto currentActiveRenderWindowWidget = GetActiveRenderWindowWidget();
93  if (currentActiveRenderWindowWidget == activeRenderWindowWidget)
94  {
95  return;
96  }
97 
98  // reset the decoration color of the previously active render window widget
99  if (nullptr != currentActiveRenderWindowWidget)
100  {
101  auto decorationColor = currentActiveRenderWindowWidget->GetDecorationColor();
102  QColor hexColor(decorationColor[0] * 255, decorationColor[1] * 255, decorationColor[2] * 255);
103  currentActiveRenderWindowWidget->setStyleSheet("border: 2px solid " + hexColor.name(QColor::HexRgb));
104  }
105 
106  // set the new decoration color of the currently active render window widget
107  if (nullptr != activeRenderWindowWidget)
108  {
109  activeRenderWindowWidget->setStyleSheet("border: 2px solid #FF6464");
110  }
111 
113 }
114 
115 void QmitkMxNMultiWidget::SetSelectedPosition(const mitk::Point3D& newPosition, const QString& widgetName)
116 {
117  RenderWindowWidgetPointer renderWindowWidget;
118  if (widgetName.isNull())
119  {
120  renderWindowWidget = GetActiveRenderWindowWidget();
121  }
122  else
123  {
124  renderWindowWidget = GetRenderWindowWidget(widgetName);
125  }
126 
127  if (nullptr != renderWindowWidget)
128  {
129  renderWindowWidget->GetSliceNavigationController()->SelectSliceByPoint(newPosition);
130  renderWindowWidget->RequestUpdate();
131  return;
132  }
133 
134  MITK_ERROR << "Position can not be set for an unknown render window widget.";
135 }
136 
137 const mitk::Point3D QmitkMxNMultiWidget::GetSelectedPosition(const QString& /*widgetName*/) const
138 {
139  // see T26208
140  return mitk::Point3D();
141 }
142 
144 {
145  auto renderWindowWidgets = GetRenderWindowWidgets();
146  for (const auto& renderWindowWidget : renderWindowWidgets)
147  {
148  renderWindowWidget.second->ActivateCrosshair(activate);
149  }
150 
151  m_CrosshairVisibility = activate;
152 }
153 
155 {
156  auto dataStorage = GetDataStorage();
157  if (nullptr == dataStorage)
158  {
159  return;
160  }
161 
163 
165 }
166 
168 {
169  MITK_DEBUG << "Changing crosshair mode to " << userMode;
170 
171  switch (userMode)
172  {
173  case 0:
175  break;
176  case 1:
178  break;
179  case 2:
181  break;
182  case 3:
184  break;
185  }
186 }
187 
189 // PUBLIC SLOTS
190 // MOUSE EVENTS
193 {
194  emit WheelMoved(e);
195 }
196 
198 {
199  if (QEvent::MouseButtonPress != e->type())
200  {
201  return;
202  }
203 
204  auto renderWindowWidget = dynamic_cast<QmitkRenderWindowWidget*>(this->sender());
205  if (nullptr == renderWindowWidget)
206  {
207  return;
208  }
209 
210  auto renderWindowWidgetPointer = GetRenderWindowWidget(renderWindowWidget->GetWidgetName());
211  SetActiveRenderWindowWidget(renderWindowWidgetPointer);
212 }
213 
215 {
216  QWidget::moveEvent(e);
217 
218  // it is necessary to readjust the position of the overlays as the MultiWidget has moved
219  // unfortunately it's not done by QmitkRenderWindow::moveEvent -> must be done here
220  emit Moved();
221 }
222 
224 // PRIVATE
226 void QmitkMxNMultiWidget::SetLayoutImpl()
227 {
228  int requiredRenderWindowWidgets = GetRowCount() * GetColumnCount();
229  int existingRenderWindowWidgets = GetRenderWindowWidgets().size();
230 
231  int difference = requiredRenderWindowWidgets - existingRenderWindowWidgets;
232  while (0 < difference)
233  {
234  // more render window widgets needed
235  CreateRenderWindowWidget();
236  --difference;
237  }
238 
239  while (0 > difference)
240  {
241  // less render window widgets needed
243  ++difference;
244  }
245 
246  auto firstRenderWindowWidget = GetFirstRenderWindowWidget();
247  if (nullptr != firstRenderWindowWidget)
248  {
249  SetActiveRenderWindowWidget(firstRenderWindowWidget);
250  }
251 
253 }
254 
255 void QmitkMxNMultiWidget::CreateRenderWindowWidget()
256 {
257  // create the render window widget and connect signal / slot
258  QString renderWindowWidgetName = GetNameFromIndex(GetNumberOfRenderWindowWidgets());
259  RenderWindowWidgetPointer renderWindowWidget = std::make_shared<QmitkRenderWindowWidget>(this, renderWindowWidgetName, GetDataStorage());
260  renderWindowWidget->SetCornerAnnotationText(renderWindowWidgetName.toStdString());
261 
262  connect(renderWindowWidget.get(), &QmitkRenderWindowWidget::MouseEvent, this, &QmitkMxNMultiWidget::mousePressEvent);
263 
264  AddRenderWindowWidget(renderWindowWidgetName, renderWindowWidget);
265 
266  auto renderWindow = renderWindowWidget->GetRenderWindow();
267  auto layoutManager = GetMultiWidgetLayoutManager();
272 }
void LayoutDesignChanged(QmitkRenderWindowMenu::LayoutDesign)
QmitkRenderWindow * GetRenderWindow(int row, int column) const
virtual void ActivateMenuWidget(bool state)
virtual void AddRenderWindowWidget(const QString &widgetName, RenderWindowWidgetPointer renderWindowWidget)
void SetWidgetPlaneMode(int userMode) override
void mousePressEvent(QMouseEvent *e) override
QmitkMultiWidgetLayoutManager * GetMultiWidgetLayoutManager() const
RenderWindowWidgetMap GetRenderWindowWidgets() const
RenderWindowWidgetPointer GetRenderWindowWidget(int row, int column) const
#define MITK_ERROR
Definition: mitkLogMacros.h:20
void SetCrosshairVisibility(bool activate) override
#define MITK_DEBUG
Definition: mitkLogMacros.h:22
void MultiWidgetOpened() override
unsigned int GetNumberOfRenderWindowWidgets() const
const mitk::Point3D GetSelectedPosition(const QString &widgetName) const override
The &#39;QmitkRenderWindowWidget&#39; is a QFrame that holds a render window and some associates properties...
void wheelEvent(QWheelEvent *e) override
void moveEvent(QMoveEvent *e) override
void SetSelectedPosition(const mitk::Point3D &newPosition, const QString &widgetName) override
std::shared_ptr< QmitkRenderWindowWidget > RenderWindowWidgetPointer
RenderWindowWidgetPointer GetActiveRenderWindowWidget() const
void InitializeMultiWidget() override
static RenderingManager * GetInstance()
void SetDisplayActionEventHandler(std::unique_ptr< mitk::DisplayActionEventHandler > displayActionEventHandler)
virtual void SetLayout(int row, int column)
void CrosshairRotationModeChanged(int)
QmitkRenderWindow * GetRenderWindow(const QString &widgetName) const override
MITK implementation of the QVTKWidget.
void CrosshairVisibilityChanged(bool)
Point< ScalarType, 3 > Point3D
Definition: mitkPoint.h:95
mitk::DisplayActionEventHandler * GetDisplayActionEventHandler()
virtual void SetInteractionScheme(mitk::InteractionSchemeSwitcher::InteractionScheme scheme)
void Synchronize(bool synchronized) override
void SetActiveRenderWindowWidget(RenderWindowWidgetPointer activeRenderWindowWidget) override
void ResetCrosshair() override
void MultiWidgetClosed() override
virtual QString GetNameFromIndex(int row, int column) const
virtual void SetActiveRenderWindowWidget(RenderWindowWidgetPointer activeRenderWindowWidget)
ViewDirection
Possible view directions for render windows.
mitk::DataStorage * GetDataStorage() const
The &#39;QmitkAbstractMultiWidget&#39; is a &#39;QWidget&#39; that can be subclassed to display multiple render windo...
void MouseEvent(QMouseEvent *e)
virtual void InitializeViewsByBoundingObjects(const DataStorage *)
Initializes the renderwindows by the aggregated geometry of all objects that are held in the data sto...
void WheelMoved(QWheelEvent *)
RenderWindowWidgetPointer GetFirstRenderWindowWidget() const
void SetLayoutDesign(LayoutDesign layoutDesign)
This function is called by render window widgets. Given a specific layout design the layout of the mu...
QmitkMxNMultiWidget(QWidget *parent=nullptr, Qt::WindowFlags f=0, const QString &multiWidgetName="mxnmulti")