0030268: Inspectors - improvements in VInspector plugin
[occt.git] / tools / View / View_Widget.hxx
1 // Created on: 2017-06-16
2 // Created by: Natalia ERMOLAEVA
3 // Copyright (c) 2017 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement. 
15
16 #ifndef View_View_H
17 #define View_View_H
18
19 #include <AIS_InteractiveContext.hxx>
20 #include <V3d_View.hxx>
21 #include <inspector/View_ViewActionType.hxx>
22 #include <inspector/View_Viewer.hxx>
23
24 #include <Standard_WarningsDisable.hxx>
25 #include <QAction>
26 #include <QMap>
27 #include <QString>
28 #include <QToolButton>
29 #include <QWidget>
30 #include <Standard_WarningsRestore.hxx>
31
32 class View_Viewer;
33
34 class QRubberBand;
35
36 //! \class View_Widget
37 //! \brief It is a Qt control that visualizes content of OCCT 3D view
38 //! It creates control and actions of manipulating of this view,
39 //! emits signal about selection happenning in the view and signal about display mode change and
40 //! changes application cursor depending on an active action.
41 class View_Widget : public QWidget
42 {
43   Q_OBJECT
44 protected:
45
46   //! Enumeration defines manipulating actions of the widget
47   enum View_CurrentAction3d
48   {
49     View_CurrentAction3d_Nothing, //!< Empty action
50     View_CurrentAction3d_DynamicZooming, //!< Zoom action
51     View_CurrentAction3d_WindowZooming, //!< Zoom action using rectangle
52     View_CurrentAction3d_DynamicPanning, //!< Panning action
53     View_CurrentAction3d_DynamicRotation //!< Rotation action
54   };
55
56   //! Enumeration defines cursor kind
57   enum View_CursorMode
58   {
59     View_CursorMode_DefaultCursor, //!< default Qt cursor
60     View_CursorMode_HandCursor, //!< hand cursor
61     View_CursorMode_PanCursor, //!< panning cursor
62     View_CursorMode_ZoomCursor, //!< zoom cursor
63     View_CursorMode_RotationCursor //!< onRotate cursor
64   };
65
66   //! Enumeration defines drag mode
67   enum View_DragMode
68   {
69     View_DragMode_ButtonDown, //!< theState == -1  button down
70     View_DragMode_ButtonMove, //!< theState ==  0  move
71     View_DragMode_ButtonUp //< theState ==  1  button up
72   };
73
74 public:
75
76   //! Constructor
77   Standard_EXPORT View_Widget (QWidget* theParent,
78                                const Handle(AIS_InteractiveContext)& theContext,
79                                const bool isFitAllActive);
80
81   //! Destructor
82   virtual ~View_Widget() {}
83
84   //! Returns current viewer
85   View_Viewer* GetViewer() const { return myViewer; }
86
87   //! Sets default size that is used in sizeHint when the widget is firstly show
88   Standard_EXPORT void SetPredefinedSize (int theDefaultWidth, int theDefaultHeight);
89
90   //! Creates V3d view and set Qt control for it
91   Standard_EXPORT void Init();
92
93   //! Returns an action for the given action type
94   //! \param theActionId an action index
95   QAction* ViewAction (const View_ViewActionType theActionId) const { return myViewActions[theActionId]; };
96
97   //! Retuns an action widget if exist. Implemented for fit all widget.
98   //! \param theActionId an action index
99   QWidget* GetWidget (const View_ViewActionType theActionId) const { return theActionId == View_ViewActionType_FitAllId ? myFitAllAction : 0; };
100
101   //! \returns 0 - AIS_WireFrame, 1 - AIS_Shaded
102   Standard_EXPORT int DisplayMode() const;
103
104   //! Sets display mode: 0 - AIS_WireFrame, 1 - AIS_Shaded
105   Standard_EXPORT void SetDisplayMode (const int theMode);
106
107   //! Sets enable/disable view and tool bar actions depending on the parameter
108   //! \param theIsEnabled boolean value
109   Standard_EXPORT void SetEnabledView (const bool theIsEnabled);
110
111   //! Returns true if action is checked. It processes fit all action only.
112   //! \param theIsEnabled boolean value
113   bool IsActionChecked (const View_ViewActionType theActionId)
114     { return theActionId == View_ViewActionType_FitAllId && myFitAllAction->isChecked(); }
115
116   //! Sets checked fit all action. Double click on fit all action set the action checked automatically
117   //! \param theIsEnabled boolean value
118   void SetActionChecked (const View_ViewActionType theActionId, const bool isChecked)
119   { if (theActionId == View_ViewActionType_FitAllId) myFitAllAction->setChecked(isChecked); }
120
121   //! Sets initial camera position
122   //! \param theVx direction on Ox
123   //! \param theVy direction on Oy
124   //! \param theVz direction on Oz
125   void SetInitProj (const Standard_Real theVx, const Standard_Real theVy, const Standard_Real theVz)
126   { myHasInitProj = Standard_True; myInitVx = theVx; myInitVy = theVy; myInitVz = theVz; }
127
128   //! Returns paint engine for the OpenGL viewer. Avoid default execution of Qt Widget.
129   virtual QPaintEngine* paintEngine() const Standard_OVERRIDE { return 0; }
130
131   //! Return the recommended size for view. If default size exists, it returns the default size
132   Standard_EXPORT virtual QSize sizeHint() const Standard_OVERRIDE;
133
134   //! Saves state of widget actions
135   //! \param theParameters a view instance
136   //! \param theItems [out] properties
137   //! \param thePrefix peference item prefix
138   Standard_EXPORT static void SaveState (View_Widget* theWidget,
139                                          QMap<QString, QString>& theItems,
140                                          const QString& thePrefix = QString());
141
142   //! Restores state of widget actions
143   //! \param theParameters a view instance
144   //! \param theKey property key
145   //! \param theValue property value
146   //! \param thePrefix peference item prefix
147   //! \return boolean value whether the property is applied to the tree view
148   Standard_EXPORT static bool RestoreState (View_Widget* theWidget,
149                                             const QString& theKey, const QString& theValue,
150                                             const QString& thePrefix = QString());
151
152 signals:
153
154   //! Sends a signal about selection change if the left mouse button is pressed and current action does not process it
155   void selectionChanged();
156
157   //! Sends a signal about moving to the point in the view
158   //! \param theX X mouse position in pixels
159   //! \param theY Y mouse position in pixels
160   void  moveTo (const int theX, const int theY);
161
162   //! Sends a signal about up the left mouse button down
163   //! \param theX X mouse position in pixels
164   //! \param theY Y mouse position in pixels
165   void leftButtonDown (const int theX, const int theY);
166
167   //! Sends a signal about up the left mouse button up
168   //! \param theX X mouse position in pixels
169   //! \param theY Y mouse position in pixels
170   void leftButtonUp (const int theX, const int theY);
171
172   //! Sends a signal about display mode change
173   void displayModeClicked();
174
175   //! Sends a signal about checked state is changed
176   //! \param theActionId an action index
177   //! \param theState the checked state
178   void checkedStateChanged (const int theActionId, bool theState);
179
180 public slots:
181
182   //! Fits all the V3d view and redraw view
183   void OnFitAll() { myViewer->GetView()->FitAll(); }
184
185   //! Stores state about fitting all to use it by the mouse move
186   void OnFitArea() { myCurrentMode = View_CurrentAction3d_WindowZooming; }
187
188   //! Stores state about zoom to use it by the mouse move
189   void OnZoom() { myCurrentMode = View_CurrentAction3d_DynamicZooming; }
190
191   //! Stores state about pan to use it by the mouse move
192   void OnPan() { myCurrentMode = View_CurrentAction3d_DynamicPanning; }
193
194   //! Stores state about onRotate to use it by the mouse move
195   void OnRotate() { myCurrentMode = View_CurrentAction3d_DynamicRotation; }
196
197   //! Updates states of widget actions
198   //! 
199   //! - if the state is checked, uncheck all other actions
200   Standard_EXPORT void onCheckedStateChanged (bool isOn);
201
202   //! Updates states of tool actions:
203   //! - if the action is display mode, it changes an icon for action(wireframe or shading)
204   //! - if the state is checked, uncheck all other actions
205   //! \param isOn boolean value about check
206   Standard_EXPORT void OnUpdateToggled (bool isOn);
207
208 protected:
209
210   //! Avoids Qt standard execution of this method, redraw V3d view
211   //! \param an event
212   virtual void paintEvent (QPaintEvent* theEvent) Standard_OVERRIDE;
213
214   //! Avoids Qt standard execution of this method, do mustBeResized for V3d view, Init view if it is the first call
215   //! \param an event
216   virtual void resizeEvent (QResizeEvent* theEvent) Standard_OVERRIDE;
217
218   //! Left, Middle, Right button processing
219   //! \param an event
220   virtual void mousePressEvent (QMouseEvent* theEvent) Standard_OVERRIDE;
221
222   //! Left, Middle, Right button processing
223   //! \param an event
224   virtual void mouseReleaseEvent (QMouseEvent* theEvent) Standard_OVERRIDE;
225
226   //! Left, Middle, Right button processing
227   //! \param an event
228   virtual void mouseMoveEvent (QMouseEvent* theEvent) Standard_OVERRIDE;
229
230 protected:
231
232   //! Creates view actions and fills an internal map
233   void initViewActions();
234
235   //! Creates cursors and fills an internal map
236   void initCursors();
237
238   //! Sets widget cursor by the action type
239   //! \param theMode an active action mode
240   void activateCursor (const View_CurrentAction3d theMode);
241
242   //! Activates cursor of the active operation, perform drag, onRotate depending on mode,
243   //! stores the point position in xmin/xmax and ymin/ymax
244   //! \param theFlags an event buttons and modifiers
245   //! \param thePoint a clicked point
246   void processLeftButtonDown (const int theFlags, const QPoint thePoint);
247
248   //! Activates cursor of the active operation and performs dynamic pan if it is active
249   //! \param theFlags an event buttons and modifiers
250   //! \param thePoint a clicked point
251   void processMiddleButtonDown (const int theFlags, const QPoint thePoint);
252
253   //! Activates cursor of the active operation, build popup menu
254   //! \param theFlags an event buttons and modifiers
255   //! \param thePoint a clicked point
256   void processRightButtonDown (const int theFlags, const QPoint thePoint);
257
258   //! Performs the active operation or performs Input/Drag event processing, emits selection changed signal
259   //! \param theFlags an event buttons and modifiers
260   //! \param thePoint a clicked point
261   void processLeftButtonUp (const int  theFlags, const QPoint thePoint);
262
263   //! Changes the active operation to None
264   //! \param theFlags an event buttons and modifiers
265   //! \param thePoint a clicked point
266   void processMiddleButtonUp (const int  theFlags, const QPoint thePoint);
267
268   //! Calls popup menu build and changes the active operation to None
269   //! \param theFlags an event buttons and modifiers
270   //! \param thePoint a clicked point
271   void processRightButtonUp (const int  theFlags, const QPoint thePoint);
272
273   //! Performs active operation or draws rectangle of zoom
274   //! \param theFlags an event buttons and modifiers
275   //! \param thePoint a clicked point
276   void processMouseMove (const int  theFlags, const QPoint thePoint);
277
278   //! Performs selection: store clicked point by botton down, call Select by button up
279   //! Emits signal about selection changed
280   //! \param theX a horizontal position of mouse event
281   //! \param theX a vertical position of mouse event
282   //! \param theState a mouse button state: down, move or up
283   void processDragEvent (const Standard_Integer theX, const Standard_Integer theY, const View_DragMode& theState);
284
285   //! Performs selection in context without parameter, it means the selection of picked object
286   //! \param theX a horizontal position of mouse event
287   //! \param theX a vertical position of mouse event
288   void processInputEvent (const Standard_Integer theX, const Standard_Integer theY);
289
290   //! Calls MoveTo of the context for the parameter coordinates
291   //! \param theX a horizontal position of mouse event
292   //! \param theX a vertical position of mouse event
293   void processMoveEvent (const Standard_Integer theX, const Standard_Integer theY);
294
295   //! Empty: template to process mouse move with multi selection key pressed
296   //! \param theX a horizontal position of mouse event
297   //! \param theX a vertical position of mouse event
298   void processMoveMultiEvent (const Standard_Integer theX, const Standard_Integer theY)
299   { (void)theX; (void)theY; }
300
301   //! Performs selection: store clicked point by botton down, call ShiftSelect by button move
302   //! Emits signal about selection changed
303   //! \param theX a horizontal position of mouse event
304   //! \param theX a vertical position of mouse event
305   //! \param theState a mouse button state: down, move or up
306   void processDragMultiEvent (const Standard_Integer theX, const Standard_Integer theY, const View_DragMode& theState);
307
308   //! Performs shift selection in context without parameter, it means the selection of picked object
309   //! \param theX a horizontal position of mouse event
310   //! \param theX a vertical position of mouse event
311   void processInputMultiEvent (const Standard_Integer theX, const Standard_Integer theY);
312
313   //! Empty: template to create popup menu
314   //! \param theX a horizontal position of mouse event
315   //! \param theX a vertical position of mouse event
316   void popup (const Standard_Integer theX, const Standard_Integer theY) { (void)theX; (void)theY; }
317
318   //! Draws Qt rectangle for the given area (e.g. for panning operation)
319   //! \param theMinX a minimal X coordinate
320   //! \param theMinY a minimal Y coordinate
321   //! \param theMinZ a minimal Z coordinate
322   //! \param theMaxX a maximum X coordinate
323   //! \param theMaxY a maximum Y coordinate
324   //! \param theMaxZ a maximum Z coordinate
325   //! \param theToDraw state whether the rectangle should be visualized or hidden
326   void drawRectangle (const Standard_Integer theMinX, const Standard_Integer theMinY, const Standard_Integer theMaxX,
327                       const Standard_Integer theMaxY, const Standard_Boolean theToDraw);
328 private:
329   //! Creates action and stores it in a map of actions
330   //! \param theActionId an identifier of action in internal map
331   //! \param theIcon an icon name and place according to qrc resource file, e.g. ":/icons/view_fitall.png"
332   //! \param theText an action text
333   //! \param theToolBar a tool bar action text
334   //! \param theStatusBar a status bar action text
335   void createAction (const View_ViewActionType theActionId, const QString& theIcon, const QString& theText,
336                      const char* theSlot, const bool isCheckable = false,
337                      const QString& theToolBar = QString(), const QString& theStatusBar = QString());
338
339   //! Sets active action cursor for application
340   //! \param theMode a cursor mode
341   void setActiveCursor (const View_CursorMode& theMode);
342
343 private:
344
345   View_Viewer* myViewer; //!< connector to context, V3d viewer and V3d View
346   QToolButton* myFitAllAction; //!< widget for fit all, processed double click to perform action automatically
347   QMap<View_ViewActionType, QAction*> myViewActions; //!< tool bar view actions
348   QMap<View_CursorMode, QCursor> myCursors; //!< possible cursors for view actions
349
350   View_CurrentAction3d myCurrentMode; //!< an active action mode for viewer
351   Standard_Boolean myFirst; //!< flag to Init view by the first resize/paint call
352   Standard_Integer myDefaultWidth; //!< default width for the first sizeHint
353   Standard_Integer myDefaultHeight; //!< default height for the first sizeHint
354   Standard_Boolean myViewIsEnabled; //!< flag if the view and tool bar view actions are enabled/disabled
355   Standard_Integer myXmin; //!< cached X minimal position by mouse press event
356   Standard_Integer myYmin; //!< cached Y minimal position by mouse press event
357   Standard_Integer myXmax; //!< cached X maximum position by mouse press event
358   Standard_Integer myYmax; //!< cached Y maximum position by mouse press event
359   Standard_Integer myDragButtonDownX; //!< cached X button down by drag event
360   Standard_Integer myDragButtonDownY; //!< cached Y button down by drag event
361   Standard_Integer myDragMultiButtonDownX; //!< cached X button down by multi drag event
362   Standard_Integer myDragMultiButtonDownY; //!< cached Y button down by multi drag event
363   Standard_Boolean myIsRectVisible; //!< true if rectangle is visible now
364   QRubberBand* myRectBand; //!< selection rectangle rubber band
365
366   Standard_Boolean myHasInitProj; //!< is initial camera position defined
367   Standard_Real myInitVx; //!< initial camera position on X
368   Standard_Real myInitVy; //!< initial camera position on Y
369   Standard_Real myInitVz; //!< initial camera position on Z
370
371 };
372
373 #endif