]> Creatis software - cpPlugins.git/blobdiff - lib/cpExtensions/Visualization/BaseInteractorStyle.cxx
Widget integration (step 5/6): generic widget controller finished and tested on linux...
[cpPlugins.git] / lib / cpExtensions / Visualization / BaseInteractorStyle.cxx
index 8eb3feed603cf5221df395c461cf5fcc3690389b..ba89696a5679d698af2fc10570d242e7e228d890 100644 (file)
@@ -1,21 +1,10 @@
 #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::
@@ -30,6 +19,8 @@ void cpExtensions::Visualization::BaseInteractorStyle::
 DelegateTDxEvent( unsigned long event, void* calldata )
 {
   // TODO
+  std::cerr << "No TDx support at this time!" << std::endl;
+  std::exit( 1 );
 }
 
 // -------------------------------------------------------------------------
@@ -37,10 +28,11 @@ cpExtensions::Visualization::BaseInteractorStyle::
 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 );
 }
 
@@ -59,7 +51,7 @@ _ProcessEvents(
   void* calldata
   )
 {
-  // Get active style
+  // Get active style and interactor
   Self* s = reinterpret_cast< Self* >( clientdata );
   if( s == NULL )
     return;
@@ -69,163 +61,102 @@ _ProcessEvents(
   {
   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: