1 #include <cpExtensions/Visualization/BaseInteractorStyle.h>
3 /* =========================================================================
4 * Double click algorithm taken from:
5 * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
6 * =========================================================================
10 Compile ITK and VTK with: cmake -DCMAKE_CXX_FLAGS="-std=c++11" /dir/to/source
14 #include <vtkCallbackCommand.h>
16 // -------------------------------------------------------------------------
17 const long cpExtensions::Visualization::BaseInteractorStyle::
18 MAX_DOUBLE_CLICK = 200;
20 // -------------------------------------------------------------------------
21 cpExtensions::Visualization::BaseInteractorStyle::
22 Self* cpExtensions::Visualization::BaseInteractorStyle::
28 // -------------------------------------------------------------------------
29 void cpExtensions::Visualization::BaseInteractorStyle::
30 DelegateTDxEvent( unsigned long event, void* calldata )
35 // -------------------------------------------------------------------------
36 cpExtensions::Visualization::BaseInteractorStyle::
37 BaseInteractorStyle( )
40 this->LastButton = Self::ButtonID_None;
41 this->LastButtonUp = 0;
42 this->LastButtonHeld = 0;
43 this->LastButtonDown = -1;
44 this->EventCallbackCommand->SetCallback( Self::_ProcessEvents );
47 // -------------------------------------------------------------------------
48 cpExtensions::Visualization::BaseInteractorStyle::
49 ~BaseInteractorStyle( )
53 // -------------------------------------------------------------------------
54 void cpExtensions::Visualization::BaseInteractorStyle::
63 Self* s = reinterpret_cast< Self* >( clientdata );
70 case vtkCommand::MouseMoveEvent:
72 if( s->HandleObservers && s->HasObserver( vtkCommand::MouseMoveEvent ) )
73 s->InvokeEvent( vtkCommand::MouseMoveEvent, NULL );
78 case vtkCommand::LeftButtonPressEvent:
81 std::chrono::duration_cast< std::chrono::milliseconds >(
82 std::chrono::system_clock::now( ).time_since_epoch( )
85 s->LastButtonHeld < Self::MAX_DOUBLE_CLICK &&
86 ( tick_count - s->LastButtonUp ) < Self::MAX_DOUBLE_CLICK
89 std::cout << "double!!!" << std::endl;
93 std::cout << "single!!!" << std::endl;
96 if( s->LastButtonDown < 0 )
97 s->LastButtonDown = tick_count;
100 if( s->LastButton != Self::ButtonID_Left )
102 s->LastButton = Self::ButtonID_Left;
103 s->LastButtonClicks = 1;
104 s->LastButtonTime = std::chrono::system_clock::now( );
106 else if( s->LastButton == Self::ButtonID_Left )
107 s->LastButtonClicks++;
111 case vtkCommand::LeftButtonReleaseEvent:
114 std::chrono::duration_cast< std::chrono::milliseconds >(
115 std::chrono::system_clock::now( ).time_since_epoch( )
117 s->LastButtonUp = tick_count;
118 s->LastButtonHeld = tick_count - s->LastButtonDown;
119 s->LastButtonDown = -1;
122 if( s->LastButton == Self::ButtonID_Left )
124 long d = std::chrono::duration_cast< std::chrono::milliseconds >(
125 std::chrono::system_clock::now( ) - s->LastButtonTime
135 case vtkCommand::MiddleButtonPressEvent:
139 case vtkCommand::MiddleButtonReleaseEvent:
143 case vtkCommand::RightButtonPressEvent:
147 case vtkCommand::RightButtonReleaseEvent:
151 case vtkCommand::MouseWheelForwardEvent:
153 if( s->HandleObservers && s->HasObserver( vtkCommand::MouseWheelForwardEvent ) )
154 s->InvokeEvent( vtkCommand::MouseWheelForwardEvent, NULL );
156 s->OnMouseWheelForward( );
159 case vtkCommand::MouseWheelBackwardEvent:
161 if( s->HandleObservers && s->HasObserver( vtkCommand::MouseWheelBackwardEvent ) )
162 s->InvokeEvent( vtkCommand::MouseWheelBackwardEvent, NULL );
164 s->OnMouseWheelBackward( );
167 case vtkCommand::KeyPressEvent:
169 if( s->HandleObservers && s->HasObserver( vtkCommand::KeyPressEvent ) )
170 s->InvokeEvent( vtkCommand::KeyPressEvent, NULL );
179 case vtkCommand::KeyReleaseEvent:
181 if( s->HandleObservers && s->HasObserver( vtkCommand::KeyReleaseEvent ) )
182 s->InvokeEvent( vtkCommand::KeyReleaseEvent, NULL );
191 case vtkCommand::CharEvent:
193 if( s->HandleObservers && s->HasObserver( vtkCommand::CharEvent ) )
194 s->InvokeEvent( vtkCommand::CharEvent, NULL );
199 case vtkCommand::ExposeEvent:
201 if( s->HandleObservers && s->HasObserver( vtkCommand::ExposeEvent ) )
202 s->InvokeEvent( vtkCommand::ExposeEvent, NULL );
207 case vtkCommand::ConfigureEvent:
209 if( s->HandleObservers && s->HasObserver( vtkCommand::ConfigureEvent ) )
210 s->InvokeEvent( vtkCommand::ConfigureEvent, NULL );
215 case vtkCommand::EnterEvent:
217 if( s->HandleObservers && s->HasObserver( vtkCommand::EnterEvent ) )
218 s->InvokeEvent( vtkCommand::EnterEvent, NULL );
223 case vtkCommand::LeaveEvent:
225 if( s->HandleObservers && s->HasObserver( vtkCommand::LeaveEvent ) )
226 s->InvokeEvent( vtkCommand::LeaveEvent, NULL );
231 case vtkCommand::TimerEvent:
236 case vtkCommand::DeleteEvent:
238 s->SetInteractor( 0 );
241 case vtkCommand::TDxMotionEvent:
242 case vtkCommand::TDxButtonPressEvent:
243 case vtkCommand::TDxButtonReleaseEvent:
245 s->DelegateTDxEvent( event, calldata );