25 return (d1.
Lock()->GetLayer() > d2.
Lock()->GetLayer());
34 std::string specificRenderer =
"(rendererName=" + rendererName +
")";
38 std::string anyRenderer =
"(!(rendererName=*))";
41 std::string classInteractionEventObserver =
46 us::LDAPFilter filter(
"(&(|" + specificRenderer + anyRenderer +
")" + classInteractionEventObserver +
")");
50 m_EventObserverTracker->Open();
56 RemoveOrphanedInteractors();
60 if (dataInteractor !=
nullptr)
61 m_Interactors.push_back(dataInteractor);
74 for (
auto it = m_Interactors.begin(); it != m_Interactors.end();)
76 if ((*it).IsExpired() || (*it).Lock()->GetDataNode() ==
nullptr || (*it).Lock()->GetDataNode() == dataNode)
78 it = m_Interactors.erase(it);
89 return m_Interactors.size();
94 m_EventObserverTracker->Close();
95 delete m_EventObserverTracker;
97 m_Interactors.clear();
103 bool eventIsHandled =
false;
106 if (internalEvent !=
nullptr)
108 eventIsHandled = HandleInternalEvent(internalEvent);
115 switch (m_ProcessingMode)
119 if (std::strcmp(p->GetNameOfClass(),
"MouseReleaseEvent") == 0)
124 eventIsHandled = m_SelectedInteractor.
Lock()->HandleEvent(event, m_SelectedInteractor.
Lock()->GetDataNode());
126 m_SelectedInteractor =
nullptr;
129 if (eventIsHandled ==
false && !m_SelectedInteractor.
IsExpired())
130 eventIsHandled = m_SelectedInteractor.
Lock()->HandleEvent(event, m_SelectedInteractor.
Lock()->GetDataNode());
137 eventIsHandled = m_SelectedInteractor.
Lock()->HandleEvent(event, m_SelectedInteractor.
Lock()->GetDataNode());
138 SetEventProcessingMode(m_SelectedInteractor.
Lock());
145 m_SelectedInteractor.
Lock()->HandleEvent(event, m_SelectedInteractor.
Lock()->GetDataNode()) ==
true)
147 SetEventProcessingMode(m_SelectedInteractor.
Lock());
148 eventIsHandled =
true;
158 if (m_ProcessingMode ==
REGULAR || (m_ProcessingMode ==
PREFERINPUT && eventIsHandled ==
false))
160 if (std::strcmp(p->GetNameOfClass(),
"MousePressEvent") == 0)
162 m_Interactors.sort(cmp());
167 ListInteractorType::const_iterator it;
168 for (it = tmpInteractorList.cbegin(); it != tmpInteractorList.cend(); ++it)
170 if (!(*it).IsExpired() && (*it).Lock()->HandleEvent(event, (*it).Lock()->GetDataNode()))
173 if (!(*it).IsExpired())
177 SetEventProcessingMode((*it).Lock());
179 if (std::strcmp(p->GetNameOfClass(),
"MousePressEvent") == 0 && m_ProcessingMode ==
REGULAR)
181 m_SelectedInteractor = *it;
184 eventIsHandled =
true;
191 const std::vector<us::ServiceReference<InteractionEventObserver>> listEventObserver =
192 m_EventObserverTracker->GetServiceReferences();
193 for (
auto it = listEventObserver.cbegin();
194 it != listEventObserver.cend();
198 if (interactionEventObserver !=
nullptr)
200 if (interactionEventObserver->
IsEnabled())
202 interactionEventObserver->
Notify(event, eventIsHandled);
208 if (!m_QueuedEvents.empty())
211 m_QueuedEvents.pop_front();
214 return eventIsHandled;
221 void mitk::Dispatcher::RemoveOrphanedInteractors()
223 for (
auto it = m_Interactors.begin(); it != m_Interactors.end();)
225 if ((*it).IsExpired())
227 it = m_Interactors.erase(it);
235 it = m_Interactors.erase(it);
241 if (interactor != it->Lock().GetPointer())
243 it = m_Interactors.erase(it);
256 m_QueuedEvents.push_back(event);
259 void mitk::Dispatcher::SetEventProcessingMode(
DataInteractor *dataInteractor)
261 m_ProcessingMode = dataInteractor->
GetMode();
264 m_SelectedInteractor = dataInteractor;
268 bool mitk::Dispatcher::HandleInternalEvent(
InternalEvent *internalEvent)
Base class to implement InteractionEventObservers.
itk::SmartPointer< T > Lock() const
std::list< mitk::WeakPointer< DataInteractor > > ListInteractorType
virtual void Notify(InteractionEvent *interactionEvent, bool isHandled)=0
Class to create events from within the application to signal about internal events.
DataNode * GetDataNode() const
bool ProcessEvent(InteractionEvent *event)
BaseRenderer * GetSender() const
Base class from with interactors that handle DataNodes are to be derived.
vcl_size_t GetNumberOfInteractors()
std::string GetSignalName() const
void SetRenderWindowFocus(vtkRenderWindow *focusWindow)
Sets a flag to the given renderwindow to indicated that it has the focus e.g. has been clicked recent...
DataInteractor * GetTargetInteractor() const
static RenderingManager * GetInstance()
virtual DataInteractor::Pointer GetDataInteractor() const
bool IsExpired() const noexcept
Dispatcher(const std::string &rendererName)
static const std::string IntDeactivateMe
US_Core_EXPORT const std::string & OBJECTCLASS()
void AddDataInteractor(const DataNode *dataNode)
vtkRenderWindow * GetRenderWindow() const
Access the RenderWindow into which this renderer renders.
virtual void SetDataNode(DataNode *dataNode)
void QueueEvent(InteractionEvent *event)
ProcessEventMode GetMode() const
virtual void SetDataInteractor(const DataInteractor::Pointer interactor)
Set the Interactor.
static ModuleContext * GetModuleContext()
Returns the module context of the calling module.
void RequestUpdateAll(RequestType type=REQUEST_UPDATE_ALL)
void RemoveDataInteractor(const DataNode *dataNode)
Class for nodes of the DataTree.