]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/Visualization/BaseInteractorStyle.h
Intermediary commit
[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
60       virtual void OnLeftButtonDown( );
61       virtual void OnLeftButtonUp( );
62       virtual void OnMiddleButtonDown( );
63       virtual void OnMiddleButtonUp( );
64       virtual void OnRightButtonDown( );
65       virtual void OnRightButtonUp( );
66
67       virtual void OnLeftClick( ) { }
68       virtual void OnLeftDoubleClick( ) { }
69       virtual void OnMiddleClick( ) { }
70       virtual void OnMiddleDoubleClick( ) { }
71       virtual void OnRightClick( ) { }
72       virtual void OnRightDoubleClick( ) { }
73
74       // Keyboard-related events
75       virtual void OnChar( ) { }
76       virtual void OnKeyDown( ) { }
77       virtual void OnKeyUp( ) { }
78       virtual void OnKeyPress( ) { }
79       virtual void OnKeyRelease( ) { }
80
81       // Other events
82       virtual void OnExpose( ) { }
83       virtual void OnConfigure( ) { }
84       virtual void OnEnter( ) { }
85       virtual void OnLeave( ) { }
86
87       virtual void Dolly( );
88       virtual void Pan( );
89
90     protected:
91       BaseInteractorStyle( );
92       virtual ~BaseInteractorStyle( );
93
94       virtual void _Dolly( double factor );
95
96       static void _ProcessEvents(
97         vtkObject* object,
98         unsigned long event,
99         void* clientdata,
100         void* calldata
101         );
102
103     private:
104       // Purposely not implemented
105       BaseInteractorStyle( const Self& );
106       Self& operator=( const Self& );
107
108     protected:
109       double MotionFactor;
110
111       /**
112        * Button events
113        */
114       struct MouseButtonEvent
115       {
116         static const long MAX_DOUBLE_CLICK;
117         long LastButtonUp;
118         long LastButtonHeld;
119         long LastButtonDown;
120
121         inline MouseButtonEvent( )
122           { this->Reset( ); }
123         inline void Reset( )
124           {
125             this->LastButtonUp = 0;
126             this->LastButtonHeld = 0;
127             this->LastButtonDown = -1;
128           }
129         inline void Release( )
130           {
131             long c = BaseInteractorStyle_DIFF_TIME;
132             this->LastButtonUp = c;
133             this->LastButtonHeld = c - this->LastButtonDown;
134             this->LastButtonDown = -1;
135           }
136         inline unsigned char Clicks( )
137           {
138             unsigned char n = 0;
139             long c = BaseInteractorStyle_DIFF_TIME;
140             if(
141               this->LastButtonHeld < MAX_DOUBLE_CLICK &&
142               ( c - this->LastButtonUp ) < MAX_DOUBLE_CLICK
143               )
144             {
145               this->Reset( );
146               n = 2;
147             }
148             else
149               n = 1;
150             if( this->LastButtonDown < 0 )
151               this->LastButtonDown = c;
152             return( n );
153           }
154       };
155       MouseButtonEvent LeftButtonEvent;
156       MouseButtonEvent MiddleButtonEvent;
157       MouseButtonEvent RightButtonEvent;
158       ButtonID ActiveButton;
159     };
160
161   } // ecapseman
162
163 } // ecapseman
164
165 #endif // __CPEXTENSIONS__VISUALIZATION__BASEINTERACTORSTYLE__H__
166
167 // eof - $RCSfile$