Salome HOME
INT PAL 0052660: Plot2D Viewer: Plot2d_Curve can't be selected
[modules/gui.git] / src / SVTK / SVTK_InteractorStyle.h
index 3ce8ba2f43e643da3b66a973f20f3e03b892265c..dd514356d46d202f22001766710013a3427769b1 100644 (file)
@@ -1,30 +1,28 @@
-//  SALOME VTKViewer : build VTK viewer into Salome desktop
+// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
 //
-//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-// 
-//  This library is free software; you can redistribute it and/or 
-//  modify it under the terms of the GNU Lesser General Public 
-//  License as published by the Free Software Foundation; either 
-//  version 2.1 of the License. 
-// 
-//  This library is distributed in the hope that it will be useful, 
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-//  Lesser General Public License for more details. 
-// 
-//  You should have received a copy of the GNU Lesser General Public 
-//  License along with this library; if not, write to the Free Software 
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
-// 
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
 //
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
 //
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
 //  File   : SVTK_InteractorStyle.h
 //  Author : Christophe ATTANASIO
-//  Module : SALOME
-//  $Header$
 
 #ifndef __SVTK_InteractorStyle_h
 #define __SVTK_InteractorStyle_h
@@ -38,8 +36,8 @@
 #include <vtkInteractorStyle.h>
 #include <vtkSmartPointer.h>
 
-#include <qcursor.h>
-#include <qevent.h>
+#include <QCursor>
+#include <QtxRubberBand.h>
 
 #include <map>
 
 #endif
 
 //
