]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/Visualization/BaseInteractorStyle.h
02dd1503e29fe8da240dd4423bfddee4fb9b15c8
[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 <vtkInteractorStyle.h>
8
9 /*
10  * Compile ITK and VTK with: cmake -DCMAKE_CXX_FLAGS="-std=c++11" /dir/to/source
11  */
12
13 /* =========================================================================
14  * Double click algorithm taken from:
15  * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
16  * =========================================================================
17  */
18
19 // -------------------------------------------------------------------------
20 #define BaseInteractorStyle_DIFF_TIME                           \
21   std::chrono::duration_cast< std::chrono::milliseconds >(      \
22     std::chrono::system_clock::now( ).time_since_epoch( )       \
23     ).count( )
24
25 namespace cpExtensions
26 {
27   namespace Visualization
28   {
29     /**
30      */
31     class cpExtensions_EXPORT BaseInteractorStyle
32       : public vtkInteractorStyle
33     {
34     public:
35       typedef BaseInteractorStyle Self;
36       vtkTypeMacro( BaseInteractorStyle, vtkInteractorStyle );
37
38       enum ButtonID
39       {
40         ButtonID_None = 0,
41         ButtonID_Left,
42         ButtonID_Middle,
43         ButtonID_Right
44       };
45
46     public:
47       static Self* New( );
48
49       void DelegateTDxEvent( unsigned long event, void* calldata );
50
51       // Possible mouse motion events
52       virtual void OnMouseMove( ) { }
53       virtual void OnMouseWheelForward( ) { }
54       virtual void OnMouseWheelBackward( ) { }
55
56       // Possible mouse click-related events
57       inline ButtonID GetButtonID( ) const
58       { return( this->ActiveButton ); }
59       virtual void OnLeftButtonDown( ) { }
60       virtual void OnLeftButtonUp( ) { }
61       virtual void OnLeftClick( ) { }
62       virtual void OnLeftDoubleClick( ) { }
63       virtual void OnMiddleButtonDown( ) { }
64       virtual void OnMiddleButtonUp( ) { }
65       virtual void OnMiddleClick( ) { }
66       virtual void OnMiddleDoubleClick( ) { }
67       virtual void OnRightButtonDown( ) { }
68       virtual void OnRightButtonUp( ) { }
69       virtual void OnRightClick( ) { }
70       virtual void OnRightDoubleClick( ) { }
71
72       // Keyboard-related events
73       virtual void OnChar( ) { }
74       virtual void OnKeyDown( ) { }
75       virtual void OnKeyUp( ) { }
76       virtual void OnKeyPress( ) { }
77       virtual void OnKeyRelease( ) { }
78
79       // Other events
80       virtual void OnExpose( ) { }
81       virtual void OnConfigure( ) { }
82       virtual void OnEnter( ) { }
83       virtual void OnLeave( ) { }
84
85       // Unused methods
86       inline void StartState( int newstate ) { }
87       inline void StopState( ) { }
88       inline void StartAnimate( ) { }
89       inline void StopAnimate( ) { }
90       inline void StartRotate( ) { }
91       inline void EndRotate( ) { }
92       inline void StartZoom( ) { }
93       inline void EndZoom( ) { }
94       inline void StartPan( ) { }
95       inline void EndPan( ) { }
96       inline void StartSpin( ) { }
97       inline void EndSpin( ) { }
98       inline void StartDolly( ) { }
99       inline void EndDolly( ) { }
100       inline void StartUniformScale( ) { }
101       inline void EndUniformScale( ) { }
102       inline void StartTimer( ) { }
103       inline void EndTimer( ) { }
104       inline void StartTwoPointer( ) { }
105       inline void EndTwoPointer( ) { }
106       inline void OnTimer( ) { }
107
108     protected:
109       BaseInteractorStyle( );
110       virtual ~BaseInteractorStyle( );
111
112       static void _ProcessEvents(
113         vtkObject* object,
114         unsigned long event,
115         void* clientdata,
116         void* calldata
117         );
118
119     private:
120       // Purposely not implemented
121       BaseInteractorStyle( const Self& );
122       Self& operator=( const Self& );
123
124     protected:
125
126       /**
127        * Button events
128        */
129       struct MouseButtonEvent
130       {
131         static const long MAX_DOUBLE_CLICK;
132         long LastButtonUp;
133         long LastButtonHeld;
134         long LastButtonDown;
135
136         inline MouseButtonEvent( )
137           { this->Reset( ); }
138         inline void Reset( )
139           {
140             this->LastButtonUp = 0;
141             this->LastButtonHeld = 0;
142             this->LastButtonDown = -1;
143           }
144         inline void Release( )
145           {
146             long c = BaseInteractorStyle_DIFF_TIME;
147             this->LastButtonUp = c;
148             this->LastButtonHeld = c - this->LastButtonDown;
149             this->LastButtonDown = -1;
150           }
151         inline unsigned char Clicks( )
152           {
153             unsigned char n = 0;
154             long c = BaseInteractorStyle_DIFF_TIME;
155             if(
156               this->LastButtonHeld < MAX_DOUBLE_CLICK &&
157               ( c - this->LastButtonUp ) < MAX_DOUBLE_CLICK
158               )
159             {
160               this->Reset( );
161               n = 2;
162             }
163             else
164               n = 1;
165             if( this->LastButtonDown < 0 )
166               this->LastButtonDown = c;
167             return( n );
168           }
169       };
170       MouseButtonEvent LeftButtonEvent;
171       MouseButtonEvent MiddleButtonEvent;
172       MouseButtonEvent RightButtonEvent;
173       ButtonID ActiveButton;
174     };
175
176   } // ecapseman
177
178 } // ecapseman
179
180 #endif // __CPEXTENSIONS__VISUALIZATION__BASEINTERACTORSTYLE__H__
181
182 // eof - $RCSfile$