Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkDisplayActionEventHandler.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 
14 
16 {
17  if (!m_ObservableBroadcast.IsExpired())
18  {
19  auto observableBroadcastPtr = m_ObservableBroadcast.Lock();
20 
21  // remove current observer
22  for (const auto& tag : m_ObserverTags)
23  {
24  observableBroadcastPtr->RemoveObserver(tag);
25  }
26  m_ObserverTags.clear();
27  }
28 }
29 
31 {
32  if (m_ObservableBroadcast == observableBroadcast)
33  {
34  // no need to update the broadcast class
35  return;
36  }
37 
38  if (!m_ObservableBroadcast.IsExpired())
39  {
40  auto observableBroadcastPtr = m_ObservableBroadcast.Lock();
41 
42  // remove current observer
43  for (const auto& tag : m_ObserverTags)
44  {
45  observableBroadcastPtr->RemoveObserver(tag);
46  }
47  m_ObserverTags.clear();
48  }
49 
50  // set new broadcast class
51  m_ObservableBroadcast = observableBroadcast;
52 }
53 
55  const StdFunctionCommand::ActionFunction& actionFunction,
56  const StdFunctionCommand::FilterFunction& filterFunction)
57 {
58  if (m_ObservableBroadcast.IsExpired())
59  {
60  mitkThrow() << "No display action event broadcast class set to observe. Use 'SetObservableBroadcast' before connecting events.";
61  }
62 
63  auto observableBroadcast = m_ObservableBroadcast.Lock();
64  auto command = StdFunctionCommand::New();
65  command->SetCommandAction(actionFunction);
66  command->SetCommandFilter(filterFunction);
67  OberserverTagType tag = observableBroadcast->AddObserver(displayActionEvent, command);
68  m_ObserverTags.push_back(tag);
69  return tag;
70 }
71 
73 {
74  if (m_ObservableBroadcast.IsExpired())
75  {
76  mitkThrow() << "No display action event broadcast class set to observe. Use 'SetObservableBroadcast' before disconnecting observer.";
77  }
78 
79  auto observableBroadcast = m_ObservableBroadcast.Lock();
80  std::vector<OberserverTagType>::iterator observerTagPosition = std::find(m_ObserverTags.begin(), m_ObserverTags.end(), observerTag);
81  if (observerTagPosition != m_ObserverTags.end())
82  {
83  observableBroadcast->RemoveObserver(observerTag);
84  m_ObserverTags.erase(observerTagPosition);
85  }
86 }
87 
89 {
90  if (m_ObservableBroadcast.IsExpired())
91  {
92  mitkThrow() << "No display action event broadcast class set to observe. Use 'SetObservableBroadcast' before initializing actions.";
93  }
94 
95  auto observableBroadcast = m_ObservableBroadcast.Lock();
96  // remove all current display action events as observer
97  auto allObserverTags = GetAllObserverTags();
98  for (const auto& tag : allObserverTags)
99  {
100  observableBroadcast->RemoveObserver(tag);
101  }
102  m_ObserverTags.clear();
103 
104  InitActionsImpl();
105 }
std::vector< OberserverTagType > m_ObserverTags
const std::vector< OberserverTagType > & GetAllObserverTags()
virtual void InitActionsImpl()
Sub-classes need to implement this function to define a customized behavior for default action pre-de...
void DisconnectObserver(OberserverTagType observerTag)
Uses the given observer tag to remove the corresponding custom command as an observer of the observed...
std::function< void(const itk::EventObject &)> ActionFunction
WeakPointer< DisplayActionEventBroadcast > m_ObservableBroadcast
This class serves as an event state machine while simultaneously observing interaction events...
#define mitkThrow()
void SetObservableBroadcast(DisplayActionEventBroadcast *observableBroadcast)
Sets the display action event broadcast class that should be observed. This class receives events fro...
OberserverTagType ConnectDisplayActionEvent(const DisplayActionEvent &displayActionEvent, const StdFunctionCommand::ActionFunction &actionFunction, const StdFunctionCommand::FilterFunction &filterFunction=[](const itk::EventObject &) { return true;})
Uses the given std::functions to customize a command: The display action event is used to define on w...
static Pointer New()
void InitActions()
This function can be used by sub-classes to initialize a set of pre-defined DisplayActionEventFunctio...
std::function< bool(const itk::EventObject &)> FilterFunction