diff --git a/Core/Code/Interactions/mitkMouseModeSwitcher.cpp b/Core/Code/Interactions/mitkMouseModeSwitcher.cpp index 038faad398..f85eff83d5 100644 --- a/Core/Code/Interactions/mitkMouseModeSwitcher.cpp +++ b/Core/Code/Interactions/mitkMouseModeSwitcher.cpp @@ -1,191 +1,209 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. 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 "mitkMouseModeSwitcher.h" #include "mitkDisplayInteractor.h" #include "mitkDisplayVectorInteractor.h" #include "mitkDisplayVectorInteractorLevelWindow.h" #include "mitkDisplayVectorInteractorScroll.h" mitk::MouseModeSwitcher::MouseModeSwitcher( mitk::GlobalInteraction* gi ) : m_GlobalInteraction( gi ) , m_ActiveInteractionScheme( MITK ) , m_ActiveMouseMode( MousePointer ) , m_LeftMouseButtonHandler( NULL ) { assert(gi); this->InitializeListeners(); this->SetInteractionScheme( m_ActiveInteractionScheme ); } mitk::MouseModeSwitcher::~MouseModeSwitcher() { } void mitk::MouseModeSwitcher::InitializeListeners() { mitk::DisplayVectorInteractor::Pointer moveAndZoomInteractor = mitk::DisplayVectorInteractor::New( "moveNzoom", new mitk::DisplayInteractor() ); mitk::StateMachine::Pointer listener = moveAndZoomInteractor.GetPointer(); m_ListenersForMITK.push_back( listener ); mitk::DisplayVectorInteractorScroll::Pointer scrollInteractor = mitk::DisplayVectorInteractorScroll::New( "alternativeScroll", new mitk::DisplayInteractor() ); listener = scrollInteractor; m_ListenersForPACS.push_back( listener ); mitk::DisplayVectorInteractorLevelWindow::Pointer lwInteractor = mitk::DisplayVectorInteractorLevelWindow::New("alternativeLevelWindow"); listener = lwInteractor; m_ListenersForPACS.push_back( listener ); mitk::DisplayVectorInteractor::Pointer panInteractor = mitk::DisplayVectorInteractor::New( "alternativePan", new mitk::DisplayInteractor() ); listener = panInteractor; m_ListenersForPACS.push_back( listener ); mitk::DisplayVectorInteractor::Pointer crtlZoomInteractor = mitk::DisplayVectorInteractor::New( "alternativeZoom", new mitk::DisplayInteractor() ); listener = crtlZoomInteractor; m_ListenersForPACS.push_back( listener ); } void mitk::MouseModeSwitcher::SetInteractionScheme( InteractionScheme scheme ) { switch ( scheme ) { case MITK : { ListenerList::iterator iter; for ( iter=m_ListenersForPACS.begin(); iter!=m_ListenersForPACS.end(); iter++ ) { m_GlobalInteraction->RemoveListener( (*iter) ); } for ( iter=m_ListenersForMITK.begin(); iter!=m_ListenersForMITK.end(); iter++ ) { m_GlobalInteraction->AddListener( (*iter) ); } break; } // case MITK case PACS : { ListenerList::iterator iter; for ( iter=m_ListenersForMITK.begin(); iter!=m_ListenersForMITK.end(); iter++ ) { m_GlobalInteraction->RemoveListener( (*iter) ); } for ( iter=m_ListenersForPACS.begin(); iter!=m_ListenersForPACS.end(); iter++ ) { m_GlobalInteraction->AddListener( (*iter) ); } this->SelectMouseMode( MousePointer ); break; } // case PACS + case OFF: + { + ListenerList::iterator iter; + for ( iter=m_ListenersForMITK.begin(); iter!=m_ListenersForMITK.end(); iter++ ) + { + m_GlobalInteraction->RemoveListener( (*iter) ); + } + for ( iter=m_ListenersForPACS.begin(); iter!=m_ListenersForPACS.end(); iter++ ) + { + m_GlobalInteraction->RemoveListener( (*iter) ); + } + break; + } // case OFF } // switch m_ActiveInteractionScheme = scheme; } +mitk::MouseModeSwitcher::InteractionScheme mitk::MouseModeSwitcher::GetInteractionScheme() const +{ + return m_ActiveInteractionScheme; +} + void mitk::MouseModeSwitcher::SelectMouseMode( MouseMode mode ) { if ( m_ActiveInteractionScheme != PACS ) return; switch ( mode ) { case MousePointer : { m_GlobalInteraction->RemoveListener( m_LeftMouseButtonHandler ); break; } // case 0 case Scroll : { m_GlobalInteraction->RemoveListener( m_LeftMouseButtonHandler ); mitk::DisplayVectorInteractorScroll::Pointer scrollInteractor = mitk::DisplayVectorInteractorScroll::New( "Scroll", new mitk::DisplayInteractor() ); m_LeftMouseButtonHandler = scrollInteractor; m_GlobalInteraction->AddListener( m_LeftMouseButtonHandler ); break; } // case 1 case LevelWindow : { m_GlobalInteraction->RemoveListener( m_LeftMouseButtonHandler ); mitk::DisplayVectorInteractorLevelWindow::Pointer lwInteractor = mitk::DisplayVectorInteractorLevelWindow::New( "LevelWindow" ); m_LeftMouseButtonHandler = lwInteractor; m_GlobalInteraction->AddListener( m_LeftMouseButtonHandler ); break; } // case 2 case Zoom : { m_GlobalInteraction->RemoveListener( m_LeftMouseButtonHandler ); mitk::DisplayVectorInteractor::Pointer zoomInteractor = mitk::DisplayVectorInteractor::New( "Zoom", new mitk::DisplayInteractor() ); m_LeftMouseButtonHandler = zoomInteractor; m_GlobalInteraction->AddListener( m_LeftMouseButtonHandler ); break; } // case 3 case Pan : { m_GlobalInteraction->RemoveListener( m_LeftMouseButtonHandler ); mitk::DisplayVectorInteractor::Pointer panInteractor = mitk::DisplayVectorInteractor::New( "Pan", new mitk::DisplayInteractor() ); m_LeftMouseButtonHandler = panInteractor; m_GlobalInteraction->AddListener( m_LeftMouseButtonHandler ); break; } // case 4 } // switch (mode) m_ActiveMouseMode = mode; this->InvokeEvent( MouseModeChangedEvent() ); } mitk::MouseModeSwitcher::MouseMode mitk::MouseModeSwitcher::GetCurrentMouseMode() const { return m_ActiveMouseMode; } diff --git a/Core/Code/Interactions/mitkMouseModeSwitcher.h b/Core/Code/Interactions/mitkMouseModeSwitcher.h index 0bcc2ddcdc..32fcfb9b2e 100644 --- a/Core/Code/Interactions/mitkMouseModeSwitcher.h +++ b/Core/Code/Interactions/mitkMouseModeSwitcher.h @@ -1,148 +1,156 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. 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. ===================================================================*/ #ifndef MITKMouseModeSwitcher_H_HEADER_INCLUDED_C10DC4EB #define MITKMouseModeSwitcher_H_HEADER_INCLUDED_C10DC4EB #include "MitkExports.h" #include "mitkGlobalInteraction.h" #include namespace mitk { /*********************************************************************** * * \brief Class that offers a convenient way to switch between different * interaction schemes * * This class offers the possibility to swtch between the two different * interaction schemes that are available: * - MITK : The original interaction scheme * - left mouse button : setting the cross position in the MPR view * - middle mouse button : panning * - right mouse button : zooming * * * - PACS : an alternative interaction scheme that behaves more like a * PACS workstation * - left mouse button : behaviour depends on current MouseMode * - middle mouse button : fast scrolling * - right mouse button : level-window * - ctrl + right button : zooming * - shift+ right button : panning * +* - OFF : Turns all interactors for MITK mode and PACS mode off. +* * There are 5 different MouseModes that are available in the PACS scheme. * Each MouseMode defines the interaction that is performed on a left * mouse button click: * - Pointer : sets the cross position for the MPR * - Scroll * - Level-Window * - Zoom * - Pan * * When the interaction scheme or the MouseMode is changed, this class * manages the adding and removing of the relevant listeners offering * a convenient way to modify the interaction behaviour. * ***********************************************************************/ class MITK_CORE_EXPORT MouseModeSwitcher : public itk::Object { public: #pragma GCC visibility push(default) /** \brief Can be observed by GUI class to update button states when mode is changed programatically. */ itkEventMacro( MouseModeChangedEvent, itk::AnyEvent ); #pragma GCC visibility pop mitkClassMacro( MouseModeSwitcher, itk::Object ); mitkNewMacro1Param( Self, GlobalInteraction* ); // enum of the different interaction schemes that are available enum InteractionScheme { PACS = 0, - MITK = 1 + MITK = 1, + OFF = 2 }; // enum of available mouse modes for PACS interaction scheme enum MouseMode { MousePointer = 0, Scroll, LevelWindow, Zoom, Pan }; /** * \brief Setter for interaction scheme */ void SetInteractionScheme( InteractionScheme ); + /** + * \brief Getter for InteractionScheme. + */ + InteractionScheme GetInteractionScheme() const; + /** * \brief Setter for mouse mode */ void SelectMouseMode( MouseMode mode ); /** * \brief Returns the current mouse mode */ MouseMode GetCurrentMouseMode() const; protected: /** * \brief Constructor takes GlobalInteraction, MUST NOT be NULL. **/ MouseModeSwitcher( GlobalInteraction* ); virtual ~MouseModeSwitcher(); private: /** * \brief Initializes the listeners for the different interaction schemes * * This method creates all listeners that are required for the different * interaction schemes. These are stored in two lists. */ void InitializeListeners(); GlobalInteraction::Pointer m_GlobalInteraction; InteractionScheme m_ActiveInteractionScheme; MouseMode m_ActiveMouseMode; typedef std::vector ListenerList; ListenerList m_ListenersForMITK; ListenerList m_ListenersForPACS; StateMachine::Pointer m_LeftMouseButtonHandler; }; } // namespace mitk #endif /* MITKMouseModeSwitcher_H_HEADER_INCLUDED_C10DC4EB */