Salome HOME
refs #1458: disable chained panning on operations
[modules/gui.git] / src / OCCViewer / OCCViewer_ViewWindow.h
1 // Copyright (C) 2007-2016  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 #ifndef OCCVIEWER_VIEWWINDOW_H
24 #define OCCVIEWER_VIEWWINDOW_H
25
26 #include "OCCViewer.h"
27 #include "Qtx.h"
28 #include "SUIT_ViewWindow.h"
29 #include <gp_Pnt.hxx>
30 #include <V3d_Plane.hxx>
31 #include <TopAbs_ShapeEnum.hxx>
32
33 class QtxRectRubberBand;
34 class SUIT_Desktop;
35 class OCCViewer_ViewPort3d;
36 class OCCViewer_ViewSketcher;
37 class OCCViewer_AxialScaleDlg;
38 class OCCViewer_SetRotationPointDlg;
39 class OCCViewer_Viewer;
40 class OCCViewer_CubeAxesDlg;
41 class QtxAction;
42 class gp_XYZ;
43
44 struct viewAspect
45 {
46 public:
47   double    scale;
48   double  centerX; // deprecated since OCCT 6.7.1
49   double  centerY; // deprecated since OCCT 6.7.1
50   double    projX;
51   double    projY;
52   double    projZ;
53   double    twist;
54   double      atX;
55   double      atY;
56   double      atZ;
57   double     eyeX;
58   double     eyeY;
59   double     eyeZ;
60   double   scaleX;
61   double   scaleY;
62   double   scaleZ;
63   QString    name;
64   bool     isVisible;
65   double   size;
66   // graduated trihedron
67   bool    gtIsVisible;
68   bool    gtDrawNameX;
69   bool    gtDrawNameY;
70   bool    gtDrawNameZ;
71   QString gtNameX;
72   QString gtNameY;
73   QString gtNameZ;
74   int     gtNameColorRX;
75   int     gtNameColorGX;
76   int     gtNameColorBX;
77   int     gtNameColorRY;
78   int     gtNameColorGY;
79   int     gtNameColorBY;
80   int     gtNameColorRZ;
81   int     gtNameColorGZ;
82   int     gtNameColorBZ;
83   bool    gtDrawValuesX;
84   bool    gtDrawValuesY;
85   bool    gtDrawValuesZ;
86   int     gtNbValuesX;
87   int     gtNbValuesY;
88   int     gtNbValuesZ;
89   int     gtOffsetX;
90   int     gtOffsetY;
91   int     gtOffsetZ;
92   int     gtColorRX;
93   int     gtColorGX;
94   int     gtColorBX;
95   int     gtColorRY;
96   int     gtColorGY;
97   int     gtColorBY;
98   int     gtColorRZ;
99   int     gtColorGZ;
100   int     gtColorBZ;
101   bool    gtDrawTickmarksX;
102   bool    gtDrawTickmarksY;
103   bool    gtDrawTickmarksZ;
104   int     gtTickmarkLengthX;
105   int     gtTickmarkLengthY;
106   int     gtTickmarkLengthZ;
107
108 public:
109   viewAspect()
110   : scale( 0.0 ),
111     centerX( 0.0 ), centerY( 0.0 ),
112     projX( 0.0 ), projY( 0.0 ), projZ( 0.0 ),
113     twist( 0.0 ),
114     atX( 0.0 ), atY( 0.0 ), atZ( 0.0 ),
115     eyeX( 0.0 ), eyeY( 0.0 ), eyeZ( 0.0 ),
116     scaleX( 0.0 ), scaleY( 0.0 ), scaleZ( 0.0 ),
117     name(),
118     isVisible( false ),
119     size( 0.0 ),
120     gtIsVisible( false ),
121     gtDrawNameX( false ), gtDrawNameY( false ), gtDrawNameZ( false ),
122     gtNameX(), gtNameY(), gtNameZ(), 
123     gtNameColorRX( 0 ), gtNameColorGX( 0 ), gtNameColorBX( 0 ),
124     gtNameColorRY( 0 ), gtNameColorGY( 0 ), gtNameColorBY( 0 ),
125     gtNameColorRZ( 0 ), gtNameColorGZ( 0 ), gtNameColorBZ( 0 ),
126     gtDrawValuesX( false ), gtDrawValuesY( false ), gtDrawValuesZ( false ),
127     gtNbValuesX( 0 ), gtNbValuesY( 0 ), gtNbValuesZ( 0 ),
128     gtOffsetX( 0 ), gtOffsetY( 0 ), gtOffsetZ( 0 ),
129     gtColorRX( 0 ), gtColorGX( 0 ), gtColorBX( 0 ),
130     gtColorRY( 0 ), gtColorGY( 0 ), gtColorBY( 0 ),
131     gtColorRZ( 0 ), gtColorGZ( 0 ), gtColorBZ( 0 ),
132     gtDrawTickmarksX( false ), gtDrawTickmarksY( false ), gtDrawTickmarksZ( false ),
133     gtTickmarkLengthX( 0 ), gtTickmarkLengthY( 0 ), gtTickmarkLengthZ( 0 ) {}
134 };
135
136 typedef QList<viewAspect> viewAspectList;
137
138 #ifdef WIN32
139 #pragma warning( disable:4251 )
140 #endif
141
142 class OCCVIEWER_EXPORT OCCViewer_ViewWindow : public SUIT_ViewWindow  
143 {
144   Q_OBJECT
145
146 public:
147   enum { DumpId, FitAllId, FitRectId, FitSelectionId, ZoomId, PanId, GlobalPanId,
148          ChangeRotationPointId, RotationId,
149          FrontId, BackId, TopId, BottomId, LeftId, RightId, ClockWiseId, AntiClockWiseId,
150          ResetId, CloneId, ClippingId, MemId, RestoreId,
151          TrihedronShowId, AxialScaleId, GraduatedAxesId, AmbientId,
152          SwitchInteractionStyleId, SwitchZoomingStyleId, 
153          SwitchPreselectionId, SwitchSelectionId,
154          MaximizedId, SynchronizeId, ReturnTo3dViewId,
155          OrthographicId, PerspectiveId, StereoId, RayTracingId, EnvTextureId, LightSourceId,
156          UserId };
157
158   enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE, 
159                       PANGLOBAL, WINDOWFIT, FITALLVIEW, FITSELECTION, RESETVIEW,
160                       FRONTVIEW, BACKVIEW, TOPVIEW, BOTTOMVIEW, LEFTVIEW, RIGHTVIEW,
161                       CLOCKWISEVIEW, ANTICLOCKWISEVIEW, PROJECTION };
162
163   enum RotationPointType{ BBCENTER, SELECTED };
164
165   enum SketchingType { NoSketching, Rect, Polygon };
166
167   enum Mode2dType { No2dMode, XYPlane, XZPlane, YZPlane };
168
169   enum ProjectionType { Orthographic, Perspective, Stereo };
170   
171   enum StereoType { QuadBuffer, Anaglyph, RowInterlaced, ColumnInterlaced, ChessBoard, SideBySide, OverUnder, SoftPageFlip, NumberOfModes };
172
173   enum AnaglyphFilter { RedCyan, YellowBlue, GreenMagenta };
174
175   enum FocusIODType { Absolute, Relative };
176
177   OCCViewer_ViewWindow(SUIT_Desktop* theDesktop, OCCViewer_Viewer* theModel);
178   virtual ~OCCViewer_ViewWindow();
179
180   virtual OCCViewer_ViewWindow* getView( const int ) const;
181
182   virtual OCCViewer_ViewPort3d* getViewPort();
183
184   virtual bool eventFilter(QObject* watched, QEvent* e);
185
186   virtual void performRestoring( const viewAspect&, bool = false );
187   
188   virtual void initLayout();
189
190   virtual bool enableDrawMode( bool );
191
192   virtual void updateEnabledDrawMode();
193
194   virtual void setCuttingPlane( bool on, const double x = 0 , const double y = 0 , const double z = 0,
195                                 const double dx = 0, const double dy = 0, const double dz = 1);
196
197   virtual void setCuttingPlane( bool on, const gp_Pln thePln );
198
199   virtual bool isCuttingPlane();
200
201   virtual QString   getVisualParameters();
202   virtual void      setVisualParameters( const QString& parameters );
203
204   virtual void                    initSketchers();
205   virtual OCCViewer_ViewSketcher* getSketcher( const int );
206
207   virtual void                    activateSketching( int );
208
209   virtual int                     interactionStyle() const;
210   virtual void                    setInteractionStyle( const int );
211  
212   virtual int                     zoomingStyle() const;
213   virtual void                    setZoomingStyle( const int );
214
215   virtual bool                    isPreselectionEnabled() const;
216   virtual void                    enablePreselection( bool );   
217   virtual bool                    isSelectionEnabled() const;
218   virtual void                    enableSelection( bool );
219  
220   virtual int                     projectionType() const;
221   virtual void                    setProjectionType( int );
222
223   virtual int                     stereoType() const;
224   virtual void                    setStereoType( const int );
225
226   virtual int                     anaglyphFilter() const;
227   virtual void                    setAnaglyphFilter( const int );
228
229   virtual void                    setStereographicFocus( const int, const double );
230   virtual int                     stereographicFocusType() const;
231   virtual double                  stereographicFocusValue() const;
232
233   virtual void                    setInterocularDistance( const int, const double );
234   virtual int                     interocularDistanceType() const;
235   virtual double                  interocularDistanceValue() const;
236
237   virtual bool                    isReverseStereo() const;
238   virtual void                    setReverseStereo( const bool );
239
240   virtual bool                    isVSync() const;
241   virtual void                    setVSync( const bool );
242
243   virtual bool                    isQuadBufferSupport() const;
244   virtual void                    setQuadBufferSupport( const bool );
245
246   virtual bool                    isAutomaticZoom() const;
247   virtual void                    setAutomaticZoom( const bool );
248
249   void setTransformEnabled( const OperationType, const bool );
250   bool transformEnabled( const OperationType ) const;
251
252   void            set2dMode( Mode2dType );
253   Mode2dType      get2dMode() const { return my2dMode; }
254
255   void            setMaximized( bool, bool = true );
256   bool            isMaximized() const;
257   void            setReturnedTo3dView( bool = true );
258   
259   void            setSketcherStyle( bool enable );
260   bool            isSketcherStyle() const;
261
262   virtual QColor  backgroundColor() const;                      // obsolete
263   virtual void    setBackgroundColor( const QColor& );          // obsolete
264
265   virtual void    showStaticTrihedron( bool );
266
267   virtual Qtx::BackgroundData  background() const;
268   virtual void                 setBackground( const Qtx::BackgroundData& );
269
270   virtual const   viewAspectList& getViewAspects();
271   virtual void                    appendViewAspect( const viewAspect& );
272   virtual void                    updateViewAspects( const viewAspectList& );
273   virtual void                    clearViewAspects();
274
275   virtual SUIT_CameraProperties   cameraProperties();
276
277   void resetState();
278
279 public slots:
280   virtual void onFrontView();
281   virtual void onViewFitAll();
282   virtual void onBackView();
283   virtual void onClipping(bool on);
284   virtual void onTopView();
285   virtual void onBottomView();
286   virtual void onLeftView();
287   virtual void onRightView();
288   virtual void onClockWiseView();
289   virtual void onAntiClockWiseView();
290   virtual void onProjectionType( QAction* theAction );
291   virtual void onStereoType( bool activate );
292   virtual void onProjectionType();
293   virtual void onResetView();
294   virtual void onFitAll();
295   virtual void onFitSelection();
296   virtual void activateZoom();
297   virtual void activateWindowFit();
298   virtual void activateRotation();
299   virtual void activatePanning();
300   virtual void activateGlobalPanning();
301   virtual void onSetRotationPoint( bool on );
302   virtual void onCloneView();
303   virtual void onAxialScale();
304   virtual void onGraduatedAxes();
305   virtual void onAmbientToogle();
306   virtual void onMemorizeView();
307   virtual void onRestoreView();
308   virtual void onTrihedronShow(bool);
309   virtual void setRestoreFlag();
310   virtual void onSwitchInteractionStyle( bool on );
311   virtual void onSwitchZoomingStyle( bool on );
312   virtual void onSwitchPreselection( bool on );
313   virtual void onSwitchSelection( bool on );
314   virtual void onRayTracing();
315   virtual void onEnvTexture();
316   virtual void onLightSource();
317   virtual void onPanning();
318
319   virtual void activateSetRotationGravity();
320   virtual void activateSetRotationSelected( double theX, double theY, double theZ );
321   virtual void activateStartPointSelection( TopAbs_ShapeEnum );
322   virtual void updateGravityCoords();
323    
324   virtual void showEvent( QShowEvent * );
325   virtual void hideEvent( QHideEvent * );
326
327   virtual void onMaximizedView();
328   virtual void returnTo3dView();
329
330 signals:
331   void vpTransformationStarted(OCCViewer_ViewWindow::OperationType type);
332   void vpTransformationFinished(OCCViewer_ViewWindow::OperationType type);
333   void viewCloned( SUIT_ViewWindow* );
334
335   void Show( QShowEvent * );
336   void Hide( QHideEvent * );
337   void maximized( OCCViewer_ViewWindow*, bool );
338   void returnedTo3d( );
339
340 protected slots:
341   void synchronize( SUIT_ViewWindow* );
342
343 public:
344   virtual QImage dumpView();
345   virtual bool   dumpViewToFormat( const QImage&, const QString& fileName, const QString& format );
346
347 protected:
348   virtual QString  filter() const;
349
350   bool isOpenGlStereoSupport() const;
351
352   /* Transformation selected but not started yet */
353   bool transformRequested() const;
354   bool setTransformRequested ( OperationType );
355
356   /* Transformation is selected and already started */
357   bool          transformInProcess() const;
358   void          setTransformInProcess( bool );
359
360   void vpMousePressEvent(QMouseEvent* theEvent);
361   void vpMouseReleaseEvent(QMouseEvent* theEvent);
362   void vpMouseMoveEvent(QMouseEvent* theEvent);
363
364   void drawRect();
365   void endDrawRect();
366
367   void createActions();
368   void createToolBar();
369
370   virtual OperationType getButtonState(QMouseEvent* theEvent, int theInteractionStyle);
371
372   viewAspect getViewParams() const;
373
374   bool computeGravityCenter( double& theX, double& theY, double& theZ );
375
376   bool computeGravityCenter1(gp_XYZ& gravityCenter);
377
378   void ProjAndPanToGravity(V3d_TypeOfOrientation CamOri);
379
380   virtual void                          onSketchingStarted();
381   virtual void                          onSketchingFinished();
382
383   virtual OCCViewer_ViewSketcher*       createSketcher( int );
384
385   void                                  saveCursor();
386
387   OCCViewer_ViewSketcher*               mypSketcher;
388   QList<OCCViewer_ViewSketcher*>        mySketchers;
389
390   int                                   myCurSketch;
391
392   OperationType         myOperation;
393   OCCViewer_Viewer*     myModel;
394   OCCViewer_ViewPort3d* myViewPort;
395
396   OCCViewer_CubeAxesDlg* myCubeAxesDlg;
397
398   RotationPointType     myCurrPointType;
399   RotationPointType     myPrevPointType;
400   gp_Pnt                mySelectedPoint;
401   bool                  myRotationPointSelection;
402
403   int                                   myRestoreFlag;
404
405   int                                   myStartX;
406   int                                   myStartY;
407   int                                   myCurrX;
408   int                                   myCurrY;
409
410   bool                  myEventStarted;       // set when transformation is in process 
411   bool                  myCursorIsHand;                 
412   bool                  myDrawRect;           // set when a rect is used for selection or magnify 
413   bool                  myEnableDrawMode;
414   bool                  myDrawRectEnabled;
415   bool                  myPaintersRedrawing;  // set to draw with external painters  
416   bool                  IsSketcherStyle;
417   bool                  myIsKeyFree;
418   bool                  myAutomaticZoom;
419   QCursor               myCursor;
420
421   double myCurScale;
422
423 private:
424   OCCViewer_AxialScaleDlg* myScalingDlg;
425
426   OCCViewer_SetRotationPointDlg* mySetRotationPointDlg;
427   QtxAction* mySetRotationPointAction;
428
429   QtxRectRubberBand* myRectBand; //!< selection rectangle rubber band
430
431   bool mySelectionEnabled;
432   bool myPreselectionEnabled;
433   int myInteractionStyle;
434
435   typedef QMap<OperationType, bool> MapOfTransformStatus;
436   MapOfTransformStatus myStatus;
437
438   Mode2dType my2dMode;
439
440   Handle(V3d_Plane) myReserveClipPlane;
441
442   viewAspectList myViewAspects;
443   bool myPanningByBtn;
444 };
445
446 #ifdef WIN32
447 #pragma warning( default:4251 )
448 #endif
449
450 #endif