Salome HOME
Issue #6 Extended processing of nested actions.
[modules/shaper.git] / src / XGUI / XGUI_ViewWindow.h
1 #ifndef XGUI_ViewWindow_H
2 #define XGUI_ViewWindow_H
3
4 #include "XGUI.h"
5 #include "XGUI_Constants.h"
6 #include "XGUI_ViewBackground.h"
7
8 #include <QFrame>
9 #include <QIcon>
10 #include <QToolBar>
11 #include <QLabel>
12 #include <QMap>
13
14 #include <V3d_View.hxx>
15 #include <V3d_Viewer.hxx>
16
17 class XGUI_ViewPort;
18 class XGUI_Viewer;
19 class ViewerToolbar;
20 class ViewerLabel;
21 class XGUI_RectRubberBand;
22 class QMdiSubWindow;
23
24 /*!
25   \class XGUI_ViewWindow
26   \ingroup GUI
27   \brief Implements a one view window of 3d viewer object.
28   It contains a view port object (drawing area) and toolbars for view camera and window management.
29   Also it managements events in view port
30 */
31 class XGUI_EXPORT XGUI_ViewWindow: public QFrame
32 {
33 Q_OBJECT
34 public:
35   //! Types of viewer operations
36   enum OperationType
37   {
38     NOTHING,
39     PANVIEW,
40     ZOOMVIEW,
41     ROTATE,
42     PANGLOBAL,
43     WINDOWFIT,
44     FITALLVIEW,
45     RESETVIEW,
46     FRONTVIEW,
47     BACKVIEW,
48     TOPVIEW,
49     BOTTOMVIEW,
50     LEFTVIEW,
51     RIGHTVIEW,
52     CLOCKWISEVIEW,
53     ANTICLOCKWISEVIEW
54   };
55
56   XGUI_ViewWindow(XGUI_Viewer* theViewer, V3d_TypeOfView theType);
57
58   virtual ~XGUI_ViewWindow();
59
60   //! Returns view port object
61   XGUI_ViewPort* viewPort() const
62   {
63     return myViewPort;
64   }
65
66   //! Retrurns current interaction style
67   XGUI::InteractionStyle interactionStyle() const
68   {
69     return myInteractionStyle;
70   }
71
72   //! Disable or enable given operation type
73   void setTransformEnabled(const OperationType, const bool);
74
75   //! Returns true if the given operation type is enabled
76   bool transformEnabled(const OperationType) const;
77
78   //! Returns View background object
79   XGUI_ViewBackground background() const;
80
81   //! Sets View background object
82   void setBackground(const XGUI_ViewBackground& theBackground);
83
84   //! Returns true if the current view window can be closed
85   bool closable() const { return myClosable; }
86
87   //! Sets the current view window closable or not
88   void setClosable( const bool isClosable ) { myClosable = isClosable; }
89
90   //! Enable/Disable drawing of ribbon line
91   void enableDrawMode(bool toEnable) { myEnableDrawMode = toEnable; }
92
93   //! Returns true if ribbon line drawing enabled
94   bool isDrawModeEnabled() const { return myEnableDrawMode; }
95
96 signals:
97   //! Emited whien view transformation operation is started
98   void vpTransformationStarted(XGUI_ViewWindow::OperationType type);
99
100   //! Emited whien view transformation operation is finished
101   void vpTransformationFinished(XGUI_ViewWindow::OperationType type);
102
103   //void Show(QShowEvent *);
104   //void Hide(QHideEvent *);
105   //void maximized(XGUI_ViewWindow*, bool);
106   //void returnedTo3d();
107
108   //! Emited before the window closing
109   void tryClosing(XGUI_ViewWindow*);
110
111   //! Emited when window is closing
112   void closed( QMdiSubWindow* );
113
114   //! Emited on mouse press in view port
115   void mousePressed(XGUI_ViewWindow*, QMouseEvent*);
116
117   //! Emited on mouse release in view port
118   void mouseReleased(XGUI_ViewWindow*, QMouseEvent*);
119
120   //! Emited on mouse double click in view port
121   void mouseDoubleClicked(XGUI_ViewWindow*, QMouseEvent*);
122
123   //! Emited on mouse moving in view port
124   void mouseMoving(XGUI_ViewWindow*, QMouseEvent*);
125  
126   //! Emited on key press in view port
127   void keyPressed(XGUI_ViewWindow*, QKeyEvent*);
128  
129   //! Emited on key release in view port
130   void keyReleased(XGUI_ViewWindow*, QKeyEvent*);
131  
132   //! Emited on context menu request in view port
133   void contextMenuRequested(QContextMenuEvent *e);
134
135   //void viewModified(XGUI_ViewWindow*);
136   void viewCloned( QMdiSubWindow* theView );
137
138 public slots:
139   //! Start zooming operation
140   void activateZoom();
141
142   //! Start rotation operation
143   void activateRotation();
144
145   //! Start panning operation
146   void activatePanning();
147
148   //! Start window fit operation
149   void activateWindowFit();
150
151   //! Start global panning operation
152   void activateGlobalPanning();
153
154   //! Clone the view window preserving a view point of the current view
155   void cloneView();
156
157   //! Dump the view window into external file (*.bmp *.png *.jpg *.jpeg *.eps *.ps)
158   void dumpView();
159
160   //! Fit all command
161   void fitAll();
162
163   //! Set front view
164   void frontView();
165
166   //! Set back view
167   void backView();
168
169   //! Set top view
170   void topView();
171
172   //! Set bottom view
173   void bottomView();
174
175   //! Set left view
176   void leftView();
177
178   //! Set right view
179   void rightView();
180
181   //! Reset point of view
182   void reset();
183
184   void windowActivated();
185
186   void windowDeactivated();
187
188 protected:
189   virtual void changeEvent(QEvent* theEvent);
190
191   virtual bool eventFilter(QObject *theObj, QEvent *theEvent);
192
193   virtual void showEvent(QShowEvent* theEvent);
194
195 private slots:
196   void onClose();
197   void onMinimize();
198   void onMaximize();
199
200   void updateToolBar();
201 //  void repaintToolBar();
202
203 private:
204   enum WindowState
205   {
206     MinimizedState,
207     MaximizedState,
208     WindowNormalState
209   };
210
211   bool processWindowControls(QObject *theObj, QEvent *theEvent);
212   bool processViewPort(QEvent *theEvent);
213
214   void vpMousePressEvent(QMouseEvent* theEvent);
215   void vpMouseReleaseEvent(QMouseEvent* theEvent);
216   void vpMouseMoveEvent(QMouseEvent* theEvent);
217
218   OperationType getButtonState(QMouseEvent* theEvent, XGUI::InteractionStyle theInteractionStyle);
219
220   void resetState();
221   void drawRect();
222   void endDrawRect();
223
224   bool transformRequested() const;
225   bool setTransformRequested(OperationType);
226
227   // Transformation is selected and already started
228   bool transformInProcess() const
229   {
230     return myEventStarted;
231   }
232   void setTransformInProcess(bool bOn)
233   {
234     myEventStarted = bOn;
235   }
236
237 private:
238   XGUI_Viewer* myViewer;
239
240   QLabel* myPicture;
241   ViewerLabel* myGripWgt;
242   XGUI_ViewPort* myViewPort;
243   ViewerToolbar* myViewBar;
244   ViewerToolbar* myWindowBar;
245   QAction* myMinimizeBtn;
246   QAction* myMaximizeBtn;
247
248   QIcon MinimizeIco;
249   QIcon MaximizeIco;
250   QIcon CloseIco;
251   QIcon RestoreIco;
252
253   bool myMoving;
254   QPoint myMousePnt;
255
256   WindowState myLastState;
257
258   int myStartX;
259   int myStartY;
260   int myCurrX;
261   int myCurrY;
262
263   XGUI::InteractionStyle myInteractionStyle;
264   OperationType myOperation;
265   XGUI::Mode2dType my2dMode;
266
267   int myCurSketch;
268   bool myDrawRect;          // set when a rect is used for selection or magnify 
269   bool myEnableDrawMode;
270   bool myRotationPointSelection;
271   bool myCursorIsHand;
272   bool myIsKeyFree;
273   bool myEventStarted;       // set when transformation is in process 
274   bool myClosable;
275   bool myIsActive;
276
277   QCursor myCursor;
278
279   XGUI::RotationPointType myCurrPointType;
280   XGUI::RotationPointType myPrevPointType;
281
282   gp_Pnt mySelectedPoint;
283
284   XGUI_RectRubberBand* myRectBand; //!< selection rectangle rubber band
285
286   typedef QMap<OperationType, bool> MapOfTransformStatus;
287   MapOfTransformStatus myStatus;
288
289   double myCurScale;
290 };
291
292 //******************************************************
293 /*!
294   \class ViewerToolbar
295   \ingroup GUI
296   \brief Provides a toolbar widget with treansparent background over OCCT View window
297 */
298 class ViewerToolbar: public QToolBar
299 {
300 Q_OBJECT
301 public:
302   ViewerToolbar(QWidget* theParent, XGUI_ViewPort* thePort);
303
304 protected slots:
305   void onViewPortResized() { myResize = true; }
306
307 protected:
308   virtual void paintEvent(QPaintEvent* theEvent);
309
310
311
312 private:
313   XGUI_ViewPort* myVPort;
314   bool myResize;
315 };
316
317 //******************************************************
318 /*!
319   \class ViewerToolbar
320   \ingroup GUI
321   \brief Provides a Label widget with treansparent background over OCCT View window
322 */
323 class ViewerLabel: public QLabel
324 {
325 Q_OBJECT
326 public:
327   ViewerLabel(QWidget* theParent, XGUI_ViewPort* thePort);
328
329 protected slots:
330   void onViewPortResized() { myResize = true; }
331
332 protected:
333   virtual void paintEvent(QPaintEvent* theEvent);
334
335 private:
336   XGUI_ViewPort* myVPort;
337   bool myResize;
338 };
339
340 #endif