]> Creatis software - cpPlugins.git/blobdiff - lib/cpExtensions/Visualization/BaseInteractorStyle.h
Intermediary commit
[cpPlugins.git] / lib / cpExtensions / Visualization / BaseInteractorStyle.h
index f10a9bb493f1a48fae532d2d7a6470028cb2a72a..75c85d88f7eaf97442b0a35da00a5dc6b2387732 100644 (file)
@@ -3,8 +3,25 @@
 
 #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
@@ -20,10 +37,10 @@ namespace cpExtensions
 
       enum ButtonID
       {
-        ButtonID_None   = 0x00,
-        ButtonID_Left   = 0x01,
-        ButtonID_Middle = 0x02,
-        ButtonID_Right  = 0x03
+        ButtonID_None 0,
+        ButtonID_Left,
+        ButtonID_Middle,
+        ButtonID_Right
       };
 
     public:
@@ -32,21 +49,25 @@ namespace cpExtensions
       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( ) { }
 
@@ -63,33 +84,15 @@ namespace cpExtensions
       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,
@@ -103,11 +106,56 @@ namespace cpExtensions
       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