Salome HOME
refs #416: to store the open state of object browser items in the binary array
[modules/gui.git] / src / GLViewer / GLViewer_ViewPort2d.h
index ab76e56c7fbfbc0b98e84a328935a8eac2947cc7..d221a7a06c5b3d1234e8708c286e6e4a05789d82 100644 (file)
@@ -1,12 +1,33 @@
+// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// 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
+//
+
+//  Author : OPEN CASCADE
 // File:      GLViewer_ViewPort2d.h
 // Created:   November, 2004
-// Author:    OCC team
-// Copyright (C) CEA 2004
-
+//
 #ifndef GLVIEWER_VIEWPORT2D_H
 #define GLVIEWER_VIEWPORT2D_H
 
-#ifdef WNT
+#ifdef WIN32
 #include <windows.h>
 #endif
 
 #include "GLViewer_Widget.h"
 #include "GLViewer_Geom.h"
 
-#include <qgl.h>
-#include <qcolor.h>
-#include <qwidget.h>
-#include <qpaintdevice.h>
+#include <QtOpenGL>
+#include <QColor>
+#include <QPaintDevice>
 
-#ifdef WNT
+#ifdef WIN32
 #pragma warning( disable:4251 )
 #endif
 
@@ -33,139 +53,200 @@ class GLViewer_ViewFrame;
 
 class QtxToolTip;
 
