1 #ifndef __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__
2 #define __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__
4 #include <cpExtensions/cpExtensions_Export.h>
6 #include <cpPlugins_Config.h>
11 #include <vtkInteractorStyle.h>
13 /* =========================================================================
14 * Double click algorithm inspired from:
15 * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
16 * =========================================================================
19 // -------------------------------------------------------------------------
20 #define cpExtensions_BaseInteractorStyle_Commands( C ) \
22 std::map< T##C##Command, void* > m_##C##Commands; \
24 inline void Add##C##Command( T##C##Command c, void* d ) \
28 this->m_##C##Commands[ c ] = d; \
32 inline void Remove##C##Command( T##C##Command c ) \
34 std::map< T##C##Command, void* >::iterator i = \
35 this->m_##C##Commands.find( c ); \
36 if( i != this->m_##C##Commands.end( ) ) \
38 this->m_##C##Commands.erase( i ); \
43 // -------------------------------------------------------------------------
44 #define BaseInteractorStyle_DIFF_TIME \
45 std::chrono::duration_cast< std::chrono::milliseconds >( \
46 std::chrono::system_clock::now( ).time_since_epoch( ) \
49 namespace cpExtensions
55 class cpExtensions_EXPORT BaseInteractorStyle
56 : public vtkInteractorStyle
59 typedef BaseInteractorStyle Self;
60 vtkTypeMacro( BaseInteractorStyle, vtkInteractorStyle );
71 typedef void ( *TMouseCommand )(
72 void*, const ButtonID&, int*, double*, bool, bool, bool
74 typedef void ( *TMouseWheelCommand )( void*, const int&, bool, bool, bool );
75 typedef void ( *TKeyCommand )( void*, const char& );
76 typedef void ( *TVoidCommand )( void* );
77 typedef TMouseCommand TMouseMoveCommand;
78 typedef TMouseCommand TMouseClickCommand;
79 typedef TMouseCommand TMouseDoubleClickCommand;
80 typedef TVoidCommand TExposeCommand;
81 typedef TVoidCommand TConfigureCommand;
82 typedef TVoidCommand TEnterCommand;
83 typedef TVoidCommand TLeaveCommand;
85 // Associate callbacks for each event
86 cpExtensions_BaseInteractorStyle_Commands( MouseMove );
87 cpExtensions_BaseInteractorStyle_Commands( MouseClick );
88 cpExtensions_BaseInteractorStyle_Commands( MouseDoubleClick );
89 cpExtensions_BaseInteractorStyle_Commands( MouseWheel );
90 cpExtensions_BaseInteractorStyle_Commands( Key );
91 cpExtensions_BaseInteractorStyle_Commands( Expose );
92 cpExtensions_BaseInteractorStyle_Commands( Configure );
93 cpExtensions_BaseInteractorStyle_Commands( Enter );
94 cpExtensions_BaseInteractorStyle_Commands( Leave );
97 vtkObject* GetAssociatedObject( );
98 const vtkObject* GetAssociatedObject( ) const;
99 void SetAssociatedObject( vtkObject* obj );
101 static void SetSetDoubleClickDelay( long delay );
102 void DelegateTDxEvent( unsigned long event, void* calldata );
104 // Possible mouse motion events
105 virtual void OnMouseMove( );
106 virtual void OnMouseWheelForward( );
107 virtual void OnMouseWheelBackward( );
109 // Possible mouse click-related events
110 inline ButtonID GetButtonID( ) const
112 return( this->m_ActiveButton );
115 virtual void OnLeftButtonDown( );
116 virtual void OnLeftButtonUp( );
117 virtual void OnMiddleButtonDown( );
118 virtual void OnMiddleButtonUp( );
119 virtual void OnRightButtonDown( );
120 virtual void OnRightButtonUp( );
122 virtual void OnLeftClick( );
123 virtual void OnLeftDoubleClick( );
124 virtual void OnMiddleClick( );
125 virtual void OnMiddleDoubleClick( );
126 virtual void OnRightClick( );
127 virtual void OnRightDoubleClick( );
129 // Keyboard-related events
130 virtual void OnChar( );
131 virtual void OnKeyDown( ) { }
132 virtual void OnKeyUp( ) { }
133 virtual void OnKeyPress( ) { }
134 virtual void OnKeyRelease( ) { }
137 virtual void OnExpose( );
138 virtual void OnConfigure( );
139 virtual void OnEnter( );
140 virtual void OnLeave( );
142 virtual void Dolly( );
146 BaseInteractorStyle( );
147 virtual ~BaseInteractorStyle( );
149 virtual void _Dolly( double factor );
151 // Extension interface
152 virtual bool _PickPosition( int idx[ 2 ], double pos[ 3 ] ) = 0;
154 // Main event callback
155 static void _ProcessEvents(
163 // Purposely not implemented
164 BaseInteractorStyle( const Self& );
165 Self& operator=( const Self& );
168 vtkObject* m_AssociatedObject;
169 double m_MotionFactor;
174 struct _TMouseButtonEvent
176 static long MaxDoubleClick;
178 long m_LastButtonHeld;
179 long m_LastButtonDown;
181 inline _TMouseButtonEvent( )
185 this->m_LastButtonUp = 0;
186 this->m_LastButtonHeld = 0;
187 this->m_LastButtonDown = -1;
189 inline void Release( )
191 long c = BaseInteractorStyle_DIFF_TIME;
192 this->m_LastButtonUp = c;
193 this->m_LastButtonHeld = c - this->m_LastButtonDown;
194 this->m_LastButtonDown = -1;
196 inline unsigned char Clicks( )
199 long c = BaseInteractorStyle_DIFF_TIME;
201 this->m_LastButtonHeld < MaxDoubleClick &&
202 ( c - this->m_LastButtonUp ) < MaxDoubleClick
210 if( this->m_LastButtonDown < 0 )
211 this->m_LastButtonDown = c;
215 _TMouseButtonEvent m_LeftButtonEvent;
216 _TMouseButtonEvent m_MiddleButtonEvent;
217 _TMouseButtonEvent m_RightButtonEvent;
218 ButtonID m_ActiveButton;
225 #endif // __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__