#ifndef __CPEXTENSIONS__VISUALIZATION__BASEINTERACTORSTYLE__H__ #define __CPEXTENSIONS__VISUALIZATION__BASEINTERACTORSTYLE__H__ #include #include #include /* * Compile ITK and VTK with: cmake -DCMAKE_CXX_FLAGS="-std=c++11" /dir/to/source */ /* ========================================================================= * Double click algorithm taken from: * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/ * ========================================================================= */ // ------------------------------------------------------------------------- #define BaseInteractorStyle_DIFF_TIME \ std::chrono::duration_cast< std::chrono::milliseconds >( \ std::chrono::system_clock::now( ).time_since_epoch( ) \ ).count( ) namespace cpExtensions { namespace Visualization { /** */ class cpExtensions_EXPORT BaseInteractorStyle : public vtkInteractorStyle { public: typedef BaseInteractorStyle Self; vtkTypeMacro( BaseInteractorStyle, vtkInteractorStyle ); enum ButtonID { ButtonID_None = 0, ButtonID_Left, ButtonID_Middle, ButtonID_Right }; public: static Self* New( ); void DelegateTDxEvent( unsigned long event, void* calldata ); // Possible mouse motion events virtual void OnMouseMove( ) { } virtual void OnMouseWheelForward( ) { } virtual void OnMouseWheelBackward( ) { } // Possible mouse click-related events inline ButtonID GetButtonID( ) const { return( this->ActiveButton ); } virtual void OnLeftButtonDown( ) { } virtual void OnLeftButtonUp( ) { } virtual void OnLeftClick( ) { } virtual void OnLeftDoubleClick( ) { } virtual void OnMiddleButtonDown( ) { } virtual void OnMiddleButtonUp( ) { } virtual void OnMiddleClick( ) { } virtual void OnMiddleDoubleClick( ) { } virtual void OnRightButtonDown( ) { } virtual void OnRightButtonUp( ) { } virtual void OnRightClick( ) { } virtual void OnRightDoubleClick( ) { } // Keyboard-related events virtual void OnChar( ) { } virtual void OnKeyDown( ) { } virtual void OnKeyUp( ) { } virtual void OnKeyPress( ) { } virtual void OnKeyRelease( ) { } // Other events virtual void OnExpose( ) { } virtual void OnConfigure( ) { } virtual void OnEnter( ) { } virtual void OnLeave( ) { } // Unused methods inline void StartState( int newstate ) { } inline void StopState( ) { } inline void StartAnimate( ) { } inline void StopAnimate( ) { } inline void StartRotate( ) { } inline void EndRotate( ) { } inline void StartZoom( ) { } inline void EndZoom( ) { } inline void StartPan( ) { } inline void EndPan( ) { } inline void StartSpin( ) { } inline void EndSpin( ) { } inline void StartDolly( ) { } inline void EndDolly( ) { } inline void StartUniformScale( ) { } inline void EndUniformScale( ) { } inline void StartTimer( ) { } inline void EndTimer( ) { } inline void StartTwoPointer( ) { } inline void EndTwoPointer( ) { } inline void OnTimer( ) { } protected: BaseInteractorStyle( ); virtual ~BaseInteractorStyle( ); static void _ProcessEvents( vtkObject* object, unsigned long event, void* clientdata, void* calldata ); private: // Purposely not implemented BaseInteractorStyle( const Self& ); Self& operator=( const Self& ); protected: /** * Button events */ struct MouseButtonEvent { static const long MAX_DOUBLE_CLICK; long LastButtonUp; long LastButtonHeld; long LastButtonDown; inline MouseButtonEvent( ) { this->Reset( ); } inline void Reset( ) { this->LastButtonUp = 0; this->LastButtonHeld = 0; this->LastButtonDown = -1; } inline void Release( ) { long c = BaseInteractorStyle_DIFF_TIME; this->LastButtonUp = c; this->LastButtonHeld = c - this->LastButtonDown; this->LastButtonDown = -1; } inline unsigned char Clicks( ) { unsigned char n = 0; long c = BaseInteractorStyle_DIFF_TIME; if( this->LastButtonHeld < MAX_DOUBLE_CLICK && ( c - this->LastButtonUp ) < MAX_DOUBLE_CLICK ) { this->Reset( ); n = 2; } else n = 1; if( this->LastButtonDown < 0 ) this->LastButtonDown = c; return( n ); } }; MouseButtonEvent LeftButtonEvent; MouseButtonEvent MiddleButtonEvent; MouseButtonEvent RightButtonEvent; ButtonID ActiveButton; }; } // ecapseman } // ecapseman #endif // __CPEXTENSIONS__VISUALIZATION__BASEINTERACTORSTYLE__H__ // eof - $RCSfile$