+class QWidget;
+class QRubberBand;
+
+/*! 
+ * Class GLViewer_ViewPort
+ * 2D visualisation canvas of GLViewer
+ */
 class GLViewer_ViewPort2d: public GLViewer_ViewPort
 {
   Q_OBJECT
 
-      enum vpDragState{ noDrag, initDrag, inDrag };
+  //! Dragging states
+  enum vpDragState{ noDrag, initDrag, inDrag };
 
 public:
-    GLViewer_ViewPort2d( QWidget* parent, GLViewer_ViewFrame* theViewFrame = NULL );
-    ~GLViewer_ViewPort2d();
-
-    void                   turnGrid( GLboolean on );
-    GLViewer_Grid*         getGrid() const { return myGrid; }
-    void                   setGridColor( const QColor gridColor, const QColor axisColor );
-
-    GLViewer_ViewFrame*    getViewFrame() const { return myViewFrame; }
-    GLViewer_Widget*       getGLWidget() const { return myGLWidget; }
-    virtual QPaintDevice*  getPaintDevice() { return myGLWidget; }
-
-    void                   setBackgroundColor( const QColor& color);
-    QColor                 backgroundColor() const;
-
-    void                   setBorder( GLViewer_Rect* border ) { myBorder = border; }
-    GLViewer_Rect*         getBorder() const { return myBorder; }
-
-    void                   setMargin( GLfloat margin ) { myMargin = margin; }
-    GLfloat                getMargin() const { return myMargin; }
-
-    int                    getHeight() const { return myHeight; }
-    int                    getWidth() const { return myWidth; }
-
-    void                   getScale( GLfloat& xSc, GLfloat& ySc ) const { xSc = myXScale; ySc = myYScale; }
-    void                   getPan( GLfloat& xPan, GLfloat& yPan ) const { xPan = myXPan; yPan = myYPan; }
-
-    void                   initResize( int, int );
-
-    void                   startRotation( int, int );
-    void                   rotate( int, int );
-    void                   endRotation();
-
-    bool                   isDragProcess(){ return myIsDragProcess; }
-
-    void                   turnCompass( GLboolean on );
-    void                   drawCompass();
-
-    int                    getViewPortId(){ return myViewPortId; }
-
-    virtual BlockStatus    currentBlock();
-
-    void                   startSelectByRect( int, int );
-    void                   drawSelectByRect( int, int );
-    void                   finishSelectByRect();
-
-    bool                   startPulling( GLViewer_Pnt );
-    void                   drawPulling( GLViewer_Pnt );
-    void                   finishPulling();
-    bool                   isPulling() const { return myIsPulling; }
-
-    //selection by rect
-    QRect                  selectionRect();
-    
-    GLViewer_Rect          win2GLV( const QRect& ) const;
-    QRect                  GLV2win( const GLViewer_Rect& ) const;
+  GLViewer_ViewPort2d( QWidget* parent, GLViewer_ViewFrame* theViewFrame = NULL );
+  ~GLViewer_ViewPort2d();
+
+  //! On/off rectangular grid
+  void                   turnGrid( GLboolean on );
+  //! Returns rectangular grid
+  GLViewer_Grid*         getGrid() const { return myGrid; }
+  //! Returns grid color
+  void                   setGridColor( const QColor gridColor, const QColor axisColor );
+
+  //! Returns parent window
+  GLViewer_ViewFrame*    getViewFrame() const { return myViewFrame; }
+  //! Returns painted widget
+  GLViewer_Widget*       getGLWidget() const { return myGLWidget; }
+  virtual QPaintDevice*  getPaintDevice() { return myGLWidget; }
+
+  //! Sets background color
+  void                   setBackgroundColor( const QColor& color);
+  //! Returns background color
+  QColor                 backgroundColor() const;
+
+  //! Sets borders of scene
+  void                   setBorder( GLViewer_Rect* border ) { myBorder = border; }
+  //! Get current borders of scene
+  GLViewer_Rect*         getBorder() const { return myBorder; }
+  
+  //! Sets margin of borders
+  void                   setMargin( GLfloat margin ) { myMargin = margin; }
+  //! Returns margin of borders
+  GLfloat                getMargin() const { return myMargin; }
+
+  //! Returns width of view
+  int                    getWidth() const { return myWidth; }
+  //! Returns height of view
+  int                    getHeight() const { return myHeight; }
+
+  
+  //! Returns scale factors
+  void                   getScale( GLfloat& xSc, GLfloat& ySc ) const { xSc = myXScale; ySc = myYScale; }
+  //! returns offsets
+  void                   getPan( GLfloat& xPan, GLfloat& yPan ) const { xPan = myXPan; yPan = myYPan; }
+
+  //! Resize view
+  void                   initResize( int width, int height );
+  
+  //! Begins rotation
+  void                   startRotation( int, int );
+  //! Process rotation
+  void                   rotate( int, int );
+  //! Completes rotation
+  void                   endRotation();
+  
+  //! Checks of dragging process state
+  bool                   isDragProcess(){ return myIsDragProcess; }
+  
+  //! On/off compass
+  void                   turnCompass( GLboolean on );
+  //! Draws compass
+  void                   drawCompass();
+  
+  //! Returns unique ID of ViewPort
+  int                    getViewPortId(){ return myViewPortId; }
+  
+  //! Redefined method
+  virtual BlockStatus    currentBlock();
+  
+  //! Initializes before selecting by rect
+  void                   startSelectByRect( int x, int y );
+  //! Draw selecting rectandle
+  void                   drawSelectByRect( int x, int y );
+  //! Pass rect into selector and update
+  void                   finishSelectByRect();
+  
+  //! \warnign It is for ouv
+  bool                   startPulling( GLViewer_Pnt );
+  //! \warnign It is for ouv
+  void                   drawPulling( GLViewer_Pnt );
+  //! \warnign It is for ouv
+  void                   finishPulling();
+  //! \warnign It is for ouv
+  bool                   isPulling() const { return myIsPulling; }
+
+  //! Returns selection by rect
+  QRect                  selectionRect();
+  
+  //! Transforms window rect to global rect 
+  GLViewer_Rect          win2GLV( const QRect& ) const;
+  //! Transforms global rect to window rect
+  QRect                  GLV2win( const GLViewer_Rect& ) const;
 
 signals:
-    void                   vpUpdateValues();
-    void                   objectMoved();
+  //! Emits after any transformation
+  void                   vpUpdateValues();
+
+  void                   objectMoved();
 
 protected:
-    void                   onDragObject( QMouseEvent* );
+  void                   onDragObject( QMouseEvent* );
     
-    virtual void           mouseMoveEvent( QMouseEvent *);
-    virtual void           mousePressEvent( QMouseEvent *);
-    virtual void           mouseReleaseEvent( QMouseEvent *);
-
-    virtual void           paintEvent( QPaintEvent* );
-    virtual void           resizeEvent( QResizeEvent* );
-
-    virtual void           reset();
-    virtual void           pan( int, int );
-    virtual void           setCenter( int, int );    
-    virtual void           zoom( int, int, int, int );
-    virtual void           fitRect( const QRect& );
-    virtual void           fitSelect();
-    virtual void           fitAll( bool keepScale = false, bool withZ = true );
+  virtual void           mouseMoveEvent( QMouseEvent *);
+  virtual void           mousePressEvent( QMouseEvent *);
+  virtual void           mouseReleaseEvent( QMouseEvent *);
+  virtual void           mouseDoubleClickEvent( QMouseEvent *);
+  
+  virtual void           paintEvent( QPaintEvent* );
+  virtual void           resizeEvent( QResizeEvent* );
+
+  //! Returns view to begin state
+  virtual void           reset();
+  //! Sets offset to view
+  virtual void           pan( int dx, int dy );
+  //! Sets view center in global coords
+  virtual void           setCenter( int x, int y );
+  //! Process zoming transformation with mouse tracking from ( x0, y0 ) to ( x1, y1 )
+  virtual void           zoom( int x0, int y0, int x1, int y1 );
+  //! Transforms view by rectangle
+  virtual void           fitRect( const QRect& );
+  //! Transforms view by selection
+  virtual void           fitSelect();
+  //! Transform view by view borders ( if \param keepScale = true, zoom does not change )
+  virtual void           fitAll( bool keepScale = false, bool withZ = true );
 
 protected slots:
-    void                   onStartDragObject();
-    void                   onPasteObject();
-    void                   onCutObject();
-    void                   onCopyObject();
-
-    void                   onMaybeTip( QPoint, QString&, QFont&, QRect&, QRect& );
-
+  //! Initializes drag process
+  void                   onStartDragObject();
+  //! Pastes object from clipboard
+  void                   onPasteObject();
+  //! Cuts object to clipboard
+  void                   onCutObject();
+  //! Copies object to clipboard
+  void                   onCopyObject();
+
+  //! Sets tool tip with \param text to \param theTextReg and on \param theViewReg whan mouse is on \param thePoint
+  void                   onMaybeTip( QPoint thePoint, QString& text, QFont& font, QRect& theTextReg, QRect& theViewReg );
+  
 protected:
-    GLViewer_ViewFrame*    myViewFrame;
-    GLViewer_Widget*       myGLWidget;
-    GLViewer_Rect*         myBorder;
-    QColor                 myBackgroundColor;
-
-    GLfloat                myMargin;
-    int                    myHeight;
-    int                    myWidth;
-
-    GLfloat                myXScale;
-    GLfloat                myYScale;
-    GLfloat                myXOldScale;
-    GLfloat                myYOldScale;
-    GLfloat                myXPan;
-    GLfloat                myYPan;
-
-    GLViewer_Grid*         myGrid; 
-    GLViewer_Compass*      myCompass;
-
-    //dragging
-    int                    myIsDragProcess;
-    float*                 myCurDragPosX;
-    float*                 myCurDragPosY;
-
-    //selection by rect
-    QPoint*                mypFirstPoint;
-    QPoint*                mypLastPoint;
-
-    //pulling
-    bool                   myIsPulling;
-    GLViewer_Object*       myPullingObject;
+  GLViewer_ViewFrame*    myViewFrame;
+  GLViewer_Widget*       myGLWidget;
+  GLViewer_Rect*         myBorder;
+  QColor                 myBackgroundColor;
+  
+  GLfloat                myMargin;
+  int                    myHeight;
+  int                    myWidth;
+  
+  GLfloat                myXScale;
+  GLfloat                myYScale;
+  GLfloat                myXOldScale;
+  GLfloat                myYOldScale;
+  GLfloat                myXPan;
+  GLfloat                myYPan;
+
+  GLViewer_Grid*         myGrid; 
+  GLViewer_Compass*      myCompass;
+
+  //dragging
+  int                    myIsDragProcess;
+  float*                 myCurDragPosX;
+  float*                 myCurDragPosY;
+  
+  //selection by rect
+  QPoint*                mypFirstPoint;
+  QPoint*                mypLastPoint;
+
+  //pulling
+  bool                   myIsPulling;
+  GLViewer_Object*       myPullingObject;
     
-    int                    myViewPortId;
+  int                    myViewPortId;
+
+  //GLViewer_ObjectTip*    myObjectTip;
+  QtxToolTip*            myObjectTip;
+  //! flag to block mouse release event just after mouse double-click
+  bool                   myIsMouseReleaseBlock;
 
-    //GLViewer_ObjectTip*    myObjectTip;
-    QtxToolTip*            myObjectTip;
+  QRubberBand*           myRectBand; //!< selection rectangle rubber band
 };
 
-#ifdef WNT
+#ifdef WIN32
 #pragma warning ( default:4251 )
 #endif