4ca36566d77ce24e0420b9afdf1048afed074b8f
[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 <Aspect_TouchMap.hxx>
19 #include <Graphic3d_Vec.hxx>
20 #include <Standard.hxx>
21 #include <Standard_DefineAlloc.hxx>
22
23 struct Aspect_ScrollDelta;
24 class WNT_HIDSpaceMouse;
25
26 //! Defines a listener for window input events.
27 class Aspect_WindowInputListener
28 {
29 public:
30   ///DEFINE_STANDARD_ALLOC
31 public:
32
33   //! Destructor.
34   Standard_EXPORT virtual ~Aspect_WindowInputListener();
35
36   //! Return event time (e.g. current time).
37   double EventTime() const { return myEventTimer.ElapsedTime(); }
38
39   //! Handle expose event (window content has been invalidation and should be redrawn).
40   virtual void ProcessExpose() = 0;
41
42   //! Handle window resize event.
43   virtual void ProcessConfigure (bool theIsResized) = 0;
44
45   //! Handle window input event immediately (flush input buffer or ignore).
46   virtual void ProcessInput() = 0;
47
48   //! Handle focus event.
49   virtual void ProcessFocus (bool theIsActivated) = 0;
50
51   //! Handle window close event.
52   virtual void ProcessClose() = 0;
53
54 public: //! @name keyboard input
55
56   //! Return keyboard state.
57   const Aspect_VKeySet& Keys() const { return myKeys; }
58
59   //! Return keyboard state.
60   Aspect_VKeySet& ChangeKeys() { return myKeys; }
61
62   //! Press key.
63   //! Default implementation updates internal cache.
64   //! @param theKey key pressed
65   //! @param theTime event timestamp
66   Standard_EXPORT virtual void KeyDown (Aspect_VKey theKey,
67                                         double theTime,
68                                         double thePressure = 1.0) = 0;
69
70   //! Release key.
71   //! Default implementation updates internal cache.
72   //! @param theKey key pressed
73   //! @param theTime event timestamp
74   Standard_EXPORT virtual void KeyUp (Aspect_VKey theKey,
75                                       double theTime) = 0;
76
77   //! Simulate key up/down events from axis value.
78   //! Default implementation updates internal cache.
79   Standard_EXPORT virtual void KeyFromAxis (Aspect_VKey theNegative,
80                                             Aspect_VKey thePositive,
81                                             double theTime,
82                                             double thePressure) = 0;
83
84 public: //! @name mouse input
85
86   //! Update mouse scroll event.
87   //! This method is expected to be called from UI thread.
88   //! @param theDelta mouse cursor position and delta
89   //! @return TRUE if new event has been created or FALSE if existing one has been updated
90   virtual bool UpdateMouseScroll (const Aspect_ScrollDelta& theDelta) = 0;
91
92   //! Handle mouse button press/release event.
93   //! This method is expected to be called from UI thread.
94   //! @param thePoint      mouse cursor position
95   //! @param theButtons    pressed buttons
96   //! @param theModifiers  key modifiers
97   //! @param theIsEmulated if TRUE then mouse event comes NOT from real mouse
98   //!                      but emulated from non-precise input like touch on screen
99   //! @return TRUE if window content should be redrawn
100   virtual bool UpdateMouseButtons (const Graphic3d_Vec2i& thePoint,
101                                    Aspect_VKeyMouse theButtons,
102                                    Aspect_VKeyFlags theModifiers,
103                                    bool theIsEmulated) = 0;
104
105   //! Handle mouse cursor movement event.
106   //! This method is expected to be called from UI thread.
107   //! Default implementation does nothing.
108   //! @param thePoint      mouse cursor position
109   //! @param theButtons    pressed buttons
110   //! @param theModifiers  key modifiers
111   //! @param theIsEmulated if TRUE then mouse event comes NOT from real mouse
112   //!                      but emulated from non-precise input like touch on screen
113   //! @return TRUE if window content should be redrawn
114   virtual bool UpdateMousePosition (const Graphic3d_Vec2i& thePoint,
115                                     Aspect_VKeyMouse theButtons,
116                                     Aspect_VKeyFlags theModifiers,
117                                     bool theIsEmulated) = 0;
118
119   //! Handle mouse button press event.
120   //! This method is expected to be called from UI thread.
121   //! Default implementation redirects to UpdateMousePosition().
122   //! @param thePoint      mouse cursor position
123   //! @param theButton     pressed button
124   //! @param theModifiers  key modifiers
125   //! @param theIsEmulated if TRUE then mouse event comes NOT from real mouse
126   //!                      but emulated from non-precise input like touch on screen
127   //! @return TRUE if window content should be redrawn
128   bool PressMouseButton (const Graphic3d_Vec2i& thePoint,
129                          Aspect_VKeyMouse theButton,
130                          Aspect_VKeyFlags theModifiers,
131                          bool theIsEmulated)
132   {
133     return UpdateMouseButtons (thePoint, myMousePressed | theButton, theModifiers, theIsEmulated);
134   }
135
136   //! Handle mouse button release event.
137   //! This method is expected to be called from UI thread.
138   //! Default implementation redirects to UpdateMousePosition().
139   //! @param thePoint      mouse cursor position
140   //! @param theButton     released button
141   //! @param theModifiers  key modifiers
142   //! @param theIsEmulated if TRUE then mouse event comes NOT from real mouse
143   //!                      but emulated from non-precise input like touch on screen
144   //! @return TRUE if window content should be redrawn
145   bool ReleaseMouseButton (const Graphic3d_Vec2i& thePoint,
146                            Aspect_VKeyMouse theButton,
147                            Aspect_VKeyFlags theModifiers,
148                            bool theIsEmulated)
149   {
150     Aspect_VKeyMouse aButtons = myMousePressed & (~theButton);
151     return UpdateMouseButtons (thePoint, aButtons, theModifiers, theIsEmulated);
152   }
153
154   //! Return currently pressed mouse buttons.
155   Aspect_VKeyMouse PressedMouseButtons() const { return myMousePressed; }
156
157   //! Return active key modifiers passed with last mouse event.
158   Aspect_VKeyFlags LastMouseFlags() const { return myMouseModifiers; }
159
160   //! Return last mouse position.
161   const Graphic3d_Vec2i& LastMousePosition() const { return myMousePositionLast; }
162
163 public: //! @name multi-touch input
164
165   //! Return TRUE if touches map is not empty.
166   bool HasTouchPoints() const { return !myTouchPoints.IsEmpty(); }
167
168   //! Return map of active touches.
169   const Aspect_TouchMap& TouchPoints() const { return myTouchPoints; }
170
171   //! Add touch point with the given ID.
172   //! This method is expected to be called from UI thread.
173   //! @param theId touch unique identifier
174   //! @param thePnt touch coordinates
175   //! @param theClearBefore if TRUE previously registered touches will be removed
176   Standard_EXPORT virtual void AddTouchPoint (Standard_Size theId,
177                                               const Graphic3d_Vec2d& thePnt,
178                                               Standard_Boolean theClearBefore = false);
179
180   //! Remove touch point with the given ID.
181   //! This method is expected to be called from UI thread.
182   //! @param theId touch unique identifier
183   //! @param theClearSelectPnts if TRUE will initiate clearing of selection points
184   //! @return TRUE if point has been removed
185   Standard_EXPORT virtual bool RemoveTouchPoint (Standard_Size theId,
186                                                  Standard_Boolean theClearSelectPnts = false);
187
188   //! Update touch point with the given ID.
189   //! If point with specified ID was not registered before, it will be added.
190   //! This method is expected to be called from UI thread.
191   //! @param theId touch unique identifier
192   //! @param thePnt touch coordinates
193   Standard_EXPORT virtual void UpdateTouchPoint (Standard_Size theId,
194                                                  const Graphic3d_Vec2d& thePnt);
195
196 public: //! @name 3d mouse input
197
198   //! Return acceleration ratio for translation event; 2.0 by default.
199   float Get3dMouseTranslationScale() const { return my3dMouseAccelTrans; }
200
201   //! Set acceleration ratio for translation event.
202   void Set3dMouseTranslationScale (float theScale) { my3dMouseAccelTrans = theScale; }
203
204   //! Return acceleration ratio for rotation event; 4.0 by default.
205   float Get3dMouseRotationScale() const { return my3dMouseAccelRotate; }
206
207   //! Set acceleration ratio for rotation event.
208   void Set3dMouseRotationScale (float theScale) { my3dMouseAccelRotate = theScale; }
209
210   //! Return quadric acceleration flag; TRUE by default.
211   bool To3dMousePreciseInput() const { return my3dMouseIsQuadric; }
212
213   //! Set quadric acceleration flag.
214   void Set3dMousePreciseInput (bool theIsQuadric) { my3dMouseIsQuadric = theIsQuadric; }
215
216   //! Return 3d mouse rotation axes (tilt/roll/spin) ignore flag; (FALSE, FALSE, FALSE) by default.
217   const NCollection_Vec3<bool>& Get3dMouseIsNoRotate() const { return my3dMouseNoRotate; }
218
219   //! Return 3d mouse rotation axes (tilt/roll/spin) ignore flag; (FALSE, FALSE, FALSE) by default.
220   NCollection_Vec3<bool>& Change3dMouseIsNoRotate() { return my3dMouseNoRotate; }
221
222   //! Return 3d mouse rotation axes (tilt/roll/spin) reverse flag; (TRUE, FALSE, FALSE) by default.
223   const NCollection_Vec3<bool>& Get3dMouseToReverse() const { return my3dMouseToReverse; }
224
225   //! Return 3d mouse rotation axes (tilt/roll/spin) reverse flag; (TRUE, FALSE, FALSE) by default.
226   NCollection_Vec3<bool>& Change3dMouseToReverse() { return my3dMouseToReverse; }
227
228   //! Process 3d mouse input event (redirects to translation, rotation and keys).
229   virtual bool Update3dMouse (const WNT_HIDSpaceMouse& theEvent) = 0;
230
231   //! Process 3d mouse input translation event.
232   Standard_EXPORT virtual bool update3dMouseTranslation (const WNT_HIDSpaceMouse& theEvent);
233
234   //! Process 3d mouse input rotation event.
235   Standard_EXPORT virtual bool update3dMouseRotation (const WNT_HIDSpaceMouse& theEvent);
236
237   //! Process 3d mouse input keys event.
238   Standard_EXPORT virtual bool update3dMouseKeys (const WNT_HIDSpaceMouse& theEvent);
239
240 protected:
241
242   //! Empty constructor.
243   Standard_EXPORT Aspect_WindowInputListener();
244
245 protected:
246
247   OSD_Timer        myEventTimer;        //!< timer for timestamping events
248
249 protected: //! @name keyboard input variables
250
251   Aspect_VKeySet   myKeys;              //!< keyboard state
252
253 protected: //! @name mouse input variables
254
255   Graphic3d_Vec2i  myMousePositionLast; //!< last mouse position
256   Aspect_VKeyMouse myMousePressed;      //!< active mouse buttons
257   Aspect_VKeyFlags myMouseModifiers;    //!< active key modifiers passed with last mouse event
258
259 protected:
260
261   Aspect_TouchMap  myTouchPoints;       //!< map of active touches
262
263 protected: //! @name 3d mouse input variables
264
265   bool                   my3dMouseButtonState[32];//!< cached button state
266   NCollection_Vec3<bool> my3dMouseNoRotate;       //!< ignore  3d mouse rotation axes
267   NCollection_Vec3<bool> my3dMouseToReverse;      //!< reverse 3d mouse rotation axes
268   float                  my3dMouseAccelTrans;     //!< acceleration ratio for translation event
269   float                  my3dMouseAccelRotate;    //!< acceleration ratio for rotation event
270   bool                   my3dMouseIsQuadric;      //!< quadric acceleration
271
272 };
273
274 #endif // _Aspect_WindowInputListener_HeaderFile