1 #ifndef __CPEXTENSIONS__VISUALIZATION__BASEINTERACTORSTYLE__H__
2 #define __CPEXTENSIONS__VISUALIZATION__BASEINTERACTORSTYLE__H__
4 #include <cpExtensions/cpExtensions_Export.h>
9 #include <vtkInteractorStyle.h>
11 /* =========================================================================
12 * Double click algorithm inspired from:
13 * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
14 * =========================================================================
17 // -------------------------------------------------------------------------
18 #define BaseInteractorStyle_DIFF_TIME \
19 std::chrono::duration_cast< std::chrono::milliseconds >( \
20 std::chrono::system_clock::now( ).time_since_epoch( ) \
23 namespace cpExtensions
25 namespace Visualization
29 class cpExtensions_EXPORT BaseInteractorStyle
30 : public vtkInteractorStyle
33 typedef BaseInteractorStyle Self;
34 vtkTypeMacro( BaseInteractorStyle, vtkInteractorStyle );
45 typedef void ( *TMouseCommand )( void*, const ButtonID&, double*, bool, bool, bool );
46 typedef void ( *TMouseWheelCommand )( void*, const int&, bool, bool, bool );
47 typedef void ( *TKeyCommand )( void*, const char& );
48 typedef void ( *TVoidCommand )( void* );
51 // Associate callbacks for each event
52 void AddMouseMoveCommand( TMouseCommand command, void* data );
53 void AddMouseClickCommand( TMouseCommand command, void* data );
54 void AddMouseDoubleClickCommand( TMouseCommand command, void* data );
55 void AddMouseWheelCommand( TMouseWheelCommand command, void* data );
56 void AddKeyCommand( TKeyCommand command, void* data );
57 void AddExposeCommand( TVoidCommand command, void* data );
58 void AddConfigureCommand( TVoidCommand command, void* data );
59 void AddEnterCommand( TVoidCommand command, void* data );
60 void AddLeaveCommand( TVoidCommand command, void* data );
62 void DelegateTDxEvent( unsigned long event, void* calldata );
64 // Possible mouse motion events
65 virtual void OnMouseMove( );
66 virtual void OnMouseWheelForward( );
67 virtual void OnMouseWheelBackward( );
69 // Possible mouse click-related events
70 inline ButtonID GetButtonID( ) const
71 { return( this->m_ActiveButton ); }
73 virtual void OnLeftButtonDown( );
74 virtual void OnLeftButtonUp( );
75 virtual void OnMiddleButtonDown( );
76 virtual void OnMiddleButtonUp( );
77 virtual void OnRightButtonDown( );
78 virtual void OnRightButtonUp( );
80 virtual void OnLeftClick( );
81 virtual void OnLeftDoubleClick( );
82 virtual void OnMiddleClick( );
83 virtual void OnMiddleDoubleClick( );
84 virtual void OnRightClick( );
85 virtual void OnRightDoubleClick( );
87 // Keyboard-related events
88 virtual void OnChar( );
89 virtual void OnKeyDown( );
90 virtual void OnKeyUp( );
91 virtual void OnKeyPress( );
92 virtual void OnKeyRelease( );
95 virtual void OnExpose( );
96 virtual void OnConfigure( );
97 virtual void OnEnter( );
98 virtual void OnLeave( );
100 virtual void Dolly( );
104 BaseInteractorStyle( );
105 virtual ~BaseInteractorStyle( );
107 virtual void _Dolly( double factor );
109 // Extension interface
110 virtual bool _PickPosition( double pos[ 3 ] ) = 0;
112 // Main event callback
113 static void _ProcessEvents(
121 // Purposely not implemented
122 BaseInteractorStyle( const Self& );
123 Self& operator=( const Self& );
126 double m_MotionFactor;
129 std::vector< std::pair< TMouseCommand, void* > > m_MouseMoveCommands;
130 std::vector< std::pair< TMouseCommand, void* > > m_MouseClickCommands;
131 std::vector< std::pair< TMouseCommand, void* > > m_MouseDoubleClickCommands;
132 std::vector< std::pair< TMouseWheelCommand, void* > > m_MouseWheelCommands;
133 std::vector< std::pair< TKeyCommand, void* > > m_KeyCommands;
134 std::vector< std::pair< TVoidCommand, void* > > m_ExposeCommands;
135 std::vector< std::pair< TVoidCommand, void* > > m_ConfigureCommands;
136 std::vector< std::pair< TVoidCommand, void* > > m_EnterCommands;
137 std::vector< std::pair< TVoidCommand, void* > > m_LeaveCommands;
142 struct _TMouseButtonEvent
144 static long MaxDoubleClick;
146 long m_LastButtonHeld;
147 long m_LastButtonDown;
149 inline _TMouseButtonEvent( )
153 this->m_LastButtonUp = 0;
154 this->m_LastButtonHeld = 0;
155 this->m_LastButtonDown = -1;
157 inline void Release( )
159 long c = BaseInteractorStyle_DIFF_TIME;
160 this->m_LastButtonUp = c;
161 this->m_LastButtonHeld = c - this->m_LastButtonDown;
162 this->m_LastButtonDown = -1;
164 inline unsigned char Clicks( )
167 long c = BaseInteractorStyle_DIFF_TIME;
169 this->m_LastButtonHeld < MaxDoubleClick &&
170 ( c - this->m_LastButtonUp ) < MaxDoubleClick
178 if( this->m_LastButtonDown < 0 )
179 this->m_LastButtonDown = c;
183 _TMouseButtonEvent m_LeftButtonEvent;
184 _TMouseButtonEvent m_MiddleButtonEvent;
185 _TMouseButtonEvent m_RightButtonEvent;
186 ButtonID m_ActiveButton;
193 #endif // __CPEXTENSIONS__VISUALIZATION__BASEINTERACTORSTYLE__H__