]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/Interaction/BaseInteractorStyle.h
More widgets added
[cpPlugins.git] / lib / cpExtensions / Interaction / BaseInteractorStyle.h
1 #ifndef __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__
2 #define __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__
3
4 #include <cpExtensions/cpExtensions_Export.h>
5
6 #include <chrono>
7 #include <map>
8 #include <utility>
9
10 #include <vtkInteractorStyle.h>
11
12 /* =========================================================================
13  * Double click algorithm inspired from:
14  * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
15  * =========================================================================
16  */
17
18 // -------------------------------------------------------------------------
19 #define BaseInteractorStyle_DIFF_TIME                           \
20   std::chrono::duration_cast< std::chrono::milliseconds >(      \
21     std::chrono::system_clock::now( ).time_since_epoch( )       \
22     ).count( )
23
24 namespace cpExtensions
25 {
26   namespace Interaction
27   {
28     /**
29      */
30     class cpExtensions_EXPORT BaseInteractorStyle
31       : public vtkInteractorStyle
32     {
33     public:
34       typedef BaseInteractorStyle Self;
35       vtkTypeMacro( BaseInteractorStyle, vtkInteractorStyle );
36
37       enum ButtonID
38       {
39         ButtonID_None = 0,
40         ButtonID_Left,
41         ButtonID_Middle,
42         ButtonID_Right
43       };
44
45       // Callbacks types
46       typedef void ( *TMouseCommand )(
47         void*, const ButtonID&, int*, double*, bool, bool, bool
48         );
49       typedef void ( *TMouseWheelCommand )( void*, const int&, bool, bool, bool );
50       typedef void ( *TKeyCommand )( void*, const char& );
51       typedef void ( *TVoidCommand )( void* );
52
53     public:
54       static void SetSetDoubleClickDelay( long delay );
55
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 );
66
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 );
76
77       void DelegateTDxEvent( unsigned long event, void* calldata );
78
79       // Possible mouse motion events
80       virtual void OnMouseMove( );
81       virtual void OnMouseWheelForward( );
82       virtual void OnMouseWheelBackward( );
83
84       // Possible mouse click-related events
85       inline ButtonID GetButtonID( ) const
86       {
87         return( this->m_ActiveButton );
88       }
89
90       virtual void OnLeftButtonDown( );
91       virtual void OnLeftButtonUp( );
92       virtual void OnMiddleButtonDown( );
93       virtual void OnMiddleButtonUp( );
94       virtual void OnRightButtonDown( );
95       virtual void OnRightButtonUp( );
96
97       virtual void OnLeftClick( );
98       virtual void OnLeftDoubleClick( );
99       virtual void OnMiddleClick( );
100       virtual void OnMiddleDoubleClick( );
101       virtual void OnRightClick( );
102       virtual void OnRightDoubleClick( );
103
104       // Keyboard-related events
105       virtual void OnChar( );
106       virtual void OnKeyDown( );
107       virtual void OnKeyUp( );
108       virtual void OnKeyPress( );
109       virtual void OnKeyRelease( );
110
111       // Other events
112       virtual void OnExpose( );
113       virtual void OnConfigure( );
114       virtual void OnEnter( );
115       virtual void OnLeave( );
116
117       virtual void Dolly( );
118       virtual void Pan( );
119
120     protected:
121       BaseInteractorStyle( );
122       virtual ~BaseInteractorStyle( );
123
124       virtual void _Dolly( double factor );
125
126       // Extension interface
127       virtual bool _PickPosition( int idx[ 2 ], double pos[ 3 ] ) = 0;
128
129       // Main event callback
130       static void _ProcessEvents(
131         vtkObject* object,
132         unsigned long event,
133         void* clientdata,
134         void* calldata
135         );
136
137     private:
138       // Purposely not implemented
139       BaseInteractorStyle( const Self& );
140       Self& operator=( const Self& );
141
142     protected:
143       double m_MotionFactor;
144
145       // Callbacks
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;
155
156       /**
157        * Button events
158        */
159       struct _TMouseButtonEvent
160       {
161         static long MaxDoubleClick;
162         long m_LastButtonUp;
163         long m_LastButtonHeld;
164         long m_LastButtonDown;
165
166         inline _TMouseButtonEvent( )
167           { this->Reset( ); }
168         inline void Reset( )
169           {
170             this->m_LastButtonUp = 0;
171             this->m_LastButtonHeld = 0;
172             this->m_LastButtonDown = -1;
173           }
174         inline void Release( )
175           {
176             long c = BaseInteractorStyle_DIFF_TIME;
177             this->m_LastButtonUp = c;
178             this->m_LastButtonHeld = c - this->m_LastButtonDown;
179             this->m_LastButtonDown = -1;
180           }
181         inline unsigned char Clicks( )
182           {
183             unsigned char n = 0;
184             long c = BaseInteractorStyle_DIFF_TIME;
185             if(
186               this->m_LastButtonHeld < MaxDoubleClick &&
187               ( c - this->m_LastButtonUp ) < MaxDoubleClick
188               )
189             {
190               this->Reset( );
191               n = 2;
192             }
193             else
194               n = 1;
195             if( this->m_LastButtonDown < 0 )
196               this->m_LastButtonDown = c;
197             return( n );
198           }
199       };
200       _TMouseButtonEvent m_LeftButtonEvent;
201       _TMouseButtonEvent m_MiddleButtonEvent;
202       _TMouseButtonEvent m_RightButtonEvent;
203       ButtonID           m_ActiveButton;
204     };
205
206   } // ecapseman
207
208 } // ecapseman
209
210 #endif // __CPEXTENSIONS__INTERACTION__BASEINTERACTORSTYLE__H__
211
212 // eof - $RCSfile$