Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkToolWorkingDataSelectionBox.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 
15 
17  : QListWidget(parent),
18  m_SelfCall(false),
19  m_LastSelectedReferenceData(nullptr),
20  m_ToolGroupsForFiltering("default"),
21  m_DisplayOnlyDerivedNodes(true)
22 {
23  m_ToolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); // this widget should be placeable from
24  // designer so it can't take other than
25  // the defaul parameters
26 
27  QListWidget::setSelectionMode(QListWidget::MultiSelection);
28  QListWidget::setDragDropMode(QListWidget::InternalMove);
29 
30  connect(this, SIGNAL(itemSelectionChanged()), this, SLOT(OnWorkingDataSelectionChanged()));
31 
36 }
37 
39 {
40 }
41 
43 {
44  return m_ToolManager->GetDataStorage();
45 }
46 
48 {
49  m_ToolManager->SetDataStorage(storage);
50 }
51 
53 {
54  return m_ToolManager;
55 }
56 
58  mitk::ToolManager &newManager) // no nullptr pointer allowed here, a manager is required
59 {
64 
65  m_ToolManager = &newManager;
66 
67  m_ToolManager->ReferenceDataChanged += mitk::MessageDelegate<QmitkToolWorkingDataSelectionBox>(
69  m_ToolManager->WorkingDataChanged += mitk::MessageDelegate<QmitkToolWorkingDataSelectionBox>(
71 
73 }
74 
76 {
77  static mitk::ToolManager::DataVectorType previouslySelectedNodes;
78 
80 
81  previouslySelectedNodes = selection;
82 
83  if (selection.size() > 0)
84  {
85  const mitk::DataNode *node = selection[0];
86  emit WorkingNodeSelected(node);
87  }
88  else
89  {
90  emit WorkingNodeSelected(nullptr);
91  }
92 
93  m_SelfCall = true;
94  m_ToolManager->SetWorkingData(selection); // maybe empty
95  m_SelfCall = false;
96 }
97 
99 {
100  if (m_SelfCall)
101  return;
102 
103  const mitk::DataNode *node = m_ToolManager->GetWorkingData(0);
104  emit WorkingNodeSelected(node);
105 
107 }
108 
110 {
111  if (m_ToolManager->GetReferenceData(0) != m_LastSelectedReferenceData)
112  {
113  m_ToolManager->SetWorkingData(nullptr);
115 
116  m_LastSelectedReferenceData = m_ToolManager->GetReferenceData(0);
117  }
118 }
119 
121 {
122  // clear all
123  QListWidget::clear();
124  m_Node.clear();
125 
126  // rebuild contents
128  for (mitk::ToolManager::DataVectorType::const_iterator objectIter = allObjects.begin();
129  objectIter != allObjects.end();
130  ++objectIter)
131  {
132  mitk::DataNode *node = *objectIter;
133 
134  if (node) // delete this check when datastorage is really used
135  {
136  // get name and color
137  std::string name = node->GetName();
138  float rgb[3];
139  rgb[0] = 1.0;
140  rgb[1] = 0.0;
141  rgb[2] = 0.0;
142  node->GetColor(rgb);
143  QRgb qrgb = qRgb((int)(rgb[0] * 255.0), (int)(rgb[1] * 255.0), (int)(rgb[2] * 255.0));
144 
145  QPixmap pixmap(25, 18);
146  pixmap.fill(QColor(qrgb));
147 
148  // create a list item
149  QListWidgetItem *newItem = new QListWidgetItem();
150  QString qname = QString::fromLocal8Bit(name.c_str());
151 
152  // set name and color
153  newItem->setText(qname);
154  newItem->setIcon(QIcon(pixmap));
155 
156  this->addItem(newItem);
157 
158  m_Node.insert(std::make_pair(newItem, node));
159  }
160  }
161 }
162 
164 {
166 
167  QList<QListWidgetItem *> items;
168  for (int j = 0; j < this->count(); j++)
169  {
170  if (this->item(j)->isSelected())
171  items.append(this->item(j));
172  }
173 
174  for (int i = 0; i < items.size(); ++i)
175  {
176  QListWidgetItem *item = items.at(i);
177  if (item)
178  {
179  ItemNodeMapType::iterator it = m_Node.find(item);
180  if (it != m_Node.end())
181  {
182  mitk::DataNode::Pointer node = it->second;
183  if (node)
184  result.push_back(node);
185  }
186  }
187  }
188 
189  return result;
190 }
191 
193 {
194  QListWidgetItem *item = QListWidget::selectedItems().first();
195  if (item)
196  {
197  ItemNodeMapType::iterator iter = m_Node.find(item);
198  if (iter != m_Node.end())
199  {
200  return iter->second;
201  }
202  }
203 
204  return nullptr;
205 }
206 
208 {
209  mitk::DataStorage *dataStorage = m_ToolManager->GetDataStorage();
210  if (!dataStorage)
211  {
213  }
214 
223  std::vector<mitk::NodePredicateBase::ConstPointer> m_Predicates;
224  mitk::NodePredicateBase::ConstPointer completePredicate = nullptr;
225  bool rebuildNeeded = true;
226  if (rebuildNeeded)
227  {
228  m_Predicates.clear();
229 
230  const mitk::ToolManager::ToolVectorTypeConst allTools = m_ToolManager->GetTools();
231 
232  for (mitk::ToolManager::ToolVectorTypeConst::const_iterator iter = allTools.begin(); iter != allTools.end(); ++iter)
233  {
234  const mitk::Tool *tool = *iter;
235 
236  if ((m_ToolGroupsForFiltering.empty()) ||
237  (m_ToolGroupsForFiltering.find(tool->GetGroup()) != std::string::npos) ||
238  (m_ToolGroupsForFiltering.find(tool->GetName()) != std::string::npos))
239  {
240  if (completePredicate.IsNotNull())
241  {
242  m_Predicates.push_back(
243  mitk::NodePredicateOr::New(completePredicate, tool->GetWorkingDataPreference()).GetPointer());
244 
245  completePredicate = m_Predicates.back();
246  }
247  else
248  {
249  completePredicate = tool->GetWorkingDataPreference();
250  }
251  }
252  }
253  }
254 
255  // TODO delete all m_Predicates
256  mitk::DataStorage::SetOfObjects::ConstPointer allObjects;
257 
264  if (onlyDerivedFromOriginal)
265  {
266  mitk::DataNode *sourceNode(m_ToolManager->GetReferenceData(0));
267  if (sourceNode)
268  {
269  allObjects = dataStorage->GetDerivations(sourceNode, completePredicate, false);
270  }
271  else
272  {
273  allObjects = mitk::DataStorage::SetOfObjects::New();
274  }
275  }
276  else
277  {
278  if (completePredicate)
279  {
280  allObjects = dataStorage->GetSubset(completePredicate);
281  }
282  else
283  {
284  allObjects = dataStorage->GetAll();
285  }
286  }
287 
288  m_Predicates.clear();
289  completePredicate = nullptr;
290 
292 
293  for (mitk::DataStorage::SetOfObjects::const_iterator objectIter = allObjects->begin();
294  objectIter != allObjects->end();
295  ++objectIter)
296  {
297  mitk::DataNode *node = (*objectIter).GetPointer();
298  resultVector.push_back(node);
299  }
300 
301  return resultVector;
302 }
virtual const char * GetName() const =0
Returns the name of this tool. Make it short!
std::vector< Tool::ConstPointer > ToolVectorTypeConst
virtual const char * GetGroup() const
Name of a group.
Definition: mitkTool.cpp:108
Base class of all tools used by mitk::ToolManager.
Definition: mitkTool.h:86
Data management class that handles &#39;was created by&#39; relations.
virtual SetOfObjects::ConstPointer GetDerivations(const DataNode *node, const NodePredicateBase *condition=nullptr, bool onlyDirectDerivations=true) const =0
returns a set of derived objects for a given node.
mitk::DataNode * GetSelectedNode()
Like GetSelectedNodes(), but will only return one object. Will only return what QListView gives as se...
void OnToolManagerReferenceDataModified()
Callback function, no need to call it. This is used to observe and react to changes in the mitk::Tool...
std::vector< DataNode * > DataVectorType
static Pointer New()
virtual mitk::ToolManager * GetToolManager()
Returns ToolManager object.
void SetToolManager(mitk::ToolManager &)
Tell this object to listen to another ToolManager.
void UpdateDataDisplay()
Can be called to trigger an update of the list contents.
virtual SetOfObjects::ConstPointer GetAll() const =0
returns a set of all data objects that are stored in the data storage
bool GetColor(float rgb[3], const mitk::BaseRenderer *renderer=nullptr, const char *propertyKey="color") const
Convenience access method for color properties (instances of ColorProperty)
SetOfObjects::ConstPointer GetSubset(const NodePredicateBase *condition) const
returns a set of data objects that meet the given condition(s)
void WorkingNodeSelected(const mitk::DataNode *)
void OnToolManagerWorkingDataModified()
Callback function, no need to call it. This is used to observe and react to changes in the mitk::Tool...
mitk::ToolManager * GetToolManager()
Returns the associated mitk::ToolManager.
void SetDataStorage(mitk::DataStorage &storage)
mitk::ToolManager::DataVectorType GetAllNodes(bool onlyDerivedFromOriginal=true)
A list of all displayed DataNode objects. This method might be convenient for program modules that wa...
virtual NodePredicateBase::ConstPointer GetWorkingDataPreference() const
Definition: mitkTool.cpp:205
mitk::ToolManager::DataVectorType GetSelectedNodes()
A list of all selected DataNode objects. This method might be convenient for program modules that wan...
Class for nodes of the DataTree.
Definition: mitkDataNode.h:57
static mitk::ToolManagerProvider * GetInstance()
Returns an instance of ToolManagerProvider service.
bool GetName(std::string &nodeName, const mitk::BaseRenderer *renderer=nullptr, const char *propertyKey="name") const
Convenience access method for accessing the name of an object (instance of StringProperty with proper...
Definition: mitkDataNode.h:369
Manages and coordinates instances of mitk::Tool.