1 #ifndef __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__
2 #define __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__
4 #include <cpExtensions/cpExtensions_Export.h>
10 #include <vtkInteractorStyle.h>
12 /* =========================================================================
13 * Double click algorithm inspired from:
14 * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
15 * =========================================================================
18 // -------------------------------------------------------------------------
19 #define cpExtensions_BaseInteractorStyle_Commands( C ) \
21 std::map< T##C##Command, void* > m_##C##Commands; \
23 inline void Add##C##Command( T##C##Command c, void* d ) \
27 this->m_##C##Commands[ c ] = d; \
31 inline void Remove##C##Command( T##C##Command c ) \
33 std::map< T##C##Command, void* >::iterator i = \
34 this->m_##C##Commands.find( c ); \
35 if( i != this->m_##C##Commands.end( ) ) \
37 this->m_##C##Commands.erase( i ); \
42 // -------------------------------------------------------------------------
43 #define BaseInteractorStyle_DIFF_TIME \
44 std::chrono::duration_cast< std::chrono::milliseconds >( \
45 std::chrono::system_clock::now( ).time_since_epoch( ) \
48 namespace cpExtensions
54 class cpExtensions_EXPORT BaseInteractorStyle
55 : public vtkInteractorStyle
58 typedef BaseInteractorStyle Self;
59 vtkTypeMacro( BaseInteractorStyle, vtkInteractorStyle );
70 typedef void ( *TMouseCommand )(
71 void*, const ButtonID&, int*, double*, bool, bool, bool
73 typedef void ( *TMouseWheelCommand )( void*, const int&, bool, bool, bool );
74 typedef void ( *TKeyCommand )( void*, const char& );
75 typedef void ( *TVoidCommand )( void* );
76 typedef TMouseCommand TMouseMoveCommand;
77 typedef TMouseCommand TMouseClickCommand;
78 typedef TMouseCommand TMouseDoubleClickCommand;
79 typedef TVoidCommand TExposeCommand;
80 typedef TVoidCommand TConfigureCommand;
81 typedef TVoidCommand TEnterCommand;
82 typedef TVoidCommand TLeaveCommand;
84 // Associate callbacks for each event
85 cpExtensions_BaseInteractorStyle_Commands( MouseMove );
86 cpExtensions_BaseInteractorStyle_Commands( MouseClick );
87 cpExtensions_BaseInteractorStyle_Commands( MouseDoubleClick );
88 cpExtensions_BaseInteractorStyle_Commands( MouseWheel );
89 cpExtensions_BaseInteractorStyle_Commands( Key );
90 cpExtensions_BaseInteractorStyle_Commands( Expose );
91 cpExtensions_BaseInteractorStyle_Commands( Configure );
92 cpExtensions_BaseInteractorStyle_Commands( Enter );
93 cpExtensions_BaseInteractorStyle_Commands( Leave );
96 vtkObject* GetAssociatedObject( );
97 const vtkObject* GetAssociatedObject( ) const;
98 void SetAssociatedObject( vtkObject* obj );
100 static void SetSetDoubleClickDelay( long delay );
101 void DelegateTDxEvent( unsigned long event, void* calldata );
103 // Possible mouse motion events
104 virtual void OnMouseMove( );
105 virtual void OnMouseWheelForward( );
106 virtual void OnMouseWheelBackward( );
108 // Possible mouse click-related events
109 inline ButtonID GetButtonID( ) const
111 return( this->m_ActiveButton );
114 virtual void OnLeftButtonDown( );
115 virtual void OnLeftButtonUp( );
116 virtual void OnMiddleButtonDown( );
117 virtual void OnMiddleButtonUp( );
118 virtual void OnRightButtonDown( );
119 virtual void OnRightButtonUp( );
121 virtual void OnLeftClick( );
122 virtual void OnLeftDoubleClick( );
123 virtual void OnMiddleClick( );
124 virtual void OnMiddleDoubleClick( );
125 virtual void OnRightClick( );
126 virtual void OnRightDoubleClick( );
128 // Keyboard-related events
129 virtual void OnChar( );
130 virtual void OnKeyDown( ) { }
131 virtual void OnKeyUp( ) { }
132 virtual void OnKeyPress( ) { }
133 virtual void OnKeyRelease( ) { }
136 virtual void OnExpose( );
137 virtual void OnConfigure( );
138 virtual void OnEnter( );
139 virtual void OnLeave( );
141 virtual void Dolly( );
145 BaseInteractorStyle( );
146 virtual ~BaseInteractorStyle( );
148 virtual void _Dolly( double factor );
150 // Extension interface
151 virtual bool _PickPosition( int idx[ 2 ], double pos[ 3 ] ) = 0;
153 // Main event callback
154 static void _ProcessEvents(
162 // Purposely not implemented
163 BaseInteractorStyle( const Self& );
164 Self& operator=( const Self& );
167 vtkObject* m_AssociatedObject;
168 double m_MotionFactor;
173 struct _TMouseButtonEvent
175 static long MaxDoubleClick;
177 long m_LastButtonHeld;
178 long m_LastButtonDown;
180 inline _TMouseButtonEvent( )
184 this->m_LastButtonUp = 0;
185 this->m_LastButtonHeld = 0;
186 this->m_LastButtonDown = -1;
188 inline void Release( )
190 long c = BaseInteractorStyle_DIFF_TIME;
191 this->m_LastButtonUp = c;
192 this->m_LastButtonHeld = c - this->m_LastButtonDown;
193 this->m_LastButtonDown = -1;
195 inline unsigned char Clicks( )
198 long c = BaseInteractorStyle_DIFF_TIME;
200 this->m_LastButtonHeld < MaxDoubleClick &&
201 ( c - this->m_LastButtonUp ) < MaxDoubleClick
209 if( this->m_LastButtonDown < 0 )
210 this->m_LastButtonDown = c;
214 _TMouseButtonEvent m_LeftButtonEvent;
215 _TMouseButtonEvent m_MiddleButtonEvent;
216 _TMouseButtonEvent m_RightButtonEvent;
217 ButtonID m_ActiveButton;
224 #endif // __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__