Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkDataNodeContextMenu.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 <QmitkCustomVariants.h>
16 #include <QmitkFileSaveAction.h>
18 
19 #include <mitkDataNodeSelection.h>
20 #include <mitkIContextMenuAction.h>
21 
23 #include <berryIContributor.h>
25 #include <berryISelectionService.h>
26 #include <berryPlatform.h>
27 
29  : QMenu(parent),
30  m_Parent(parent),
31  m_WorkbenchPartSite(workbenchPartSite)
32 {
33  this->InitNodeDescriptors();
34  this->InitDefaultActions();
35  this->InitExtensionPointActions();
36 }
37 
39 {
40  for (auto& descriptorActionPair : m_DescriptorActionList)
41  descriptorActionPair.first->RemoveAction(descriptorActionPair.second);
42 }
43 
45 {
46  m_DataStorage = dataStorage;
47 
48  for (auto& descriptorActionPair : m_DescriptorActionList)
49  {
50  auto dataNodeAction = dynamic_cast<QmitkAbstractDataNodeAction*>(descriptorActionPair.second);
51 
52  if (nullptr != dataNodeAction)
53  dataNodeAction->SetDataStorage(dataStorage);
54  }
55 }
56 
58 {
59  m_BaseRenderer = baseRenderer;
60 
61  for (auto& descriptorActionPair : m_DescriptorActionList)
62  {
63  auto dataNodeAction = dynamic_cast<QmitkAbstractDataNodeAction*>(descriptorActionPair.second);
64 
65  if (nullptr != dataNodeAction)
66  dataNodeAction->SetBaseRenderer(baseRenderer);
67  }
68 }
69 
71 {
72  m_SurfaceDecimation = surfaceDecimation;
73 }
74 
75 void QmitkDataNodeContextMenu::SetSelectedNodes(const QList<mitk::DataNode::Pointer>& selectedNodes)
76 {
77  m_SelectedNodes = selectedNodes;
78 }
79 
80 void QmitkDataNodeContextMenu::InitNodeDescriptors()
81 {
82  auto nodeDescriptorManager = QmitkNodeDescriptorManager::GetInstance();
83 
84  m_UnknownDataNodeDescriptor = nodeDescriptorManager->GetUnknownDataNodeDescriptor();
85  m_ImageDataNodeDescriptor = nodeDescriptorManager->GetDescriptor("Image");
86  m_MultiComponentImageDataNodeDescriptor = nodeDescriptorManager->GetDescriptor("MultiComponentImage");
87  m_DiffusionImageDataNodeDescriptor = nodeDescriptorManager->GetDescriptor("DiffusionImage");
88  m_FiberBundleDataNodeDescriptor = nodeDescriptorManager->GetDescriptor("FiberBundle");
89  m_PeakImageDataNodeDescriptor = nodeDescriptorManager->GetDescriptor("PeakImage");
90  m_SegmentDataNodeDescriptor = nodeDescriptorManager->GetDescriptor("Segment");
91  m_SurfaceDataNodeDescriptor = nodeDescriptorManager->GetDescriptor("Surface");
92  m_PointSetNodeDescriptor = nodeDescriptorManager->GetDescriptor("PointSet");
93  m_PlanarLineNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarLine");
94  m_PlanarCircleNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarCircle");
95  m_PlanarEllipseNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarEllipse");
96  m_PlanarAngleNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarAngle");
97  m_PlanarFourPointAngleNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarFourPointAngle");
98  m_PlanarRectangleNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarRectangle");
99  m_PlanarPolygonNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarPolygon");
100  m_PlanarPathNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarPath");
101  m_PlanarDoubleEllipseNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarDoubleEllipse");
102  m_PlanarBezierCurveNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarBezierCurve");
103  m_PlanarSubdivisionPolygonNodeDescriptor = nodeDescriptorManager->GetDescriptor("PlanarSubdivisionPolygon");
104 }
105 
106 void QmitkDataNodeContextMenu::InitDefaultActions()
107 {
108  auto workbenchPartSite = m_WorkbenchPartSite.Lock();
109 
110  m_GlobalReinitAction = new QmitkDataNodeGlobalReinitAction(m_Parent, workbenchPartSite);
111  m_GlobalReinitAction->setIcon(QIcon(":/org.mitk.gui.qt.datamanager/Refresh_48.png"));
112  m_UnknownDataNodeDescriptor->AddAction(m_GlobalReinitAction, true);
113  m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, m_GlobalReinitAction));
114 
115  m_ReinitAction = new QmitkDataNodeReinitAction(m_Parent, workbenchPartSite);
116  m_ReinitAction->setIcon(QIcon(":/org.mitk.gui.qt.datamanager/Refresh_48.png"));
117  m_UnknownDataNodeDescriptor->AddAction(m_ReinitAction, true);
118  m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, m_ReinitAction));
119 
120  QAction* saveAction = new QmitkFileSaveAction(QIcon(":/org.mitk.gui.qt.datamanager/Save_48.png"), workbenchPartSite->GetWorkbenchWindow());
121  m_UnknownDataNodeDescriptor->AddAction(saveAction, true);
122  m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, saveAction));
123 
124  m_RemoveAction = new QmitkDataNodeRemoveAction(m_Parent, workbenchPartSite);
125  m_RemoveAction->setIcon(QIcon(":/org.mitk.gui.qt.datamanager/Remove_48.png"));
126  m_UnknownDataNodeDescriptor->AddAction(m_RemoveAction, true);
127  m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, m_RemoveAction));
128 
129  m_ShowSelectedNodesAction = new QmitkDataNodeShowSelectedNodesAction(m_Parent, workbenchPartSite);
130  m_RemoveAction->setIcon(QIcon(":/org.mitk.gui.qt.datamanager/ShowSelectedNode_48.png"));
131  m_UnknownDataNodeDescriptor->AddAction(m_ShowSelectedNodesAction, true);
132  m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, m_ShowSelectedNodesAction));
133 
134  m_ToggleVisibilityAction = new QmitkDataNodeToggleVisibilityAction(m_Parent, workbenchPartSite);
135  m_ToggleVisibilityAction->setIcon(QIcon(":/org.mitk.gui.qt.datamanager/InvertShowSelectedNode_48.png"));
136  m_UnknownDataNodeDescriptor->AddAction(m_ToggleVisibilityAction, true);
137  m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, m_ToggleVisibilityAction));
138 
139  m_ShowDetailsAction = new QmitkDataNodeShowDetailsAction(m_Parent, workbenchPartSite);
140  m_ShowDetailsAction->setIcon(QIcon(":/org.mitk.gui.qt.datamanager/ShowDataInfo_48.png"));
141  m_UnknownDataNodeDescriptor->AddAction(m_ShowDetailsAction, true);
142  m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, m_ShowDetailsAction));
143 
144  m_OpacityAction = new QmitkDataNodeOpacityAction(m_Parent, workbenchPartSite);
145  m_UnknownDataNodeDescriptor->AddAction(m_OpacityAction, false);
146  m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, m_OpacityAction));
147 
148  m_ColorAction = new QmitkDataNodeColorAction(m_Parent, workbenchPartSite);
149  this->AddColorAction(m_ColorAction);
150 
151  m_ColormapAction = new QmitkDataNodeColorMapAction(m_Parent, workbenchPartSite);
152  m_ImageDataNodeDescriptor->AddAction(m_ColormapAction);
153  m_DescriptorActionList.push_back(std::make_pair(m_ImageDataNodeDescriptor, m_ColormapAction));
154 
155  if (nullptr != m_DiffusionImageDataNodeDescriptor)
156  {
157  m_DiffusionImageDataNodeDescriptor->AddAction(m_ColormapAction, false);
158  m_DescriptorActionList.push_back(std::make_pair(m_DiffusionImageDataNodeDescriptor, m_ColormapAction));
159  }
160 
161  m_ComponentAction = new QmitkDataNodeComponentAction(m_Parent, workbenchPartSite);
162  m_MultiComponentImageDataNodeDescriptor->AddAction(m_ComponentAction, false);
163  m_DescriptorActionList.push_back(std::make_pair(m_MultiComponentImageDataNodeDescriptor, m_ComponentAction));
164 
165  if (nullptr != m_DiffusionImageDataNodeDescriptor)
166  {
167  m_DiffusionImageDataNodeDescriptor->AddAction(m_ComponentAction, false);
168  m_DescriptorActionList.push_back(std::make_pair(m_DiffusionImageDataNodeDescriptor, m_ComponentAction));
169  }
170 
171  m_TextureInterpolationAction = new QmitkDataNodeTextureInterpolationAction(m_Parent, workbenchPartSite);
172  m_ImageDataNodeDescriptor->AddAction(m_TextureInterpolationAction, false);
173  m_DescriptorActionList.push_back(std::make_pair(m_ImageDataNodeDescriptor, m_TextureInterpolationAction));
174 
175  if (nullptr != m_DiffusionImageDataNodeDescriptor)
176  {
177  m_DiffusionImageDataNodeDescriptor->AddAction(m_TextureInterpolationAction, false);
178  m_DescriptorActionList.push_back(std::make_pair(m_DiffusionImageDataNodeDescriptor, m_TextureInterpolationAction));
179  }
180 
181  if (nullptr != m_SegmentDataNodeDescriptor)
182  {
183  m_SegmentDataNodeDescriptor->AddAction(m_TextureInterpolationAction, false);
184  m_DescriptorActionList.push_back(std::make_pair(m_SegmentDataNodeDescriptor, m_TextureInterpolationAction));
185  }
186 
187  m_SurfaceRepresentationAction = new QmitkDataNodeSurfaceRepresentationAction(m_Parent, workbenchPartSite);
188  m_SurfaceDataNodeDescriptor->AddAction(m_SurfaceRepresentationAction, false);
189  m_DescriptorActionList.push_back(std::make_pair(m_SurfaceDataNodeDescriptor, m_SurfaceRepresentationAction));
190 }
191 
192 void QmitkDataNodeContextMenu::InitExtensionPointActions()
193 {
194  auto extensionPointService = berry::Platform::GetExtensionRegistry();
195  auto customMenuConfigs = extensionPointService->GetConfigurationElementsFor("org.mitk.gui.qt.datamanager.contextMenuActions");
196 
197  DescriptorActionListType descriptorActionList;
198  m_ConfigElements.clear();
199 
200  for (const auto& customMenuConfig : customMenuConfigs)
201  {
202  auto descriptorName = customMenuConfig->GetAttribute("nodeDescriptorName");
203  auto actionLabel = customMenuConfig->GetAttribute("label");
204  auto actionClass = customMenuConfig->GetAttribute("class");
205 
206  if (descriptorName.isEmpty() || actionLabel.isEmpty() || actionClass.isEmpty())
207  continue;
208 
209  auto descriptor = QmitkNodeDescriptorManager::GetInstance()->GetDescriptor(descriptorName);
210 
211  if (nullptr == descriptor)
212  {
213  MITK_WARN << "Cannot add action \"" << actionLabel << "\" to non-existent descriptor \"" << descriptorName << "\".";
214  continue;
215  }
216 
217  QAction* action = nullptr;
218  auto actionIcon = customMenuConfig->GetAttribute("icon");
219 
220  if (!actionIcon.isEmpty())
221  {
222  QIcon icon = !QFile::exists(actionIcon)
223  ? berry::AbstractUICTKPlugin::ImageDescriptorFromPlugin(customMenuConfig->GetContributor()->GetName(), actionIcon)
224  : QIcon(actionIcon);
225 
226  action = new QAction(icon, actionLabel, m_Parent);
227  }
228  else
229  {
230  action = new QAction(actionLabel, m_Parent);
231  }
232 
233  if (nullptr != action)
234  {
235  // See T26938. We do not know why but without the lambda function indirection, the
236  // connection is lost after the content menu was shown for the first time.
237  connect(action, &QAction::triggered, [action, this]()
238  {
239  this->OnExtensionPointActionTriggered(action);
240  });
241 
242  m_ConfigElements[action] = customMenuConfig;
243  descriptorActionList.push_back(std::make_pair(descriptor, action));
244  }
245  }
246 
247  this->AddDescriptorActionList(descriptorActionList);
248 }
249 
250 void QmitkDataNodeContextMenu::InitServiceActions()
251 {
252 }
253 
255 {
256  if (m_WorkbenchPartSite.Expired())
257  return;
258 
259  auto selection = m_WorkbenchPartSite.Lock()->GetWorkbenchWindow()->GetSelectionService()->GetSelection()
260  .Cast<const mitk::DataNodeSelection>();
261 
262  if (selection.IsNull() || selection->IsEmpty())
263  return;
264 
265  m_SelectedNodes = QList<mitk::DataNode::Pointer>::fromStdList(selection->GetSelectedDataNodes());
266 
267  if (!m_SelectedNodes.isEmpty())
268  {
269  this->clear();
270 
271  auto actions = m_SelectedNodes.size() == 1
272  ? this->GetActions(m_SelectedNodes.front())
273  : this->GetActions(m_SelectedNodes);
274 
275  for (auto& action : actions)
276  {
277  auto dataNodeAction = dynamic_cast<QmitkAbstractDataNodeAction*>(action);
278 
279  if (nullptr != dataNodeAction)
280  dataNodeAction->SetSelectedNodes(m_SelectedNodes);
281  }
282 
283  this->addActions(actions);
284  this->popup(QCursor::pos());
285  }
286 }
287 
289 {
290  auto configElementIter = m_ConfigElements.find(action);
291 
292  if (m_ConfigElements.end() == configElementIter)
293  {
294  MITK_WARN << "Associated configuration element for action \"" << action->text() << "\" not found.";
295  return;
296  }
297 
298  auto configElement = configElementIter->second;
299  auto contextMenuAction = configElement->CreateExecutableExtension<mitk::IContextMenuAction>("class");
300 
301  if (!m_DataStorage.IsExpired())
302  contextMenuAction->SetDataStorage(m_DataStorage.Lock());
303 
304  if ("QmitkCreatePolygonModelAction" == configElement->GetAttribute("class"))
305  {
306  contextMenuAction->SetSmoothed("true" == configElement->GetAttribute("smoothed"));
307  contextMenuAction->SetDecimated(m_SurfaceDecimation);
308  }
309 
310  contextMenuAction->Run(m_SelectedNodes);
311 }
312 
313 void QmitkDataNodeContextMenu::AddColorAction(QWidgetAction* colorAction)
314 {
315  if (nullptr != m_ImageDataNodeDescriptor)
316  {
317  m_ImageDataNodeDescriptor->AddAction(colorAction, true);
318  m_DescriptorActionList.push_back(std::make_pair(m_ImageDataNodeDescriptor, colorAction));
319  }
320 
321  if (nullptr != m_MultiComponentImageDataNodeDescriptor)
322  {
323  m_MultiComponentImageDataNodeDescriptor->AddAction(colorAction, true);
324  m_DescriptorActionList.push_back(std::make_pair(m_MultiComponentImageDataNodeDescriptor, colorAction));
325  }
326 
327  if (nullptr != m_DiffusionImageDataNodeDescriptor)
328  {
329  m_DiffusionImageDataNodeDescriptor->AddAction(colorAction, true);
330  m_DescriptorActionList.push_back(std::make_pair(m_DiffusionImageDataNodeDescriptor, colorAction));
331  }
332 
333  if (nullptr != m_FiberBundleDataNodeDescriptor)
334  {
335  m_FiberBundleDataNodeDescriptor->AddAction(colorAction, false);
336  m_DescriptorActionList.push_back(std::make_pair(m_FiberBundleDataNodeDescriptor, colorAction));
337  }
338 
339  if (nullptr != m_PeakImageDataNodeDescriptor)
340  {
341  m_PeakImageDataNodeDescriptor->AddAction(colorAction, false);
342  m_DescriptorActionList.push_back(std::make_pair(m_PeakImageDataNodeDescriptor, colorAction));
343  }
344 
345  if (nullptr != m_SegmentDataNodeDescriptor)
346  {
347  m_SegmentDataNodeDescriptor->AddAction(colorAction, false);
348  m_DescriptorActionList.push_back(std::make_pair(m_SegmentDataNodeDescriptor, colorAction));
349  }
350 
351  if (nullptr != m_SurfaceDataNodeDescriptor)
352  {
353  m_SurfaceDataNodeDescriptor->AddAction(colorAction, true);
354  m_DescriptorActionList.push_back(std::make_pair(m_SurfaceDataNodeDescriptor, colorAction));
355  }
356 
357  if (nullptr != m_PointSetNodeDescriptor)
358  {
359  m_PointSetNodeDescriptor->AddAction(colorAction, true);
360  m_DescriptorActionList.push_back(std::make_pair(m_PointSetNodeDescriptor, colorAction));
361  }
362 
363  if (nullptr != m_PlanarLineNodeDescriptor)
364  {
365  m_PlanarLineNodeDescriptor->AddAction(colorAction, true);
366  m_DescriptorActionList.push_back(std::make_pair(m_PlanarLineNodeDescriptor, colorAction));
367  }
368 
369  if (nullptr != m_PlanarCircleNodeDescriptor)
370  {
371  m_PlanarCircleNodeDescriptor->AddAction(colorAction, true);
372  m_DescriptorActionList.push_back(std::make_pair(m_PlanarCircleNodeDescriptor, colorAction));
373  }
374 
375  if (nullptr != m_PlanarEllipseNodeDescriptor)
376  {
377  m_PlanarEllipseNodeDescriptor->AddAction(colorAction, true);
378  m_DescriptorActionList.push_back(std::make_pair(m_PlanarEllipseNodeDescriptor, colorAction));
379  }
380 
381  if (nullptr != m_PlanarAngleNodeDescriptor)
382  {
383  m_PlanarAngleNodeDescriptor->AddAction(colorAction, true);
384  m_DescriptorActionList.push_back(std::make_pair(m_PlanarAngleNodeDescriptor, colorAction));
385  }
386 
387  if (nullptr != m_PlanarFourPointAngleNodeDescriptor)
388  {
389  m_PlanarFourPointAngleNodeDescriptor->AddAction(colorAction, true);
390  m_DescriptorActionList.push_back(std::make_pair(m_PlanarFourPointAngleNodeDescriptor, colorAction));
391  }
392 
393  if (nullptr != m_PlanarRectangleNodeDescriptor)
394  {
395  m_PlanarRectangleNodeDescriptor->AddAction(colorAction, true);
396  m_DescriptorActionList.push_back(std::make_pair(m_PlanarRectangleNodeDescriptor, colorAction));
397  }
398 
399  if (nullptr != m_PlanarPolygonNodeDescriptor)
400  {
401  m_PlanarPolygonNodeDescriptor->AddAction(colorAction, true);
402  m_DescriptorActionList.push_back(std::make_pair(m_PlanarPolygonNodeDescriptor, colorAction));
403  }
404 
405  if (nullptr != m_PlanarPathNodeDescriptor)
406  {
407  m_PlanarPathNodeDescriptor->AddAction(colorAction, true);
408  m_DescriptorActionList.push_back(std::make_pair(m_PlanarPathNodeDescriptor, colorAction));
409  }
410 
411  if (nullptr != m_PlanarDoubleEllipseNodeDescriptor)
412  {
413  m_PlanarDoubleEllipseNodeDescriptor->AddAction(colorAction, true);
414  m_DescriptorActionList.push_back(std::make_pair(m_PlanarDoubleEllipseNodeDescriptor, colorAction));
415  }
416 
417  if (nullptr != m_PlanarBezierCurveNodeDescriptor)
418  {
419  m_PlanarBezierCurveNodeDescriptor->AddAction(colorAction, true);
420  m_DescriptorActionList.push_back(std::make_pair(m_PlanarBezierCurveNodeDescriptor, colorAction));
421  }
422 
423  if (nullptr != m_PlanarSubdivisionPolygonNodeDescriptor)
424  {
425  m_PlanarSubdivisionPolygonNodeDescriptor->AddAction(colorAction, true);
426  m_DescriptorActionList.push_back(std::make_pair(m_PlanarSubdivisionPolygonNodeDescriptor, colorAction));
427  }
428 }
429 
430 void QmitkDataNodeContextMenu::AddDescriptorActionList(DescriptorActionListType& descriptorActionList)
431 {
432  using ListItem = std::pair<QmitkNodeDescriptor*, QAction*>;
433 
434  std::sort(descriptorActionList.begin(), descriptorActionList.end(), [](const ListItem& left, const ListItem& right) -> bool
435  {
436  return left.second->text() < right.second->text();
437  });
438 
439  for (auto& descriptorActionPair : descriptorActionList)
440  {
441  descriptorActionPair.first->AddAction(descriptorActionPair.second);
442  m_DescriptorActionList.push_back(descriptorActionPair);
443  }
444 }
445 
446 QList<QAction*> QmitkDataNodeContextMenu::GetActions(const mitk::DataNode* node)
447 {
448  QList<QAction*> actions;
449 
450  for(const auto& descriptorActionPair : m_DescriptorActionList)
451  {
452  if (descriptorActionPair.first->CheckNode(node) || "Unknown" == descriptorActionPair.first->GetNameOfClass())
453  actions.append(descriptorActionPair.second);
454  }
455 
456  return actions;
457 }
458 
459 QList<QAction*> QmitkDataNodeContextMenu::GetActions(const QList<mitk::DataNode::Pointer>& nodes)
460 {
461  QList<QAction*> actions;
462 
463  for (const auto& descriptorActionPair : m_DescriptorActionList)
464  {
465  for (const auto& node : nodes)
466  {
467  if (descriptorActionPair.first->CheckNode(node) || "Unknown" == descriptorActionPair.first->GetNameOfClass())
468  {
469  auto batchActions = descriptorActionPair.first->GetBatchActions();
470 
471  if (std::find(batchActions.begin(), batchActions.end(), descriptorActionPair.second) != batchActions.end())
472  actions.append(descriptorActionPair.second);
473 
474  break;
475  }
476  }
477  }
478 
479  return actions;
480 }
void SetBaseRenderer(mitk::BaseRenderer *baseRenderer)
Data management class that handles &#39;was created by&#39; relations.
itk::SmartPointer< T > Lock() const
void OnContextMenuRequested(const QPoint &pos)
void SetBaseRenderer(mitk::BaseRenderer *baseRenderer)
Organizes the rendering process.
virtual void SetDataStorage(mitk::DataStorage *dataStorage)=0
SmartPointer< ObjectType > Lock() const
void SetSelectedNodes(const QList< mitk::DataNode::Pointer > &selectedNodes)
QmitkNodeDescriptor * GetDescriptor(const mitk::DataNode *node) const
void SetSelectedNodes(const QList< mitk::DataNode::Pointer > &selectedNodes)
#define MITK_WARN
Definition: mitkLogMacros.h:19
bool IsExpired() const noexcept
static IExtensionRegistry * GetExtensionRegistry()
void SetSurfaceDecimation(bool surfaceDecimation)
void OnExtensionPointActionTriggered(QAction *action)
void SetDataStorage(mitk::DataStorage *dataStorage)
static QIcon ImageDescriptorFromPlugin(const QString &pluginId, const QString &imageFilePath)
QmitkDataNodeContextMenu(berry::IWorkbenchPartSite::Pointer workbenchPartSite, QWidget *parent=nullptr)
void SetDataStorage(mitk::DataStorage *dataStorage)
static QmitkNodeDescriptorManager * GetInstance()
virtual void AddAction(QAction *action, bool isBatchAction=true)
Class for nodes of the DataTree.
Definition: mitkDataNode.h:57