#include <cpExtensions/cpExtensions_Export.h>
+#include <chrono>
#include <vtkInteractorStyle.h>
+/*
+ * Compile ITK and VTK with: cmake -DCMAKE_CXX_FLAGS="-std=c++11" /dir/to/source
+ */
+
+/* =========================================================================
+ * Double click algorithm taken from:
+ * http://www.autohotkey.com/board/topic/56493-easiest-way-to-detect-double-clicks/
+ * =========================================================================
+ */
+
+// -------------------------------------------------------------------------
+#define BaseInteractorStyle_DIFF_TIME \
+ std::chrono::duration_cast< std::chrono::milliseconds >( \
+ std::chrono::system_clock::now( ).time_since_epoch( ) \
+ ).count( )
+
namespace cpExtensions
{
namespace Visualization
enum ButtonID
{
- ButtonID_None = 0x00,
- ButtonID_Left = 0x01,
- ButtonID_Middle = 0x02,
- ButtonID_Right = 0x03
+ ButtonID_None = 0,
+ ButtonID_Left,
+ ButtonID_Middle,
+ ButtonID_Right
};
public:
void DelegateTDxEvent( unsigned long event, void* calldata );
// Possible mouse motion events
- virtual void OnMouseMove( ) { }
+ virtual void OnMouseMove( );
virtual void OnMouseWheelForward( ) { }
virtual void OnMouseWheelBackward( ) { }
// Possible mouse click-related events
- virtual void OnLeftButtonDown( ) { }
- virtual void OnLeftButtonUp( ) { }
+ inline ButtonID GetButtonID( ) const
+ { return( this->ActiveButton ); }
+
+ virtual void OnLeftButtonDown( );
+ virtual void OnLeftButtonUp( );
+ virtual void OnMiddleButtonDown( );
+ virtual void OnMiddleButtonUp( );
+ virtual void OnRightButtonDown( );
+ virtual void OnRightButtonUp( );
+
virtual void OnLeftClick( ) { }
virtual void OnLeftDoubleClick( ) { }
- virtual void OnMiddleButtonDown( ) { }
- virtual void OnMiddleButtonUp( ) { }
virtual void OnMiddleClick( ) { }
virtual void OnMiddleDoubleClick( ) { }
- virtual void OnRightButtonDown( ) { }
- virtual void OnRightButtonUp( ) { }
virtual void OnRightClick( ) { }
virtual void OnRightDoubleClick( ) { }
virtual void OnEnter( ) { }
virtual void OnLeave( ) { }
- // Unused methods
- inline void StartState( int newstate ) { }
- inline void StopState( ) { }
- inline void StartAnimate( ) { }
- inline void StopAnimate( ) { }
- inline void StartRotate( ) { }
- inline void EndRotate( ) { }
- inline void StartZoom( ) { }
- inline void EndZoom( ) { }
- inline void StartPan( ) { }
- inline void EndPan( ) { }
- inline void StartSpin( ) { }
- inline void EndSpin( ) { }
- inline void StartDolly( ) { }
- inline void EndDolly( ) { }
- inline void StartUniformScale( ) { }
- inline void EndUniformScale( ) { }
- inline void StartTimer( ) { }
- inline void EndTimer( ) { }
- inline void StartTwoPointer( ) { }
- inline void EndTwoPointer( ) { }
- inline void OnTimer( ) { }
+ virtual void Dolly( );
+ virtual void Pan( );
protected:
BaseInteractorStyle( );
virtual ~BaseInteractorStyle( );
+ virtual void _Dolly( double factor );
+
static void _ProcessEvents(
vtkObject* object,
unsigned long event,
Self& operator=( const Self& );
protected:
- static const long MAX_DOUBLE_CLICK;
- ButtonID LastButton;
- long LastButtonUp;
- long LastButtonHeld;
- long LastButtonDown;
+ double MotionFactor;
+
+ /**
+ * Button events
+ */
+ struct MouseButtonEvent
+ {
+ static const long MAX_DOUBLE_CLICK;
+ long LastButtonUp;
+ long LastButtonHeld;
+ long LastButtonDown;
+
+ inline MouseButtonEvent( )
+ { this->Reset( ); }
+ inline void Reset( )
+ {
+ this->LastButtonUp = 0;
+ this->LastButtonHeld = 0;
+ this->LastButtonDown = -1;
+ }
+ inline void Release( )
+ {
+ long c = BaseInteractorStyle_DIFF_TIME;
+ this->LastButtonUp = c;
+ this->LastButtonHeld = c - this->LastButtonDown;
+ this->LastButtonDown = -1;
+ }
+ inline unsigned char Clicks( )
+ {
+ unsigned char n = 0;
+ long c = BaseInteractorStyle_DIFF_TIME;
+ if(
+ this->LastButtonHeld < MAX_DOUBLE_CLICK &&
+ ( c - this->LastButtonUp ) < MAX_DOUBLE_CLICK
+ )
+ {
+ this->Reset( );
+ n = 2;
+ }
+ else
+ n = 1;
+ if( this->LastButtonDown < 0 )
+ this->LastButtonDown = c;
+ return( n );
+ }
+ };
+ MouseButtonEvent LeftButtonEvent;
+ MouseButtonEvent MiddleButtonEvent;
+ MouseButtonEvent RightButtonEvent;
+ ButtonID ActiveButton;
};
} // ecapseman