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 BaseInteractorStyle_DIFF_TIME \
20 std::chrono::duration_cast< std::chrono::milliseconds >( \
21 std::chrono::system_clock::now( ).time_since_epoch( ) \
24 namespace cpExtensions
30 class cpExtensions_EXPORT BaseInteractorStyle
31 : public vtkInteractorStyle
34 typedef BaseInteractorStyle Self;
35 vtkTypeMacro( BaseInteractorStyle, vtkInteractorStyle );
46 typedef void ( *TMouseCommand )(
47 void*, const ButtonID&, int*, double*, bool, bool, bool
49 typedef void ( *TMouseWheelCommand )( void*, const int&, bool, bool, bool );
50 typedef void ( *TKeyCommand )( void*, const char& );
51 typedef void ( *TVoidCommand )( void* );
54 static void SetSetDoubleClickDelay( long delay );
56 // Associate callbacks for each event
57 void AddMouseMoveCommand( TMouseCommand command, void* data );
58 void AddMouseClickCommand( TMouseCommand command, void* data );
59 void AddMouseDoubleClickCommand( TMouseCommand command, void* data );
60 void AddMouseWheelCommand( TMouseWheelCommand command, void* data );
61 void AddKeyCommand( TKeyCommand command, void* data );
62 void AddExposeCommand( TVoidCommand command, void* data );
63 void AddConfigureCommand( TVoidCommand command, void* data );
64 void AddEnterCommand( TVoidCommand command, void* data );
65 void AddLeaveCommand( TVoidCommand command, void* data );
67 void RemoveMouseMoveCommand( TMouseCommand command );
68 void RemoveMouseClickCommand( TMouseCommand command );
69 void RemoveMouseDoubleClickCommand( TMouseCommand command );
70 void RemoveMouseWheelCommand( TMouseWheelCommand command );
71 void RemoveKeyCommand( TKeyCommand command );
72 void RemoveExposeCommand( TVoidCommand command );
73 void RemoveConfigureCommand( TVoidCommand command );
74 void RemoveEnterCommand( TVoidCommand command );
75 void RemoveLeaveCommand( TVoidCommand command );
77 void DelegateTDxEvent( unsigned long event, void* calldata );
79 // Possible mouse motion events
80 virtual void OnMouseMove( );
81 virtual void OnMouseWheelForward( );
82 virtual void OnMouseWheelBackward( );
84 // Possible mouse click-related events
85 inline ButtonID GetButtonID( ) const
87 return( this->m_ActiveButton );
90 virtual void OnLeftButtonDown( );
91 virtual void OnLeftButtonUp( );
92 virtual void OnMiddleButtonDown( );
93 virtual void OnMiddleButtonUp( );
94 virtual void OnRightButtonDown( );
95 virtual void OnRightButtonUp( );
97 virtual void OnLeftClick( );
98 virtual void OnLeftDoubleClick( );
99 virtual void OnMiddleClick( );
100 virtual void OnMiddleDoubleClick( );
101 virtual void OnRightClick( );
102 virtual void OnRightDoubleClick( );
104 // Keyboard-related events
105 virtual void OnChar( );
106 virtual void OnKeyDown( );
107 virtual void OnKeyUp( );
108 virtual void OnKeyPress( );
109 virtual void OnKeyRelease( );
112 virtual void OnExpose( );
113 virtual void OnConfigure( );
114 virtual void OnEnter( );
115 virtual void OnLeave( );
117 virtual void Dolly( );
121 BaseInteractorStyle( );
122 virtual ~BaseInteractorStyle( );
124 virtual void _Dolly( double factor );
126 // Extension interface
127 virtual bool _PickPosition( int idx[ 2 ], double pos[ 3 ] ) = 0;
129 // Main event callback
130 static void _ProcessEvents(
138 // Purposely not implemented
139 BaseInteractorStyle( const Self& );
140 Self& operator=( const Self& );
143 double m_MotionFactor;
146 std::map< TMouseCommand, void* > m_MouseMoveCommands;
147 std::map< TMouseCommand, void* > m_MouseClickCommands;
148 std::map< TMouseCommand, void* > m_MouseDoubleClickCommands;
149 std::map< TMouseWheelCommand, void* > m_MouseWheelCommands;
150 std::map< TKeyCommand, void* > m_KeyCommands;
151 std::map< TVoidCommand, void* > m_ExposeCommands;
152 std::map< TVoidCommand, void* > m_ConfigureCommands;
153 std::map< TVoidCommand, void* > m_EnterCommands;
154 std::map< TVoidCommand, void* > m_LeaveCommands;
159 struct _TMouseButtonEvent
161 static long MaxDoubleClick;
163 long m_LastButtonHeld;
164 long m_LastButtonDown;
166 inline _TMouseButtonEvent( )
170 this->m_LastButtonUp = 0;
171 this->m_LastButtonHeld = 0;
172 this->m_LastButtonDown = -1;
174 inline void Release( )
176 long c = BaseInteractorStyle_DIFF_TIME;
177 this->m_LastButtonUp = c;
178 this->m_LastButtonHeld = c - this->m_LastButtonDown;
179 this->m_LastButtonDown = -1;
181 inline unsigned char Clicks( )
184 long c = BaseInteractorStyle_DIFF_TIME;
186 this->m_LastButtonHeld < MaxDoubleClick &&
187 ( c - this->m_LastButtonUp ) < MaxDoubleClick
195 if( this->m_LastButtonDown < 0 )
196 this->m_LastButtonDown = c;
200 _TMouseButtonEvent m_LeftButtonEvent;
201 _TMouseButtonEvent m_MiddleButtonEvent;
202 _TMouseButtonEvent m_RightButtonEvent;
203 ButtonID m_ActiveButton;
210 #endif // __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__