Salome HOME
Copyrights update 2015.
[modules/gui.git] / src / VTKViewer / VTKViewer_InteractorStyle.h
1 // Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  SALOME VTKViewer : build VTK viewer into Salome desktop
24 //  File   : VTKViewer_InteractorStyle.h
25 //  Author : Christophe ATTANASIO
26 //  Module : SALOME
27 //
28 #ifndef __VTKViewer_InteractorStyle_h
29 #define __VTKViewer_InteractorStyle_h
30
31 #include <vtkInteractorStyle.h>
32
33 class vtkCell;
34 class vtkRenderWindowInteractor;
35 class vtkTDxInteractorStyle;
36
37 #include <QObject>
38 #include <QCursor>
39
40 class QRubberBand;
41
42 #include <map>
43
44 #include "VTKViewer.h"
45
46 #include "VTKViewer_Filter.h"
47
48 class VTKViewer_Actor;
49 class VTKViewer_Trihedron;
50 class VTKViewer_ViewWindow;
51 class VTKViewer_RenderWindowInteractor;
52
53 #define VTK_INTERACTOR_STYLE_CAMERA_NONE    0
54 #define VTK_INTERACTOR_STYLE_CAMERA_ROTATE  1
55 #define VTK_INTERACTOR_STYLE_CAMERA_PAN     2
56 #define VTK_INTERACTOR_STYLE_CAMERA_ZOOM    3
57 #define VTK_INTERACTOR_STYLE_CAMERA_SPIN    4
58 #define VTK_INTERACTOR_STYLE_CAMERA_FIT        5
59 #define VTK_INTERACTOR_STYLE_CAMERA_SELECT     6
60 #define VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN 7
61
62 #ifdef WIN32
63 #pragma warning ( disable:4251 )
64 #endif
65
66 /*! Description:\n
67  * This class must be supplied with a vtkRenderWindowInteractor wrapper or\n
68  * parent. This class should not normally be instantiated by application\n
69  * programmers.
70  */
71 class VTKVIEWER_EXPORT VTKViewer_InteractorStyle : public QObject, public vtkInteractorStyle
72 {
73  public:
74   static VTKViewer_InteractorStyle *New();
75   vtkTypeMacro(VTKViewer_InteractorStyle, vtkInteractorStyle);
76
77   virtual void SetInteractor(vtkRenderWindowInteractor *theInteractor);
78   void setViewWnd(VTKViewer_ViewWindow* theViewWnd);
79   void setGUIWindow(QWidget* theWindow);
80
81   void setTriedron(VTKViewer_Trihedron* theTrihedron);
82   void setPreselectionProp(const double& theRed = 0, const double& theGreen = 1,
83                            const double& theBlue = 1, const int& theWidth = 5);
84
85   // Generic event bindings must be overridden in subclasses
86   void OnMouseMove  (int ctrl, int shift, int x, int y);
87   void OnLeftButtonDown(int ctrl, int shift, int x, int y);
88   void OnLeftButtonUp  (int ctrl, int shift, int x, int y);
89   void OnMiddleButtonDown(int ctrl, int shift, int x, int y);
90   void OnMiddleButtonUp  (int ctrl, int shift, int x, int y);
91   void OnRightButtonDown(int ctrl, int shift, int x, int y);
92   void OnRightButtonUp  (int ctrl, int shift, int x, int y);
93
94   void OnSelectionModeChanged();
95
96   void  ViewFitAll();
97
98   void                     SetFilter( const Handle( VTKViewer_Filter)& );
99   Handle(VTKViewer_Filter) GetFilter( const int );  
100   bool                     IsFilterPresent( const int );
101   void                     RemoveFilter( const int );
102   bool                     IsValid( VTKViewer_Actor* theActor,
103                                     const int     theId,
104                                     const bool    theIsNode = false );
105
106   void                     IncrementalPan   ( const int incrX, const int incrY );
107   void                     IncrementalZoom  ( const int incr );
108   void                     IncrementalRotate( const int incrX, const int incrY );
109
110   int                      CurrentState() const { return State; }
111
112  protected:
113   VTKViewer_InteractorStyle();
114   ~VTKViewer_InteractorStyle();
115   VTKViewer_InteractorStyle(const VTKViewer_InteractorStyle&) {};
116   void operator=(const VTKViewer_InteractorStyle&) {};
117
118   void RotateXY(int dx, int dy);
119   void PanXY(int x, int y, int oldX, int oldY);
120   void DollyXY(int dx, int dy);
121   void SpinXY(int dx, int dy, int oldX, int oldY);
122   void fitRect(const int left, const int top, const int right, const int bottom);
123   void Place(const int theX, const int theY);
124   void TranslateView(int toX, int toY, int fromX, int fromY);
125   bool IsInRect(vtkActor* theActor, 
126                 const int left, const int top, 
127                 const int right, const int bottom);
128   bool IsInRect(vtkCell* theCell, 
129                 const int left, const int top, 
130                 const int right, const int bottom);
131   bool IsInRect(double* thePoint, 
132                 const int left, const int top, 
133                 const int right, const int bottom);
134
135   int State;
136   double MotionFactor;
137   double RadianToDegree;                 // constant: for conv from deg to rad
138   double myScale;
139
140   VTKViewer_Actor *myPreViewActor, *myPreSelectionActor, *mySelectedActor;
141
142   int myElemId;
143   int myEdgeId;
144   int myNodeId;
145
146  public:
147   bool eventFilter(QObject* object, QEvent* event);
148   void startZoom();
149   void startPan();
150   void startGlobalPan();
151   void startRotate();
152   void startFitArea();
153   void startSpin();
154   void SetTDxStyle(vtkTDxInteractorStyle *tdxStyle) {}
155   bool needsRedrawing();
156
157  protected:
158   void loadCursors();
159   void startOperation(int operation);
160   virtual void onStartOperation();
161   virtual void onFinishOperation();
162   virtual void onOperation(QPoint mousePos);
163   virtual void onCursorMove(QPoint mousePos);
164   virtual void setCursor(const int operation);
165
166   void drawRect();
167   void endDrawRect();
168
169  protected:
170   QCursor                   myDefCursor;
171   QCursor                   myPanCursor;
172   QCursor                   myZoomCursor;
173   QCursor                   myRotateCursor;
174   QCursor                   mySpinCursor;
175   QCursor                   myHandCursor;
176   QCursor                   myGlobalPanCursor;
177   QPoint                    myPoint;
178   QPoint                    myOtherPoint;
179   bool                      myCursorState;
180   bool                      myShiftState;
181   int                       ForcedState;
182   
183   VTKViewer_RenderWindowInteractor* m_Interactor;
184   VTKViewer_ViewWindow*     m_ViewWnd;
185   VTKViewer_Trihedron*      m_Trihedron;
186   QWidget*                  myGUIWindow;
187   
188   std::map<int, Handle(VTKViewer_Filter) > myFilters;
189
190   QRubberBand* myRectBand; //!< selection rectangle rubber band
191
192   /**  @name members from old version*/
193   //@{
194   double                    DeltaElevation;
195   double                    DeltaAzimuth;
196   int                       LastPos[2];
197   //@}
198 };
199
200 #ifdef WIN32
201 #pragma warning ( default:4251 )
202 #endif
203
204 #endif