]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/Visualization/BaseInteractorStyle.cxx
8eb3feed603cf5221df395c461cf5fcc3690389b
[cpPlugins.git] / lib / cpExtensions / Visualization / BaseInteractorStyle.cxx
1 #include <cpExtensions/Visualization/BaseInteractorStyle.h>
2
3 /* =========================================================================
4  * Double click algorithm taken from:
5  * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
6  * =========================================================================
7 */
8
9 /*
10   Compile ITK and VTK with: cmake -DCMAKE_CXX_FLAGS="-std=c++11" /dir/to/source
11 */
12
13 #include <chrono>
14 #include <vtkCallbackCommand.h>
15
16 // -------------------------------------------------------------------------
17 const long cpExtensions::Visualization::BaseInteractorStyle::
18 MAX_DOUBLE_CLICK = 200;
19
20 // -------------------------------------------------------------------------
21 cpExtensions::Visualization::BaseInteractorStyle::
22 Self* cpExtensions::Visualization::BaseInteractorStyle::
23 New( )
24 {
25   return( new Self );
26 }
27
28 // -------------------------------------------------------------------------
29 void cpExtensions::Visualization::BaseInteractorStyle::
30 DelegateTDxEvent( unsigned long event, void* calldata )
31 {
32   // TODO
33 }
34
35 // -------------------------------------------------------------------------
36 cpExtensions::Visualization::BaseInteractorStyle::
37 BaseInteractorStyle( )
38   : Superclass( )
39 {
40   this->LastButton = Self::ButtonID_None;
41   this->LastButtonUp = 0;
42   this->LastButtonHeld = 0;
43   this->LastButtonDown = -1;
44   this->EventCallbackCommand->SetCallback( Self::_ProcessEvents );
45 }
46
47 // -------------------------------------------------------------------------
48 cpExtensions::Visualization::BaseInteractorStyle::
49 ~BaseInteractorStyle( )
50 {
51 }
52
53 // -------------------------------------------------------------------------
54 void cpExtensions::Visualization::BaseInteractorStyle::
55 _ProcessEvents(
56   vtkObject* object,
57   unsigned long event,
58   void* clientdata,
59   void* calldata
60   )
61 {
62   // Get active style
63   Self* s = reinterpret_cast< Self* >( clientdata );
64   if( s == NULL )
65     return;
66
67   // Process events
68   switch( event )
69   {
70   case vtkCommand::MouseMoveEvent:
71   {
72     if( s->HandleObservers && s->HasObserver( vtkCommand::MouseMoveEvent ) )
73       s->InvokeEvent( vtkCommand::MouseMoveEvent, NULL );
74     else
75       s->OnMouseMove( );
76   }
77   break;
78   case vtkCommand::LeftButtonPressEvent:
79   {
80     long tick_count =
81       std::chrono::duration_cast< std::chrono::milliseconds >(
82         std::chrono::system_clock::now( ).time_since_epoch( )
83         ).count( );
84     if(
85       s->LastButtonHeld < Self::MAX_DOUBLE_CLICK &&
86       ( tick_count - s->LastButtonUp ) < Self::MAX_DOUBLE_CLICK
87       )
88     {
89       std::cout << "double!!!" << std::endl;
90     }
91     else
92     {
93       std::cout << "single!!!" << std::endl;
94
95     } // fi
96     if( s->LastButtonDown < 0 )
97       s->LastButtonDown = tick_count;
98
99     /*
100       if( s->LastButton != Self::ButtonID_Left )
101       {
102       s->LastButton = Self::ButtonID_Left;
103       s->LastButtonClicks = 1;
104       s->LastButtonTime = std::chrono::system_clock::now( );
105       }
106       else if( s->LastButton == Self::ButtonID_Left )
107       s->LastButtonClicks++;
108     */
109   }
110   break;
111   case vtkCommand::LeftButtonReleaseEvent:
112   {
113     long tick_count =
114       std::chrono::duration_cast< std::chrono::milliseconds >(
115         std::chrono::system_clock::now( ).time_since_epoch( )
116         ).count( );
117     s->LastButtonUp = tick_count;
118     s->LastButtonHeld = tick_count - s->LastButtonDown;
119     s->LastButtonDown = -1;
120
121     /*
122       if( s->LastButton == Self::ButtonID_Left )
123       {
124       long d = std::chrono::duration_cast< std::chrono::milliseconds >(
125       std::chrono::system_clock::now( ) - s->LastButtonTime
126       ).count( );
127       if( d < 500 )
128       {
129       } // fi
130
131       } // fi
132     */
133   }
134   break;
135   case vtkCommand::MiddleButtonPressEvent:
136   {
137   }
138   break;
139   case vtkCommand::MiddleButtonReleaseEvent:
140   {
141   }
142   break;
143   case vtkCommand::RightButtonPressEvent:
144   {
145   }
146   break;
147   case vtkCommand::RightButtonReleaseEvent:
148   {
149   }
150   break;
151   case vtkCommand::MouseWheelForwardEvent:
152   {
153     if( s->HandleObservers && s->HasObserver( vtkCommand::MouseWheelForwardEvent ) )
154       s->InvokeEvent( vtkCommand::MouseWheelForwardEvent, NULL );
155     else
156       s->OnMouseWheelForward( );
157   }
158   break;
159   case vtkCommand::MouseWheelBackwardEvent:
160   {
161     if( s->HandleObservers && s->HasObserver( vtkCommand::MouseWheelBackwardEvent ) )
162       s->InvokeEvent( vtkCommand::MouseWheelBackwardEvent, NULL );
163     else
164       s->OnMouseWheelBackward( );
165   }
166   break;
167   case vtkCommand::KeyPressEvent:
168   {
169     if( s->HandleObservers && s->HasObserver( vtkCommand::KeyPressEvent ) )
170       s->InvokeEvent( vtkCommand::KeyPressEvent, NULL );
171     else
172     {
173       s->OnKeyDown( );
174       s->OnKeyPress( );
175
176     } // fi
177   }
178   break;
179   case vtkCommand::KeyReleaseEvent:
180   {
181     if( s->HandleObservers && s->HasObserver( vtkCommand::KeyReleaseEvent ) )
182       s->InvokeEvent( vtkCommand::KeyReleaseEvent, NULL );
183     else
184     {
185       s->OnKeyUp( );
186       s->OnKeyRelease( );
187
188     } // fi
189   }
190   break;
191   case vtkCommand::CharEvent:
192   {
193     if( s->HandleObservers && s->HasObserver( vtkCommand::CharEvent ) )
194       s->InvokeEvent( vtkCommand::CharEvent, NULL );
195     else
196       s->OnChar( );
197   }
198   break;
199   case vtkCommand::ExposeEvent:
200   {
201     if( s->HandleObservers && s->HasObserver( vtkCommand::ExposeEvent ) )
202       s->InvokeEvent( vtkCommand::ExposeEvent, NULL );
203     else
204       s->OnExpose( );
205   }
206   break;
207   case vtkCommand::ConfigureEvent:
208   {
209     if( s->HandleObservers && s->HasObserver( vtkCommand::ConfigureEvent ) )
210       s->InvokeEvent( vtkCommand::ConfigureEvent, NULL );
211     else
212       s->OnConfigure( );
213   }
214   break;
215   case vtkCommand::EnterEvent:
216   {
217     if( s->HandleObservers && s->HasObserver( vtkCommand::EnterEvent ) )
218       s->InvokeEvent( vtkCommand::EnterEvent, NULL );
219     else
220       s->OnEnter( );
221   }
222   break;
223   case vtkCommand::LeaveEvent:
224   {
225     if( s->HandleObservers && s->HasObserver( vtkCommand::LeaveEvent ) )
226       s->InvokeEvent( vtkCommand::LeaveEvent, NULL );
227     else
228       s->OnLeave( );
229   }
230   break;
231   case vtkCommand::TimerEvent:
232   {
233     // Do nothing
234   }
235   break;
236   case vtkCommand::DeleteEvent:
237   {
238     s->SetInteractor( 0 );
239   }
240   break;
241   case vtkCommand::TDxMotionEvent:
242   case vtkCommand::TDxButtonPressEvent:
243   case vtkCommand::TDxButtonReleaseEvent:
244   {
245     s->DelegateTDxEvent( event, calldata );
246   }
247   break;
248   default:
249     break;
250   } // hctiws
251 }
252
253 // eof - $RCSfile$