Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkSelectionServiceConnector.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 // mitk gui qt common plugin
15 #include "internal/QmitkDataNodeSelection.h"
16 
17 // qt widgets module
18 #include "QmitkCustomVariants.h"
19 #include "QmitkEnums.h"
20 
21 // blueberry ui qt plugin
23 
25  : m_SelectionService(nullptr)
26  , m_SelectionProvider(nullptr)
27 {
28  m_DataNodeItemModel = std::make_shared<QmitkDataNodeItemModel>();
29  m_DataNodeSelectionModel = std::make_shared<QItemSelectionModel>(m_DataNodeItemModel.get());
30 }
31 
33 {
36 }
37 
39 {
40  if (nullptr == selectionService)
41  {
42  return;
43  }
44 
45  m_SelectionService = selectionService;
46  m_BerrySelectionListener.reset(new berry::NullSelectionChangedAdapter<QmitkSelectionServiceConnector>(this, &QmitkSelectionServiceConnector::OnServiceSelectionChanged));
47  m_SelectionService->AddPostSelectionListener(m_BerrySelectionListener.get());
48 }
49 
51 {
52  if (nullptr == m_SelectionService)
53  {
54  return;
55  }
56 
57  m_SelectionService->RemovePostSelectionListener(m_BerrySelectionListener.get());
58  m_SelectionService = nullptr;
59 }
60 
62 {
63  m_SelectionProvider = selectionProvider;
64 }
65 
67 {
68  m_SelectionProvider = nullptr;
69 }
70 
71 void QmitkSelectionServiceConnector::ChangeServiceSelection(QList<mitk::DataNode::Pointer> nodes)
72 {
73  if (nullptr == m_SelectionProvider)
74  {
75  return;
76  }
77 
78  m_SelectionProvider->SetItemSelectionModel(m_DataNodeSelectionModel.get());
79 
80  if (nodes.empty())
81  {
82  m_DataNodeSelectionModel->clearSelection();
83  m_DataNodeItemModel->clear();
84  }
85  else
86  {
87  m_DataNodeItemModel->clear();
88  // fill the temporary helper data node item model with the nodes to select
89  for (const auto& node : nodes)
90  {
91  m_DataNodeItemModel->AddDataNode(node);
92  }
93 
94  m_DataNodeSelectionModel->select(QItemSelection(m_DataNodeItemModel->index(0, 0), m_DataNodeItemModel->index(nodes.size() - 1, 0)), QItemSelectionModel::ClearAndSelect);
95  }
96 }
97 
98 void QmitkSelectionServiceConnector::OnServiceSelectionChanged(const berry::IWorkbenchPart::Pointer& sourcePart, const berry::ISelection::ConstPointer& selection)
99 {
100  if (sourcePart.IsNull())
101  {
102  return;
103  }
104 
105  QList<mitk::DataNode::Pointer> nodes;
106  if (selection.IsNull())
107  {
108  emit ServiceNullSelection(sourcePart);
109  return;
110  }
111 
112  // transform valid selection to DataNodeSelection, which allows to retrieve the selected nodes
113  mitk::DataNodeSelection::ConstPointer dataNodeSelection = selection.Cast<const mitk::DataNodeSelection>();
114  if (dataNodeSelection.IsNull())
115  {
116  // propagate an empty list
117  nodes = QList<mitk::DataNode::Pointer>();
118  }
119  else
120  {
121  nodes = QList<mitk::DataNode::Pointer>::fromStdList(dataNodeSelection->GetSelectedDataNodes());
122  }
123 
124  // send new (possibly empty) list of selected nodes
125  emit ServiceSelectionChanged(nodes);
126 }
A BlueBerry selection provider for mitk::DataNode selections.
virtual void RemovePostSelectionListener(ISelectionListener *listener)=0
void ServiceNullSelection(const berry::IWorkbenchPart::Pointer &sourcePart)
SmartPointer< Other > Cast() const
void SetItemSelectionModel(QItemSelectionModel *combo)
void ChangeServiceSelection(QList< mitk::DataNode::Pointer > nodes)
virtual void AddPostSelectionListener(ISelectionListener *listener)=0
void AddPostSelectionListener(berry::ISelectionService *selectionService)
void SetAsSelectionProvider(QmitkDataNodeSelectionProvider *selectionProvider)
void ServiceSelectionChanged(QList< mitk::DataNode::Pointer > nodes)