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