31 m_WorkbenchPartSite(workbenchPartSite)
33 this->InitNodeDescriptors();
34 this->InitDefaultActions();
35 this->InitExtensionPointActions();
40 for (
auto& descriptorActionPair : m_DescriptorActionList)
41 descriptorActionPair.first->RemoveAction(descriptorActionPair.second);
46 m_DataStorage = dataStorage;
48 for (
auto& descriptorActionPair : m_DescriptorActionList)
52 if (
nullptr != dataNodeAction)
59 m_BaseRenderer = baseRenderer;
61 for (
auto& descriptorActionPair : m_DescriptorActionList)
65 if (
nullptr != dataNodeAction)
72 m_SurfaceDecimation = surfaceDecimation;
77 m_SelectedNodes = selectedNodes;
80 void QmitkDataNodeContextMenu::InitNodeDescriptors()
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");
106 void QmitkDataNodeContextMenu::InitDefaultActions()
108 auto workbenchPartSite = m_WorkbenchPartSite.
Lock();
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));
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));
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));
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));
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));
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));
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));
145 m_UnknownDataNodeDescriptor->
AddAction(m_OpacityAction,
false);
146 m_DescriptorActionList.push_back(std::make_pair(m_UnknownDataNodeDescriptor, m_OpacityAction));
149 this->AddColorAction(m_ColorAction);
152 m_ImageDataNodeDescriptor->
AddAction(m_ColormapAction);
153 m_DescriptorActionList.push_back(std::make_pair(m_ImageDataNodeDescriptor, m_ColormapAction));
155 if (
nullptr != m_DiffusionImageDataNodeDescriptor)
157 m_DiffusionImageDataNodeDescriptor->
AddAction(m_ColormapAction,
false);
158 m_DescriptorActionList.push_back(std::make_pair(m_DiffusionImageDataNodeDescriptor, m_ColormapAction));
162 m_MultiComponentImageDataNodeDescriptor->
AddAction(m_ComponentAction,
false);
163 m_DescriptorActionList.push_back(std::make_pair(m_MultiComponentImageDataNodeDescriptor, m_ComponentAction));
165 if (
nullptr != m_DiffusionImageDataNodeDescriptor)
167 m_DiffusionImageDataNodeDescriptor->
AddAction(m_ComponentAction,
false);
168 m_DescriptorActionList.push_back(std::make_pair(m_DiffusionImageDataNodeDescriptor, m_ComponentAction));
172 m_ImageDataNodeDescriptor->
AddAction(m_TextureInterpolationAction,
false);
173 m_DescriptorActionList.push_back(std::make_pair(m_ImageDataNodeDescriptor, m_TextureInterpolationAction));
175 if (
nullptr != m_DiffusionImageDataNodeDescriptor)
177 m_DiffusionImageDataNodeDescriptor->
AddAction(m_TextureInterpolationAction,
false);
178 m_DescriptorActionList.push_back(std::make_pair(m_DiffusionImageDataNodeDescriptor, m_TextureInterpolationAction));
181 if (
nullptr != m_SegmentDataNodeDescriptor)
183 m_SegmentDataNodeDescriptor->
AddAction(m_TextureInterpolationAction,
false);
184 m_DescriptorActionList.push_back(std::make_pair(m_SegmentDataNodeDescriptor, m_TextureInterpolationAction));
188 m_SurfaceDataNodeDescriptor->
AddAction(m_SurfaceRepresentationAction,
false);
189 m_DescriptorActionList.push_back(std::make_pair(m_SurfaceDataNodeDescriptor, m_SurfaceRepresentationAction));
192 void QmitkDataNodeContextMenu::InitExtensionPointActions()
195 auto customMenuConfigs = extensionPointService->GetConfigurationElementsFor(
"org.mitk.gui.qt.datamanager.contextMenuActions");
197 DescriptorActionListType descriptorActionList;
198 m_ConfigElements.clear();
200 for (
const auto& customMenuConfig : customMenuConfigs)
202 auto descriptorName = customMenuConfig->GetAttribute(
"nodeDescriptorName");
203 auto actionLabel = customMenuConfig->GetAttribute(
"label");
204 auto actionClass = customMenuConfig->GetAttribute(
"class");
206 if (descriptorName.isEmpty() || actionLabel.isEmpty() || actionClass.isEmpty())
211 if (
nullptr == descriptor)
213 MITK_WARN <<
"Cannot add action \"" << actionLabel <<
"\" to non-existent descriptor \"" << descriptorName <<
"\".";
217 QAction* action =
nullptr;
218 auto actionIcon = customMenuConfig->GetAttribute(
"icon");
220 if (!actionIcon.isEmpty())
222 QIcon icon = !QFile::exists(actionIcon)
226 action =
new QAction(icon, actionLabel, m_Parent);
230 action =
new QAction(actionLabel, m_Parent);
233 if (
nullptr != action)
237 connect(action, &QAction::triggered, [action,
this]()
242 m_ConfigElements[action] = customMenuConfig;
243 descriptorActionList.push_back(std::make_pair(descriptor, action));
247 this->AddDescriptorActionList(descriptorActionList);
250 void QmitkDataNodeContextMenu::InitServiceActions()
256 if (m_WorkbenchPartSite.
Expired())
259 auto selection = m_WorkbenchPartSite.
Lock()->GetWorkbenchWindow()->GetSelectionService()->GetSelection()
262 if (selection.IsNull() || selection->IsEmpty())
265 m_SelectedNodes = QList<mitk::DataNode::Pointer>::fromStdList(selection->GetSelectedDataNodes());
267 if (!m_SelectedNodes.isEmpty())
271 auto actions = m_SelectedNodes.size() == 1
272 ? this->GetActions(m_SelectedNodes.front())
273 : this->GetActions(m_SelectedNodes);
275 for (
auto& action : actions)
279 if (
nullptr != dataNodeAction)
283 this->addActions(actions);
284 this->popup(QCursor::pos());
290 auto configElementIter = m_ConfigElements.find(action);
292 if (m_ConfigElements.end() == configElementIter)
294 MITK_WARN <<
"Associated configuration element for action \"" << action->text() <<
"\" not found.";
298 auto configElement = configElementIter->second;
304 if (
"QmitkCreatePolygonModelAction" == configElement->GetAttribute(
"class"))
306 contextMenuAction->SetSmoothed(
"true" == configElement->GetAttribute(
"smoothed"));
307 contextMenuAction->SetDecimated(m_SurfaceDecimation);
310 contextMenuAction->Run(m_SelectedNodes);
313 void QmitkDataNodeContextMenu::AddColorAction(QWidgetAction* colorAction)
315 if (
nullptr != m_ImageDataNodeDescriptor)
317 m_ImageDataNodeDescriptor->
AddAction(colorAction,
true);
318 m_DescriptorActionList.push_back(std::make_pair(m_ImageDataNodeDescriptor, colorAction));
321 if (
nullptr != m_MultiComponentImageDataNodeDescriptor)
323 m_MultiComponentImageDataNodeDescriptor->
AddAction(colorAction,
true);
324 m_DescriptorActionList.push_back(std::make_pair(m_MultiComponentImageDataNodeDescriptor, colorAction));
327 if (
nullptr != m_DiffusionImageDataNodeDescriptor)
329 m_DiffusionImageDataNodeDescriptor->
AddAction(colorAction,
true);
330 m_DescriptorActionList.push_back(std::make_pair(m_DiffusionImageDataNodeDescriptor, colorAction));
333 if (
nullptr != m_FiberBundleDataNodeDescriptor)
335 m_FiberBundleDataNodeDescriptor->
AddAction(colorAction,
false);
336 m_DescriptorActionList.push_back(std::make_pair(m_FiberBundleDataNodeDescriptor, colorAction));
339 if (
nullptr != m_PeakImageDataNodeDescriptor)
341 m_PeakImageDataNodeDescriptor->
AddAction(colorAction,
false);
342 m_DescriptorActionList.push_back(std::make_pair(m_PeakImageDataNodeDescriptor, colorAction));
345 if (
nullptr != m_SegmentDataNodeDescriptor)
347 m_SegmentDataNodeDescriptor->
AddAction(colorAction,
false);
348 m_DescriptorActionList.push_back(std::make_pair(m_SegmentDataNodeDescriptor, colorAction));
351 if (
nullptr != m_SurfaceDataNodeDescriptor)
353 m_SurfaceDataNodeDescriptor->
AddAction(colorAction,
true);
354 m_DescriptorActionList.push_back(std::make_pair(m_SurfaceDataNodeDescriptor, colorAction));
357 if (
nullptr != m_PointSetNodeDescriptor)
359 m_PointSetNodeDescriptor->
AddAction(colorAction,
true);
360 m_DescriptorActionList.push_back(std::make_pair(m_PointSetNodeDescriptor, colorAction));
363 if (
nullptr != m_PlanarLineNodeDescriptor)
365 m_PlanarLineNodeDescriptor->
AddAction(colorAction,
true);
366 m_DescriptorActionList.push_back(std::make_pair(m_PlanarLineNodeDescriptor, colorAction));
369 if (
nullptr != m_PlanarCircleNodeDescriptor)
371 m_PlanarCircleNodeDescriptor->
AddAction(colorAction,
true);
372 m_DescriptorActionList.push_back(std::make_pair(m_PlanarCircleNodeDescriptor, colorAction));
375 if (
nullptr != m_PlanarEllipseNodeDescriptor)
377 m_PlanarEllipseNodeDescriptor->
AddAction(colorAction,
true);
378 m_DescriptorActionList.push_back(std::make_pair(m_PlanarEllipseNodeDescriptor, colorAction));
381 if (
nullptr != m_PlanarAngleNodeDescriptor)
383 m_PlanarAngleNodeDescriptor->
AddAction(colorAction,
true);
384 m_DescriptorActionList.push_back(std::make_pair(m_PlanarAngleNodeDescriptor, colorAction));
387 if (
nullptr != m_PlanarFourPointAngleNodeDescriptor)
389 m_PlanarFourPointAngleNodeDescriptor->
AddAction(colorAction,
true);
390 m_DescriptorActionList.push_back(std::make_pair(m_PlanarFourPointAngleNodeDescriptor, colorAction));
393 if (
nullptr != m_PlanarRectangleNodeDescriptor)
395 m_PlanarRectangleNodeDescriptor->
AddAction(colorAction,
true);
396 m_DescriptorActionList.push_back(std::make_pair(m_PlanarRectangleNodeDescriptor, colorAction));
399 if (
nullptr != m_PlanarPolygonNodeDescriptor)
401 m_PlanarPolygonNodeDescriptor->
AddAction(colorAction,
true);
402 m_DescriptorActionList.push_back(std::make_pair(m_PlanarPolygonNodeDescriptor, colorAction));
405 if (
nullptr != m_PlanarPathNodeDescriptor)
407 m_PlanarPathNodeDescriptor->
AddAction(colorAction,
true);
408 m_DescriptorActionList.push_back(std::make_pair(m_PlanarPathNodeDescriptor, colorAction));
411 if (
nullptr != m_PlanarDoubleEllipseNodeDescriptor)
413 m_PlanarDoubleEllipseNodeDescriptor->
AddAction(colorAction,
true);
414 m_DescriptorActionList.push_back(std::make_pair(m_PlanarDoubleEllipseNodeDescriptor, colorAction));
417 if (
nullptr != m_PlanarBezierCurveNodeDescriptor)
419 m_PlanarBezierCurveNodeDescriptor->
AddAction(colorAction,
true);
420 m_DescriptorActionList.push_back(std::make_pair(m_PlanarBezierCurveNodeDescriptor, colorAction));
423 if (
nullptr != m_PlanarSubdivisionPolygonNodeDescriptor)
425 m_PlanarSubdivisionPolygonNodeDescriptor->
AddAction(colorAction,
true);
426 m_DescriptorActionList.push_back(std::make_pair(m_PlanarSubdivisionPolygonNodeDescriptor, colorAction));
430 void QmitkDataNodeContextMenu::AddDescriptorActionList(DescriptorActionListType& descriptorActionList)
432 using ListItem = std::pair<QmitkNodeDescriptor*, QAction*>;
434 std::sort(descriptorActionList.begin(), descriptorActionList.end(), [](
const ListItem& left,
const ListItem& right) ->
bool 436 return left.second->text() < right.second->text();
439 for (
auto& descriptorActionPair : descriptorActionList)
441 descriptorActionPair.first->AddAction(descriptorActionPair.second);
442 m_DescriptorActionList.push_back(descriptorActionPair);
446 QList<QAction*> QmitkDataNodeContextMenu::GetActions(
const mitk::DataNode* node)
448 QList<QAction*> actions;
450 for(
const auto& descriptorActionPair : m_DescriptorActionList)
452 if (descriptorActionPair.first->CheckNode(node) ||
"Unknown" == descriptorActionPair.first->GetNameOfClass())
453 actions.append(descriptorActionPair.second);
459 QList<QAction*> QmitkDataNodeContextMenu::GetActions(
const QList<mitk::DataNode::Pointer>& nodes)
461 QList<QAction*> actions;
463 for (
const auto& descriptorActionPair : m_DescriptorActionList)
465 for (
const auto& node : nodes)
467 if (descriptorActionPair.first->CheckNode(node) ||
"Unknown" == descriptorActionPair.first->GetNameOfClass())
469 auto batchActions = descriptorActionPair.first->GetBatchActions();
471 if (std::find(batchActions.begin(), batchActions.end(), descriptorActionPair.second) != batchActions.end())
472 actions.append(descriptorActionPair.second);
void SetBaseRenderer(mitk::BaseRenderer *baseRenderer)
Data management class that handles 'was created by' relations.
itk::SmartPointer< T > Lock() const
Organizes the rendering process.
SmartPointer< ObjectType > Lock() const
void SetSelectedNodes(const QList< mitk::DataNode::Pointer > &selectedNodes)
QmitkNodeDescriptor * GetDescriptor(const mitk::DataNode *node) const
bool IsExpired() const noexcept
static QIcon ImageDescriptorFromPlugin(const QString &pluginId, const QString &imageFilePath)
void SetDataStorage(mitk::DataStorage *dataStorage)
static QmitkNodeDescriptorManager * GetInstance()
virtual void AddAction(QAction *action, bool isBatchAction=true)
Class for nodes of the DataTree.