Salome HOME
Issue #6 Extended processing of nested actions.
[modules/shaper.git] / src / XGUI / XGUI_Viewer.h
index a5b43311f473d097d9fa7d552fa1d14c0cae6e24..23d66656a92bf3badab36e66d613ce5dd5630665 100644 (file)
@@ -1,19 +1,35 @@
 #ifndef XGUI_Viewer_H
 #define XGUI_Viewer_H
 
+#include "XGUI.h"
 #include "XGUI_Constants.h"
 
 #include <QObject>
 #include <QMap>
+#include <QList>
 
 #include <V3d_Viewer.hxx>
 #include <AIS_InteractiveContext.hxx>
 #include <AIS_Trihedron.hxx>
+#include <NCollection_List.hxx>
+#include <TopoDS_Shape.hxx>
+
+#include <QPoint>
 
 class XGUI_MainWindow;
 class QMdiSubWindow;
-
-class XGUI_Viewer: public QObject
+class XGUI_ViewWindow;
+class QMouseEvent;
+class QKeyEvent;
+
+class AIS_ListOfInteractive;
+
+/**\class XGUI_Viewer
+ * \ingroup GUI
+ * \brief Represents a 3d viewer. The viewer manages 3d scene and a set of view windows
+ * when each of view window is a one point of view on this scene.
+ */
+class XGUI_EXPORT XGUI_Viewer: public QObject
 {
 Q_OBJECT
 public:
@@ -22,38 +38,75 @@ public:
   XGUI_Viewer(XGUI_MainWindow* theParent, bool DisplayTrihedron = true);
   ~XGUI_Viewer();
 
+  //! Creates a new view window
   QMdiSubWindow* createView(V3d_TypeOfView theType = V3d_ORTHOGRAPHIC);
 
+  //! Return pointer on a main window - parent of the Viewer
   XGUI_MainWindow* mainWindow() const
   {
     return myMainWindow;
   }
 
+  //! Returns OCCT object which manages 3d scene
   Handle(V3d_Viewer) v3dViewer() const
   {
     return myV3dViewer;
   }
 
+  //! Returns OCCT object which manages displaying and selection in 3d scene
   Handle(AIS_InteractiveContext) AISContext() const
   {
     return myAISContext;
   }
 
+  //! Returns an active view window or NULL
+  XGUI_ViewWindow* activeViewWindow() const;
+
+  /// Return objects selected in 3D viewer
+  /// \param theList - list to be filled with selected objects
+  void  getSelectedObjects(AIS_ListOfInteractive& theList);
+
+  /// Return shapes selected in 3D viewer
+  /// \param theList - list to be filled with selected shapes
+  void getSelectedShapes(NCollection_List<TopoDS_Shape>& theList);
+
+  /// Selects objects in 3D viewer. Other selected objects are left as selected
+  /// \param theList - list objects to be selected
+  void  setObjectsSelected(const AIS_ListOfInteractive& theList);
+
+  /// Select the object in 3D viewer.
+  /// \param theIO - list objects to be selected
+  void setSelected(const Handle(AIS_InteractiveObject)& theIO) { myAISContext->SetSelected(theIO); }
+
+  //! Trihedron 3d object shown in the viewer
   Handle(AIS_Trihedron) trihedron() const
   {
     return myTrihedron;
   }
 
+  //! On/Off visibility of the trihedron object
   void toggleTrihedron();
+
+  //! Returns true if trihedron is visible
   bool isTrihedronVisible() const;
-  void setTrihedronShown(const bool on);
+
+  //! Returns true if trihedron is visible
+  void setTrihedronShown(bool on);
+
+  //! Returns trihedron size
   double trihedronSize() const;
+
+  //! Sets trihedron size
   void setTrihedronSize(const double sz, bool isRelative);
+
   bool trihedronRelative() const
   {
     return myIsRelative;
   }
+  //! Update trihedron
   void updateTrihedron();
+
+  //! Compute trihedron size dependent on 3d scene size
   bool computeTrihedronSize(double& theNewSize, double& theSize);
 
   static void setHotButton(XGUI::InteractionStyle theInteractionStyle, XGUI::HotOperation theOper,
@@ -61,6 +114,12 @@ public:
   static void getHotButton(XGUI::InteractionStyle theInteractionStyle, XGUI::HotOperation theOper,
                            Qt::KeyboardModifiers& theState, Qt::MouseButtons& theButton);
 
+  //! Sets the view projection
+  /// \param theX the X projection value
+  /// \param theY the Y projection value
+  /// \param theZ the Z projection value
+  void setViewProjection(double theX, double theY, double theZ);
+
   typedef QMap<XGUI::HotOperation, Qt::KeyboardModifiers> StatesMap;
   typedef QMap<XGUI::HotOperation, Qt::MouseButtons> ButtonsMap;
 
@@ -70,14 +129,43 @@ public:
   static InteractionStyle2StatesMap myStateMap;
   static InteractionStyle2ButtonsMap myButtonMap;
 
+signals:
+  void lastViewClosed();
+  void tryCloseView(XGUI_ViewWindow* theWindow);
+  void deleteView(XGUI_ViewWindow* theWindow);
+  void viewCreated(XGUI_ViewWindow* theWindow);
+  void mousePress(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent);
+  void mouseRelease(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent);
+  void mouseDoubleClick(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent);
+  void mouseMove(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent);
+  void keyPress(XGUI_ViewWindow* theWindow, QKeyEvent* theEvent);
+  void keyRelease(XGUI_ViewWindow* theWindow, QKeyEvent* theEvent);
+  void activated(XGUI_ViewWindow* theWindow);
+  void selectionChanged();
+  void mouseReleased(QPoint thePoint);
+  void mouseMoved(QPoint thePoint);
+
+public slots:
+  void onWindowMinimized(QMdiSubWindow*);
+  void onWindowActivated(QMdiSubWindow*);
+
 private slots:
-  void onViewClosed();
-  void onViewMapped();
+  void onViewClosed(QMdiSubWindow*);
+  void onMouseMove(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent);
+  void onMouseReleased(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent);
+
+private:
+  void addView(QMdiSubWindow* theView);
+
+  /*! Removes the View from internal Views list.*/
+  void removeView(QMdiSubWindow* theView);
 
 private:
   XGUI_MainWindow* myMainWindow;
 
-  Handle(V3d_Viewer) myV3dViewer;Handle(AIS_Trihedron) myTrihedron;Handle(AIS_InteractiveContext) myAISContext;
+  Handle(V3d_Viewer) myV3dViewer;
+  Handle(AIS_Trihedron) myTrihedron;
+  Handle(AIS_InteractiveContext) myAISContext;
 
   XGUI::InteractionStyle myInteractionStyle;
 
@@ -87,6 +175,10 @@ private:
   bool myIsRelative;
 
   double myTrihedronSize;
+  
+  QList<QMdiSubWindow*> myViews;
+
+  QMdiSubWindow* myActiveView;
 };
 
 #endif