18 m_EmptyInfo(
"Empty. Make a selection."), m_PopUpTitel(
"Select a data node"), m_PopUpHint(
""),
19 m_IsOptional(false), m_SelectOnlyVisibleNodes(true), m_DataStorageDeletedTag(0), m_LastEmissionAllowance(true), m_RecursionGuard(false)
26 if (dataStorage.IsNotNull())
29 dataStorage->RemoveObserver(m_DataStorageDeletedTag);
32 dataStorage->AddNodeEvent.RemoveListener(
36 dataStorage->RemoveNodeEvent.RemoveListener(
40 for (
auto& node : m_CurrentInternalSelection)
42 this->RemoveNodeObserver(node);
59 if (oldStorage.IsNotNull())
62 oldStorage->RemoveObserver(m_DataStorageDeletedTag);
65 oldStorage->AddNodeEvent.RemoveListener(
69 oldStorage->RemoveNodeEvent.RemoveListener(
77 if (newStorage.IsNotNull())
80 auto command = itk::SimpleMemberCommand<QmitkAbstractNodeSelectionWidget>::New();
81 command->SetCallbackFunction(
this, &QmitkAbstractNodeSelectionWidget::SetDataStorageDeleted);
82 m_DataStorageDeletedTag = newStorage->AddObserver(itk::DeleteEvent(), command);
85 newStorage->AddNodeEvent.AddListener(
89 newStorage->RemoveNodeEvent.AddListener(
108 for (
auto& node : m_CurrentInternalSelection)
112 newInternalNodes.append(node);
118 for (
auto& node : m_CurrentExternalSelection)
122 newInternalNodes.append(node);
148 if (!m_RecursionGuard)
150 m_CurrentExternalSelection = selectedNodes;
154 for (
auto node : selectedNodes)
158 newInternalSelection.append(node);
241 void QmitkAbstractNodeSelectionWidget::SetDataStorageDeleted()
261 m_RecursionGuard =
true;
263 m_RecursionGuard =
false;
264 m_LastEmission = emissionCandidates;
270 for (
auto& node : m_CurrentInternalSelection)
272 this->RemoveNodeObserver(node);
275 m_CurrentInternalSelection = selectedNodes;
277 for (
auto& node : m_CurrentInternalSelection)
279 this->AddNodeObserver(node);
285 return m_CurrentInternalSelection;
290 return m_CurrentExternalSelection;
305 void QmitkAbstractNodeSelectionWidget::NodeAddedToStorage(
const mitk::DataNode* node)
314 void QmitkAbstractNodeSelectionWidget::NodeRemovedFromStorage(
const mitk::DataNode* node)
326 NodeList result = m_CurrentInternalSelection;
330 for (
auto node : m_CurrentExternalSelection)
344 auto newSelection = m_CurrentInternalSelection;
346 auto finding = std::find(std::begin(newSelection), std::end(newSelection), node);
348 if (finding != std::end(newSelection))
350 newSelection.erase(finding);
355 void QmitkAbstractNodeSelectionWidget::OnNodeModified(
const itk::Object * caller,
const itk::EventObject & event)
357 if (itk::ModifiedEvent().CheckEvent(&event))
369 auto oldAllowance = m_LastEmissionAllowance;
382 void QmitkAbstractNodeSelectionWidget::AddNodeObserver(
mitk::DataNode* node)
386 auto modifiedCommand = itk::MemberCommand<QmitkAbstractNodeSelectionWidget>::New();
387 modifiedCommand->SetCallbackFunction(
this, &QmitkAbstractNodeSelectionWidget::OnNodeModified);
389 auto nodeModifiedObserverTag = node->AddObserver(itk::ModifiedEvent(), modifiedCommand);
391 m_NodeObserverTags.insert(std::make_pair(node, nodeModifiedObserverTag));
395 void QmitkAbstractNodeSelectionWidget::RemoveNodeObserver(
mitk::DataNode* node)
399 auto finding = m_NodeObserverTags.find(node);
400 if (finding != std::end(m_NodeObserverTags))
402 node->RemoveObserver(finding->second);
406 MITK_ERROR <<
"Selection widget is in a wrong state. A node should be removed from the internal selection but seems to have no observer. Node:" << node;
408 m_NodeObserverTags.erase(node);
Data management class that handles 'was created by' relations.
itk::SmartPointer< T > Lock() const
static void info(const char *fmt,...)
bool MITKQTWIDGETS_EXPORT EqualNodeSelections(const QList< mitk::DataNode::Pointer > &selection1, const QList< mitk::DataNode::Pointer > &selection2)
Interface for evaluation conditions used in the DataStorage class GetSubset() method.
Class for nodes of the DataTree.