diff --git a/Modules/Core/src/Interactions/mitkDisplayActionEventHandler.cpp b/Modules/Core/src/Interactions/mitkDisplayActionEventHandler.cpp index 6702cbae73..c5e450ee87 100644 --- a/Modules/Core/src/Interactions/mitkDisplayActionEventHandler.cpp +++ b/Modules/Core/src/Interactions/mitkDisplayActionEventHandler.cpp @@ -1,73 +1,76 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical Image Computing. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkDisplayActionEventHandler.h" void mitk::DisplayActionEventHandler::SetObservableBroadcast(mitk::DisplayActionEventBroadcast* observableBroadcast) { if (m_ObservableBroadcast == observableBroadcast) { // no need to update the broadcast class return; } - if (m_ObservableBroadcast.IsNotNull()) + if (!m_ObservableBroadcast.IsExpired()) { + auto observableBroadcastPtr = m_ObservableBroadcast.Lock(); + // remove current observer for (const auto& tag : m_ObserverTags) { - m_ObservableBroadcast->RemoveObserver(tag); + observableBroadcastPtr->RemoveObserver(tag); } m_ObserverTags.clear(); } - // set new broadcast class (possibly nullptr) + // set new broadcast class m_ObservableBroadcast = observableBroadcast; } mitk::DisplayActionEventHandler::OberserverTagType mitk::DisplayActionEventHandler::ConnectDisplayActionEvent(const mitk::DisplayActionEvent& displayActionEvent, const mitk::StdFunctionCommand::ActionFunction& actionFunction, const mitk::StdFunctionCommand::FilterFunction& filterFunction) { - // #TODO: change function call for new mitk::WeakPointer - if (m_ObservableBroadcast.IsNull()) + if (m_ObservableBroadcast.IsExpired()) { mitkThrow() << "No display action event broadcast class set to observe. Use 'SetObservableBroadcast' before connecting events."; } + auto observableBroadcast = m_ObservableBroadcast.Lock(); auto command = mitk::StdFunctionCommand::New(); command->SetCommandAction(actionFunction); command->SetCommandFilter(filterFunction); - OberserverTagType tag = m_ObservableBroadcast->AddObserver(displayActionEvent, command); + OberserverTagType tag = observableBroadcast->AddObserver(displayActionEvent, command); m_ObserverTags.push_back(tag); return tag; } void mitk::DisplayActionEventHandler::DisconnectObserver(OberserverTagType observerTag) { // #TODO: change function call for new mitk::WeakPointer - if (m_ObservableBroadcast.IsNull()) + if (m_ObservableBroadcast.IsExpired()) { mitkThrow() << "No display action event broadcast class set to observe. Use 'SetObservableBroadcast' before disconnecting observer."; } + auto observableBroadcast = m_ObservableBroadcast.Lock(); std::vector::iterator observerTagPosition = std::find(m_ObserverTags.begin(), m_ObserverTags.end(), observerTag); if (observerTagPosition != m_ObserverTags.end()) { - m_ObservableBroadcast->RemoveObserver(observerTag); + observableBroadcast->RemoveObserver(observerTag); m_ObserverTags.erase(observerTagPosition); } } diff --git a/Modules/Core/src/Interactions/mitkStdDisplayActionEventHandler.cpp b/Modules/Core/src/Interactions/mitkStdDisplayActionEventHandler.cpp index 06eea8b3bb..95bae2ae2a 100644 --- a/Modules/Core/src/Interactions/mitkStdDisplayActionEventHandler.cpp +++ b/Modules/Core/src/Interactions/mitkStdDisplayActionEventHandler.cpp @@ -1,44 +1,45 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical Image Computing. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkStdDisplayActionEventHandler.h" // mitk core #include "mitkDisplayActionEventFunctions.h" // itk #include void mitk::StdDisplayActionEventHandler::InitStdActions() { - // #TODO: change function call for new mitk::WeakPointer - if (m_ObservableBroadcast.IsNull()) + if (m_ObservableBroadcast.IsExpired()) { mitkThrow() << "No display action event broadcast class set to observe. Use 'SetObservableBroadcast' before initializing actions."; } + auto observableBroadcast = m_ObservableBroadcast.Lock(); + StdFunctionCommand::ActionFunction actionFunction = DisplayActionEventFunctions::MoveSenderCameraAction(); ConnectDisplayActionEvent(DisplayMoveEvent(nullptr, Vector2D()), actionFunction); actionFunction = DisplayActionEventFunctions::SetCrosshairAction(); ConnectDisplayActionEvent(DisplaySetCrosshairEvent(nullptr, Point3D()), actionFunction); actionFunction = DisplayActionEventFunctions::ZoomSenderCameraAction(); ConnectDisplayActionEvent(DisplayZoomEvent(nullptr, 0.0, Point2D()), actionFunction); actionFunction = DisplayActionEventFunctions::ScrollSliceStepperAction(); ConnectDisplayActionEvent(DisplayScrollEvent(nullptr, 0), actionFunction); }