Salome HOME
Updated copyright comment
[modules/gui.git] / src / SVTK / SVTK_InteractorStyle.h
index 7ea671df44c085df75c2b38134c0e82c65a30659..45671c864c2f78a3924e2be6b4926d5bd2ee4c7d 100644 (file)
@@ -1,30 +1,28 @@
-//  SALOME VTKViewer : build VTK viewer into Salome desktop
+// Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
-//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+// 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
 #include <vtkInteractorStyle.h>
 #include <vtkSmartPointer.h>
 
-#include <qcursor.h>
-#include <qevent.h>
+#include <QCursor>
+#include <QtxRubberBand.h>
 
 #include <map>
 
 #include <vtkObject.h>
+
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#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_ControllerIncrement : public vtkObject{
+class SVTK_EXPORT SVTK_ControllerIncrement : public vtkObject{
  public:
-  vtkTypeMacro(SVTK_ControllerIncrement, vtkObject);
+  vtkTypeMacro(SVTK_ControllerIncrement, vtkObject)
   static SVTK_ControllerIncrement* New();
 
   //! Set start value of increment
@@ -76,16 +78,39 @@ class 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.
 /*!
   This class controls the behaviour of KeyDown event
   in SALOME way
 */
-class SVTK_ControllerOnKeyDown : public vtkObject{
+class SVTK_EXPORT SVTK_ControllerOnKeyDown : public vtkObject{
  public:
-  vtkTypeMacro(SVTK_ControllerOnKeyDown, vtkObject);
+  vtkTypeMacro(SVTK_ControllerOnKeyDown, vtkObject)
   static SVTK_ControllerOnKeyDown* New();
 
   //! Provides the action on event 
@@ -99,15 +124,17 @@ class SVTK_ControllerOnKeyDown : public vtkObject{
   SVTK_ControllerOnKeyDown(const SVTK_ControllerOnKeyDown&);//Not implemented
   void operator=(const SVTK_ControllerOnKeyDown&);          //Not implemented
 };
-//-------------------------------------------
 
-class vtkCell;
-class vtkPicker;
+class vtkPointPicker;
+class vtkTDxInteractorStyle;
 
 class SALOME_Actor;
 
 class SVTK_Selector;
 class SVTK_GenericRenderWindowInteractor;
+class SVTK_Actor;
+
+class QtxRectRubberBand;
 
 #define VTK_INTERACTOR_STYLE_CAMERA_NONE    0
 #define VTK_INTERACTOR_STYLE_CAMERA_ROTATE  1
@@ -117,6 +144,10 @@ class SVTK_GenericRenderWindowInteractor;
 #define VTK_INTERACTOR_STYLE_CAMERA_FIT        5
 #define VTK_INTERACTOR_STYLE_CAMERA_SELECT     6
 #define VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN 7
+#define VTK_INTERACTOR_STYLE_CAMERA_SELECT_ROTATION_POINT 8
+#define VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION 9
+
+enum PolygonState { Disable, Start, InProcess, Finished, Closed, NotValid };
 
 //! Introduce SALOME way of user interaction
 /*!
@@ -127,85 +158,69 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
 {
  public:
   static SVTK_InteractorStyle *New();
-  vtkTypeMacro(SVTK_InteractorStyle, vtkInteractorStyle);
+  vtkTypeMacro(SVTK_InteractorStyle, 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 custorm event (space mouse event)
-  virtual
-  void
-  SetInteractor( vtkRenderWindowInteractor* );
+  //! Redefined in order to add an observer (callback) for custom event (space mouse event)
+  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();
  
@@ -223,7 +238,18 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   
   SVTK_Selector* GetSelector();
 
- protected:
+  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();
 
@@ -256,13 +282,16 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   void
   IncrementalRotate( const int incrX, const int incrY );
 
+  void
+  InteractiveSelection();
+
   // Main process event method (reimplemented from #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
@@ -276,6 +305,10 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   void startFitArea();
   void startSpin();
 
+  void startPointSelection();
+  void startFocalPointSelection();
+  void startInteractiveSelection();
+
  protected:
   void loadCursors();
   void startOperation(int operation);
@@ -290,6 +323,11 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
 
   void DominantCombinedSwitch();
   
+  void drawRect();
+  void endDrawRect();
+  void drawPolygon();
+  void endDrawPolygon();
+
  protected:
   QCursor                   myDefCursor;
   QCursor                   myPanCursor;
@@ -322,7 +360,33 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
 
   PSelectionEvent mySelectionEvent;
 
-  vtkSmartPointer<vtkPicker> myPicker;
+  unsigned long                   myCurrRotationPointType;
+  unsigned long                   myPrevRotationPointType;
+
+  unsigned long                   myCurrFocalPointType;
+  unsigned long                   myPrevFocalPointType;
+
+  double                          myRotationPointX;
+  double                          myRotationPointY;
+  double                          myRotationPointZ;
+
+  vtkSmartPointer<SVTK_Actor>     myHighlightSelectionPointActor;
+  vtkSmartPointer<vtkPointPicker> myPointPicker;
+  
+  double                          myBBCenter[3];
+  double                          myInteractivePoint[3];
+  bool                            myBBFirstCheck;
+
+  QtxRectRubberBand*              myRectBand; //!< selection rectangle rubber band
+  QtxPolyRubberBand*              myPolygonBand; //!< polygonal selection
+  QVector<QPoint>                 myPolygonPoints;
+  PolygonState                    myPoligonState;
+
+  bool                            myIsAdvancedZoomingEnabled;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif