#include <cpExtensions/Visualization/BaseInteractorStyle.h>
-/* =========================================================================
- * Double click algorithm taken from:
- * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
- * =========================================================================
-*/
-
-/*
- Compile ITK and VTK with: cmake -DCMAKE_CXX_FLAGS="-std=c++11" /dir/to/source
-*/
-
-#include <chrono>
#include <vtkCallbackCommand.h>
// -------------------------------------------------------------------------
-const long cpExtensions::Visualization::BaseInteractorStyle::
-MAX_DOUBLE_CLICK = 200;
+const long cpExtensions::Visualization::BaseInteractorStyle::MouseButtonEvent::
+MAX_DOUBLE_CLICK = 200; // ms
// -------------------------------------------------------------------------
cpExtensions::Visualization::BaseInteractorStyle::
DelegateTDxEvent( unsigned long event, void* calldata )
{
// TODO
+ std::cerr << "No TDx support at this time!" << std::endl;
+ std::exit( 1 );
}
// -------------------------------------------------------------------------
BaseInteractorStyle( )
: Superclass( )
{
- this->LastButton = Self::ButtonID_None;
- this->LastButtonUp = 0;
- this->LastButtonHeld = 0;
- this->LastButtonDown = -1;
+ this->LeftButtonEvent.Reset( );
+ this->MiddleButtonEvent.Reset( );
+ this->RightButtonEvent.Reset( );
+ this->ActiveButton = Self::ButtonID_None;
+
this->EventCallbackCommand->SetCallback( Self::_ProcessEvents );
}
void* calldata
)
{
- // Get active style
+ // Get active style and interactor
Self* s = reinterpret_cast< Self* >( clientdata );
if( s == NULL )
return;
{
case vtkCommand::MouseMoveEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::MouseMoveEvent ) )
- s->InvokeEvent( vtkCommand::MouseMoveEvent, NULL );
- else
- s->OnMouseMove( );
+ s->OnMouseMove( );
}
break;
case vtkCommand::LeftButtonPressEvent:
{
- long tick_count =
- std::chrono::duration_cast< std::chrono::milliseconds >(
- std::chrono::system_clock::now( ).time_since_epoch( )
- ).count( );
- if(
- s->LastButtonHeld < Self::MAX_DOUBLE_CLICK &&
- ( tick_count - s->LastButtonUp ) < Self::MAX_DOUBLE_CLICK
- )
- {
- std::cout << "double!!!" << std::endl;
- }
- else
- {
- std::cout << "single!!!" << std::endl;
-
- } // fi
- if( s->LastButtonDown < 0 )
- s->LastButtonDown = tick_count;
-
- /*
- if( s->LastButton != Self::ButtonID_Left )
- {
- s->LastButton = Self::ButtonID_Left;
- s->LastButtonClicks = 1;
- s->LastButtonTime = std::chrono::system_clock::now( );
- }
- else if( s->LastButton == Self::ButtonID_Left )
- s->LastButtonClicks++;
- */
+ unsigned char nc = s->LeftButtonEvent.Clicks( );
+ if( nc == 2 )
+ s->OnLeftDoubleClick( );
+ else if( nc == 1 )
+ s->OnLeftClick( );
+ s->ActiveButton = Self::ButtonID_Left;
}
break;
case vtkCommand::LeftButtonReleaseEvent:
{
- long tick_count =
- std::chrono::duration_cast< std::chrono::milliseconds >(
- std::chrono::system_clock::now( ).time_since_epoch( )
- ).count( );
- s->LastButtonUp = tick_count;
- s->LastButtonHeld = tick_count - s->LastButtonDown;
- s->LastButtonDown = -1;
-
- /*
- if( s->LastButton == Self::ButtonID_Left )
- {
- long d = std::chrono::duration_cast< std::chrono::milliseconds >(
- std::chrono::system_clock::now( ) - s->LastButtonTime
- ).count( );
- if( d < 500 )
- {
- } // fi
-
- } // fi
- */
+ s->LeftButtonEvent.Release( );
+ s->ActiveButton = Self::ButtonID_None;
}
break;
case vtkCommand::MiddleButtonPressEvent:
{
+ unsigned char nc = s->MiddleButtonEvent.Clicks( );
+ if( nc == 2 )
+ s->OnMiddleDoubleClick( );
+ else if( nc == 1 )
+ s->OnMiddleClick( );
+ s->ActiveButton = Self::ButtonID_Middle;
}
break;
case vtkCommand::MiddleButtonReleaseEvent:
{
+ s->MiddleButtonEvent.Release( );
+ s->ActiveButton = Self::ButtonID_None;
}
break;
case vtkCommand::RightButtonPressEvent:
{
+ unsigned char nc = s->RightButtonEvent.Clicks( );
+ if( nc == 2 )
+ s->OnRightDoubleClick( );
+ else if( nc == 1 )
+ s->OnRightClick( );
+ s->ActiveButton = Self::ButtonID_Right;
}
break;
case vtkCommand::RightButtonReleaseEvent:
{
+ s->RightButtonEvent.Release( );
+ s->ActiveButton = Self::ButtonID_None;
}
break;
case vtkCommand::MouseWheelForwardEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::MouseWheelForwardEvent ) )
- s->InvokeEvent( vtkCommand::MouseWheelForwardEvent, NULL );
- else
- s->OnMouseWheelForward( );
+ s->OnMouseWheelForward( );
}
break;
case vtkCommand::MouseWheelBackwardEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::MouseWheelBackwardEvent ) )
- s->InvokeEvent( vtkCommand::MouseWheelBackwardEvent, NULL );
- else
- s->OnMouseWheelBackward( );
+ s->OnMouseWheelBackward( );
}
break;
case vtkCommand::KeyPressEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::KeyPressEvent ) )
- s->InvokeEvent( vtkCommand::KeyPressEvent, NULL );
- else
- {
- s->OnKeyDown( );
- s->OnKeyPress( );
-
- } // fi
+ s->OnKeyDown( );
+ s->OnKeyPress( );
}
break;
case vtkCommand::KeyReleaseEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::KeyReleaseEvent ) )
- s->InvokeEvent( vtkCommand::KeyReleaseEvent, NULL );
- else
- {
- s->OnKeyUp( );
- s->OnKeyRelease( );
-
- } // fi
+ s->OnKeyUp( );
+ s->OnKeyRelease( );
}
break;
case vtkCommand::CharEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::CharEvent ) )
- s->InvokeEvent( vtkCommand::CharEvent, NULL );
- else
- s->OnChar( );
+ s->OnChar( );
}
break;
case vtkCommand::ExposeEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::ExposeEvent ) )
- s->InvokeEvent( vtkCommand::ExposeEvent, NULL );
- else
- s->OnExpose( );
+ s->OnExpose( );
}
break;
case vtkCommand::ConfigureEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::ConfigureEvent ) )
- s->InvokeEvent( vtkCommand::ConfigureEvent, NULL );
- else
- s->OnConfigure( );
+ s->OnConfigure( );
}
break;
case vtkCommand::EnterEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::EnterEvent ) )
- s->InvokeEvent( vtkCommand::EnterEvent, NULL );
- else
- s->OnEnter( );
+ s->OnEnter( );
}
break;
case vtkCommand::LeaveEvent:
{
- if( s->HandleObservers && s->HasObserver( vtkCommand::LeaveEvent ) )
- s->InvokeEvent( vtkCommand::LeaveEvent, NULL );
- else
- s->OnLeave( );
+ s->OnLeave( );
}
break;
case vtkCommand::TimerEvent: