88e8825e71db446eae3cc0fdc8df6a7c9e88268b
[occt.git] / src / Aspect / Aspect_WindowInputListener.hxx
1 // Copyright (c) 2021 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #ifndef _Aspect_WindowInputListener_HeaderFile
15 #define _Aspect_WindowInputListener_HeaderFile
16
17 #include <Aspect_VKeySet.hxx>
18 #include <Graphic3d_Vec.hxx>
19 #include <Standard.hxx>
20 #include <Standard_DefineAlloc.hxx>
21
22 struct Aspect_ScrollDelta;
23 class WNT_HIDSpaceMouse;
24
25 //! Defines a listener for window input events.
26 class Aspect_WindowInputListener
27 {
28 public:
29   ///DEFINE_STANDARD_ALLOC
30 public:
31
32   //! Destructor.
33   Standard_EXPORT virtual ~Aspect_WindowInputListener();
34
35   //! Return event time (e.g. current time).
36   double EventTime() const { return myEventTimer.ElapsedTime(); }
37
38   //! Handle expose event (window content has been invalidation and should be redrawn).
39   virtual void ProcessExpose() = 0;
40
41   //! Handle window resize event.
42   virtual void ProcessConfigure (bool theIsResized) = 0;
43
44   //! Handle window input event immediately (flush input buffer or ignore).
45   virtual void ProcessInput() = 0;
46
47   //! Handle focus event.
48   virtual void ProcessFocus (bool theIsActivated) = 0;
49
50   //! Handle window close event.
51   virtual void ProcessClose() = 0;
52
53 public: //! @name keyboard input
54
55   //! Return keyboard state.
56   const Aspect_VKeySet& Keys() const { return myKeys; }
57
58   //! Return keyboard state.
59   Aspect_VKeySet& ChangeKeys() { return myKeys; }
60
61   //! Press key.
62   //! Default implementation updates internal cache.
63   //! @param theKey key pressed
64   //! @param theTime event timestamp
65   Standard_EXPORT virtual void KeyDown (Aspect_VKey theKey,
66                                         double theTime,
67                                         double thePressure = 1.0) = 0;
68
69   //! Release key.
70   //! Default implementation updates internal cache.
71   //! @param theKey key pressed
72   //! @param theTime event timestamp
73   Standard_EXPORT virtual void KeyUp (Aspect_VKey theKey,
74                                       double theTime) = 0;
75
76   //! Simulate key up/down events from axis value.
77   //! Default implementation updates internal cache.
78   Standard_EXPORT virtual void KeyFromAxis (Aspect_VKey theNegative,
79                                             Aspect_VKey thePositive,
80                                             double theTime,
81                                             double thePressure) = 0;
82
83 public: //! @name mouse input
84
85   //! Update mouse scroll event.
86   //! This method is expected to be called from UI thread.
87   //! @param theDelta mouse cursor position and delta
88   //! @return TRUE if new event has been created or FALSE if existing one has been updated
89   virtual bool UpdateMouseScroll (const Aspect_ScrollDelta& theDelta) = 0;
90
91   //! Handle mouse button press/release event.
92   //! This method is expected to be called from UI thread.
93   //! @param thePoint      mouse cursor position
94   //! @param theButtons    pressed buttons
95   //! @param theModifiers  key modifiers
96   //! @param theIsEmulated if TRUE then mouse event comes NOT from real mouse
97   //!                      but emulated from non-precise input like touch on screen
98   //! @return TRUE if window content should be redrawn
99   virtual bool UpdateMouseButtons (const Graphic3d_Vec2i& thePoint,
100                                    Aspect_VKeyMouse theButtons,
101                                    Aspect_VKeyFlags theModifiers,
102                                    bool theIsEmulated) = 0;
103
104   //! Handle mouse cursor movement event.
105   //! This method is expected to be called from UI thread.
106   //! Default implementation does nothing.
107   //! @param thePoint      mouse cursor position
108   //! @param theButtons    pressed buttons
109   //! @param theModifiers  key modifiers
110   //! @param theIsEmulated if TRUE then mouse event comes NOT from real mouse
111   //!                      but emulated from non-precise input like touch on screen
112   //! @return TRUE if window content should be redrawn
113   virtual bool UpdateMousePosition (const Graphic3d_Vec2i& thePoint,
114                                     Aspect_VKeyMouse theButtons,
115                                     Aspect_VKeyFlags theModifiers,
116                                     bool theIsEmulated) = 0;
117
118   //! Handle mouse button press event.
119   //! This method is expected to be called from UI thread.
120   //! Default implementation redirects to UpdateMousePosition().
121   //! @param thePoint      mouse cursor position
122   //! @param theButton     pressed button
123   //! @param theModifiers  key modifiers
124   //! @param theIsEmulated if TRUE then mouse event comes NOT from real mouse
125   //!                      but emulated from non-precise input like touch on screen
126   //! @return TRUE if window content should be redrawn
127   bool PressMouseButton (const Graphic3d_Vec2i& thePoint,
128                          Aspect_VKeyMouse theButton,
129                          Aspect_VKeyFlags theModifiers,
130                          bool theIsEmulated)
131   {
132     return UpdateMouseButtons (thePoint, myMousePressed | theButton, theModifiers, theIsEmulated);
133   }
134
135   //! Handle mouse button release event.
136   //! This method is expected to be called from UI thread.
137   //! Default implementation redirects to UpdateMousePosition().
138   //! @param thePoint      mouse cursor position
139   //! @param theButton     released button
140   //! @param theModifiers  key modifiers
141   //! @param theIsEmulated if TRUE then mouse event comes NOT from real mouse
142   //!                      but emulated from non-precise input like touch on screen
143   //! @return TRUE if window content should be redrawn
144   bool ReleaseMouseButton (const Graphic3d_Vec2i& thePoint,
145                            Aspect_VKeyMouse theButton,
146                            Aspect_VKeyFlags theModifiers,
147                            bool theIsEmulated)
148   {
149     Aspect_VKeyMouse aButtons = myMousePressed & (~theButton);
150     return UpdateMouseButtons (thePoint, aButtons, theModifiers, theIsEmulated);
151   }
152
153   //! Return currently pressed mouse buttons.
154   Aspect_VKeyMouse PressedMouseButtons() const { return myMousePressed; }
155
156   //! Return active key modifiers passed with last mouse event.
157   Aspect_VKeyFlags LastMouseFlags() const { return myMouseModifiers; }
158
159   //! Return last mouse position.
160   const Graphic3d_Vec2i& LastMousePosition() const { return myMousePositionLast; }
161
162 public: //! @name 3d mouse input
163
164   //! Return acceleration ratio for translation event; 2.0 by default.
165   float Get3dMouseTranslationScale() const { return my3dMouseAccelTrans; }
166
167   //! Set acceleration ratio for translation event.
168   void Set3dMouseTranslationScale (float theScale) { my3dMouseAccelTrans = theScale; }
169
170   //! Return acceleration ratio for rotation event; 4.0 by default.
171   float Get3dMouseRotationScale() const { return my3dMouseAccelRotate; }
172
173   //! Set acceleration ratio for rotation event.
174   void Set3dMouseRotationScale (float theScale) { my3dMouseAccelRotate = theScale; }
175
176   //! Return quadric acceleration flag; TRUE by default.
177   bool To3dMousePreciseInput() const { return my3dMouseIsQuadric; }
178
179   //! Set quadric acceleration flag.
180   void Set3dMousePreciseInput (bool theIsQuadric) { my3dMouseIsQuadric = theIsQuadric; }
181
182   //! Return 3d mouse rotation axes (tilt/roll/spin) ignore flag; (FALSE, FALSE, FALSE) by default.
183   const NCollection_Vec3<bool>& Get3dMouseIsNoRotate() const { return my3dMouseNoRotate; }
184
185   //! Return 3d mouse rotation axes (tilt/roll/spin) ignore flag; (FALSE, FALSE, FALSE) by default.
186   NCollection_Vec3<bool>& Change3dMouseIsNoRotate() { return my3dMouseNoRotate; }
187
188   //! Return 3d mouse rotation axes (tilt/roll/spin) reverse flag; (TRUE, FALSE, FALSE) by default.
189   const NCollection_Vec3<bool>& Get3dMouseToReverse() const { return my3dMouseToReverse; }
190
191   //! Return 3d mouse rotation axes (tilt/roll/spin) reverse flag; (TRUE, FALSE, FALSE) by default.
192   NCollection_Vec3<bool>& Change3dMouseToReverse() { return my3dMouseToReverse; }
193
194   //! Process 3d mouse input event (redirects to translation, rotation and keys).
195   virtual bool Update3dMouse (const WNT_HIDSpaceMouse& theEvent) = 0;
196
197   //! Process 3d mouse input translation event.
198   Standard_EXPORT virtual bool update3dMouseTranslation (const WNT_HIDSpaceMouse& theEvent);
199
200   //! Process 3d mouse input rotation event.
201   Standard_EXPORT virtual bool update3dMouseRotation (const WNT_HIDSpaceMouse& theEvent);
202
203   //! Process 3d mouse input keys event.
204   Standard_EXPORT virtual bool update3dMouseKeys (const WNT_HIDSpaceMouse& theEvent);
205
206 protected:
207
208   //! Empty constructor.
209   Standard_EXPORT Aspect_WindowInputListener();
210
211 protected:
212
213   OSD_Timer        myEventTimer;        //!< timer for timestamping events
214
215 protected: //! @name keyboard input variables
216
217   Aspect_VKeySet   myKeys;              //!< keyboard state
218
219 protected: //! @name mouse input variables
220
221   Graphic3d_Vec2i  myMousePositionLast; //!< last mouse position
222   Aspect_VKeyMouse myMousePressed;      //!< active mouse buttons
223   Aspect_VKeyFlags myMouseModifiers;    //!< active key modifiers passed with last mouse event
224
225 protected: //! @name 3d mouse input variables
226
227   bool                   my3dMouseButtonState[32];//!< cached button state
228   NCollection_Vec3<bool> my3dMouseNoRotate;       //!< ignore  3d mouse rotation axes
229   NCollection_Vec3<bool> my3dMouseToReverse;      //!< reverse 3d mouse rotation axes
230   float                  my3dMouseAccelTrans;     //!< acceleration ratio for translation event
231   float                  my3dMouseAccelRotate;    //!< acceleration ratio for rotation event
232   bool                   my3dMouseIsQuadric;      //!< quadric acceleration
233
234 };
235
236 #endif // _Aspect_WindowInputListener_HeaderFile