1 #ifndef __cpExtensions__Interaction__BaseStyle__h__
2 #define __cpExtensions__Interaction__BaseStyle__h__
4 #include <cpExtensions/Config.h>
5 #include <vtkInteractorStyle.h>
8 // -------------------------------------------------------------------------
9 #define cpExtensions_BaseStyle_Commands( C ) \
11 std::map< T##C##Command, void* > m_##C##Commands; \
13 inline void Add##C##Command( T##C##Command c, void* d ) \
17 this->m_##C##Commands[ c ] = d; \
21 inline void Remove##C##Command( T##C##Command c ) \
23 std::map< T##C##Command, void* >::iterator i = \
24 this->m_##C##Commands.find( c ); \
25 if( i != this->m_##C##Commands.end( ) ) \
27 this->m_##C##Commands.erase( i ); \
32 // -------------------------------------------------------------------------
33 namespace cpExtensions
39 class cpExtensions_EXPORT BaseStyle
40 : public vtkInteractorStyle
43 typedef BaseStyle Self;
44 vtkTypeMacro( BaseStyle, vtkInteractorStyle );
55 typedef void ( *TMouseCommand )(
56 void*, const ButtonID&, int*, double*, bool, bool, bool
58 typedef TMouseCommand TMouseClickCommand;
59 typedef TMouseCommand TMouseDoubleClickCommand;
61 // Associate callbacks for each event
62 cpExtensions_BaseStyle_Commands( MouseClick );
63 cpExtensions_BaseStyle_Commands( MouseDoubleClick );
66 static void SetSetDoubleClickDelay( long delay );
67 void DelegateTDxEvent( unsigned long event, void* calldata );
69 // Possible mouse motion events
70 virtual void OnMouseMove( ) cpExtensions_OVERRIDE;
71 virtual void OnMouseWheelForward( ) cpExtensions_OVERRIDE { }
72 virtual void OnMouseWheelBackward( ) cpExtensions_OVERRIDE { }
74 // Possible mouse click-related events
75 inline ButtonID GetButtonID( ) const { return( this->m_ActiveButton ); }
77 virtual void OnLeftButtonDown( ) cpExtensions_OVERRIDE;
78 virtual void OnLeftButtonUp( ) cpExtensions_OVERRIDE;
79 virtual void OnMiddleButtonDown( ) cpExtensions_OVERRIDE;
80 virtual void OnMiddleButtonUp( ) cpExtensions_OVERRIDE;
81 virtual void OnRightButtonDown( ) cpExtensions_OVERRIDE;
82 virtual void OnRightButtonUp( ) cpExtensions_OVERRIDE;
84 virtual void OnLeftClick( );
85 virtual void OnLeftDoubleClick( );
86 virtual void OnMiddleClick( );
87 virtual void OnMiddleDoubleClick( );
88 virtual void OnRightClick( );
89 virtual void OnRightDoubleClick( );
91 // Keyboard-related events
92 virtual void OnChar( ) cpExtensions_OVERRIDE { }
93 virtual void OnKeyDown( ) cpExtensions_OVERRIDE { }
94 virtual void OnKeyUp( ) cpExtensions_OVERRIDE { }
95 virtual void OnKeyPress( ) cpExtensions_OVERRIDE { }
96 virtual void OnKeyRelease( ) cpExtensions_OVERRIDE { }
99 virtual void OnExpose( ) cpExtensions_OVERRIDE { }
100 virtual void OnConfigure( ) cpExtensions_OVERRIDE { }
101 virtual void OnEnter( ) cpExtensions_OVERRIDE { }
102 virtual void OnLeave( ) cpExtensions_OVERRIDE { }
104 virtual void Dolly( ) cpExtensions_OVERRIDE;
105 virtual void Pan( ) cpExtensions_OVERRIDE;
109 virtual ~BaseStyle( );
111 virtual void _Dolly( double factor );
113 // Extension interface
114 virtual bool _PickPosition( int idx[ 2 ], double pos[ 3 ] ) = 0;
116 // Main event callback
117 static void _ProcessEvents(
125 // Purposely not implemented
126 BaseStyle( const Self& );
127 Self& operator=( const Self& );
130 double m_MotionFactor;
135 struct _TMouseButtonEvent
137 static long MaxDoubleClick;
139 long m_LastButtonHeld;
140 long m_LastButtonDown;
142 inline _TMouseButtonEvent( )
146 this->m_LastButtonUp = 0;
147 this->m_LastButtonHeld = 0;
148 this->m_LastButtonDown = -1;
150 inline void Release( )
153 long c = cpExtensions_CHRONO;
154 this->m_LastButtonUp = c;
155 this->m_LastButtonHeld = c - this->m_LastButtonDown;
156 this->m_LastButtonDown = -1;
159 inline unsigned char Clicks( )
163 long c = cpExtensions_CHRONO;
165 this->m_LastButtonHeld < MaxDoubleClick &&
166 ( c - this->m_LastButtonUp ) < MaxDoubleClick
174 if( this->m_LastButtonDown < 0 )
175 this->m_LastButtonDown = c;
181 _TMouseButtonEvent m_LeftButtonEvent;
182 _TMouseButtonEvent m_MiddleButtonEvent;
183 _TMouseButtonEvent m_RightButtonEvent;
184 ButtonID m_ActiveButton;
191 #endif // __cpExtensions__Interaction__BaseStyle__h__