-//! Control the value of increment  in SALOME way.
+//! Control the value of increment  in arithmetic progression mode.
 /*!
   This class controls of value of increment,
-  for pan/rotate/zoom operations in SALOME way
+  for pan/rotate/zoom operations in arithmetic progression mode
 */
 class SVTK_EXPORT SVTK_ControllerIncrement : public vtkObject{
  public:
@@ -80,6 +78,30 @@ class SVTK_EXPORT SVTK_ControllerIncrement : public vtkObject{
   SVTK_ControllerIncrement(const SVTK_ControllerIncrement&);//Not implemented
   void operator=(const SVTK_ControllerIncrement&);          //Not implemented
 };
+
+//
+//! Control the value of increment  in geometric progression mode.
+/*!
+  This class controls of value of increment,
+  for pan/rotate/zoom operations in geometric progression mode.
+*/
+class SVTK_EXPORT SVTK_GeomControllerIncrement : public SVTK_ControllerIncrement{
+ public:
+  vtkTypeMacro(SVTK_GeomControllerIncrement, SVTK_ControllerIncrement);
+  static SVTK_GeomControllerIncrement* New();
+
+  //! Increace the increment value by add 1
+  virtual int Increase();
+
+  //! Decreace the increment value by subtract 1
+  virtual int Decrease();
+ protected:
+  SVTK_GeomControllerIncrement();
+  virtual ~SVTK_GeomControllerIncrement();
+ private:
+  SVTK_GeomControllerIncrement(const SVTK_GeomControllerIncrement&);//Not implemented
+  void operator=(const SVTK_GeomControllerIncrement&);              //Not implemented
+};
 //
 //! Control the behaviour of KeyDown event in SALOME way.
 /*!
@@ -103,8 +125,8 @@ class SVTK_EXPORT SVTK_ControllerOnKeyDown : public vtkObject{
   void operator=(const SVTK_ControllerOnKeyDown&);          //Not implemented
 };
 
-class vtkCell;
 class vtkPointPicker;
+class vtkTDxInteractorStyle;
 
 class SALOME_Actor;
 
@@ -112,6 +134,8 @@ class SVTK_Selector;
 class SVTK_GenericRenderWindowInteractor;
 class SVTK_Actor;
 
+class QRubberBand;
+
 #define VTK_INTERACTOR_STYLE_CAMERA_NONE    0
 #define VTK_INTERACTOR_STYLE_CAMERA_ROTATE  1
 #define VTK_INTERACTOR_STYLE_CAMERA_PAN     2
@@ -122,6 +146,8 @@ class SVTK_Actor;
 #define VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN 7
 #define VTK_INTERACTOR_STYLE_CAMERA_SELECT_ROTATION_POINT 8
 
+enum PolygonState { Disable, Start, InProcess, Finished, Closed, NotValid };
+
 //! Introduce SALOME way of user interaction
 /*!
   This class defines SALOME way of user interaction for VTK viewer, as well, 
@@ -135,81 +161,65 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
 
   typedef boost::shared_ptr<SVTK_SelectionEvent> PSelectionEvent;
 
-  
+  void SetTDxStyle(vtkTDxInteractorStyle*){} 
 
   //! Generate special #SVTK_SelectionEvent
-  virtual
-  SVTK_SelectionEvent*
-  GetSelectionEvent();
+  virtual SVTK_SelectionEvent* GetSelectionEvent();
 
   //! Generate special #SVTK_SelectionEvent with flipped Y coordinate
-  virtual
-  SVTK_SelectionEvent*
-  GetSelectionEventFlipY();
+  virtual SVTK_SelectionEvent* GetSelectionEventFlipY();
 
   //! Redefined in order to add an observer (callback) for custom event (space mouse event)
-  virtual
-  void
-  SetInteractor( vtkRenderWindowInteractor* );
+  virtual void SetInteractor( vtkRenderWindowInteractor* );
 
   //! To invoke #vtkRenderWindowInteractor::CreateTimer
-  virtual 
-  void
-  Render();
+  virtual void Render();
 
   //! To implement cached rendering
-  virtual
-  void
-  OnTimer();
+  virtual void OnTimer();
 
   //! To reset reset view
-  virtual
-  void
-  OnConfigure();
+  virtual void OnConfigure();
 
   //! To handle mouse move event
-  virtual 
-  void
-  OnMouseMove();
+  virtual void OnMouseMove();
 
   //! To handle left mouse button down event (reimplemented from #vtkInteractorStyle)
-  virtual
-  void
-  OnLeftButtonDown();
+  virtual void OnLeftButtonDown();
 
   //! To handle left mouse button up event (reimplemented from #vtkInteractorStyle)
-  virtual
-  void
-  OnLeftButtonUp();
+  virtual void OnLeftButtonUp();
 
   //! To handle middle mouse button down event (reimplemented from #vtkInteractorStyle)
-  virtual
-  void
-  OnMiddleButtonDown();
+  virtual void OnMiddleButtonDown();
 
   //! To handle middle mouse button up event (reimplemented from #vtkInteractorStyle)
-  virtual
-  void
-  OnMiddleButtonUp();
+  virtual void OnMiddleButtonUp();
 
   //! To handle right mouse button down event (reimplemented from #vtkInteractorStyle)
-  virtual
-  void
-  OnRightButtonDown();
+  virtual void OnRightButtonDown();
 
   //! To handle right mouse button up event (reimplemented from #vtkInteractorStyle)
-  virtual
-  void
-  OnRightButtonUp();
+  virtual void OnRightButtonUp();
+
+  //! To handle mouse wheel forward event (reimplemented from #vtkInteractorStyle)
+  virtual void OnMouseWheelForward();
+
+  //! To handle mouse wheel backward event (reimplemented from #vtkInteractorStyle)
+  virtual void OnMouseWheelBackward();
+
+  //! To handle mouse button double click event
+  virtual void OnMouseButtonDoubleClick();
 
   //! To handle keyboard event (reimplemented from #vtkInteractorStyle)
-  virtual
-  void
-  OnChar();
+  virtual void OnChar();
 
   //! To set current increment controller 
   void SetControllerIncrement(SVTK_ControllerIncrement*);
 
+  //! To modify current increment controller 
+  void SetIncrementSpeed(const int, const int = 0);
+
   //! To get current increment controller 
   SVTK_ControllerIncrement* ControllerIncrement();
  
@@ -227,6 +237,17 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   
   SVTK_Selector* GetSelector();
 
+  int          CurrentState() const { return State; }
+  PolygonState GetPolygonState() const { return myPoligonState; }
+  void         SetPolygonState( const PolygonState& thePolygonState )
+                              { myPoligonState = thePolygonState; }
+
+  void SetAdvancedZoomingEnabled( const bool theState ) { myIsAdvancedZoomingEnabled = theState; }
+  bool IsAdvancedZoomingEnabled() const { return myIsAdvancedZoomingEnabled; }
+
+  //! releaze myLastHighlitedActor and myLastPreHighlitedActor
+  void FreeActors();
+
   protected:
   SVTK_InteractorStyle();
   ~SVTK_InteractorStyle();
@@ -264,9 +285,9 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   static 
   void
   ProcessEvents(vtkObject* object, 
-               unsigned long event,
-               void* clientData, 
-               void* callData );
+                unsigned long event,
+                void* clientData, 
+                void* callData );
 
   float MotionFactor;
   float RadianToDegree;                 // constant: for conv from deg to rad
@@ -281,6 +302,7 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   void startSpin();
 
   void startPointSelection();
+  void startFocalPointSelection();
 
  protected:
   void loadCursors();
@@ -296,6 +318,11 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
 
   void DominantCombinedSwitch();
   
+  void drawRect();
+  void endDrawRect();
+  void drawPolygon();
+  void endDrawPolygon();
+
  protected:
   QCursor                   myDefCursor;
   QCursor                   myPanCursor;
@@ -331,15 +358,25 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   unsigned long                   myCurrRotationPointType;
   unsigned long                   myPrevRotationPointType;
 
+  unsigned long                   myCurrFocalPointType;
+  unsigned long                   myPrevFocalPointType;
+
   double                          myRotationPointX;
   double                          myRotationPointY;
   double                          myRotationPointZ;
 
-  vtkSmartPointer<SVTK_Actor>     myHighlightRotationPointActor;
+  vtkSmartPointer<SVTK_Actor>     myHighlightSelectionPointActor;
   vtkSmartPointer<vtkPointPicker> myPointPicker;
   
-  vtkFloatingPointType            myBBCenter[3];
+  double                          myBBCenter[3];
   bool                            myBBFirstCheck;
+
+  QRubberBand*                    myRectBand; //!< selection rectangle rubber band
+  QtxPolyRubberBand*              myPolygonBand; //!< polygonal selection
+  QVector<QPoint>                 myPolygonPoints;
+  PolygonState                    myPoligonState;
+
+  bool                            myIsAdvancedZoomingEnabled;
 };
 
 #ifdef WIN32