NAP
inputevent.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "keyboard.h"
9 #include "controller.h"
10 
11 // External Includes
12 #include <rtti/rtti.h>
13 #include <nap/numeric.h>
14 #include <nap/event.h>
15 #include <string.h>
16 
17 namespace nap
18 {
19  namespace input
20  {
21  inline constexpr int invalid = -1;
22  }
23 
27  class NAPAPI InputEvent : public Event
28  {
29  RTTI_ENABLE(Event)
30  };
31 
32 
37  class NAPAPI WindowInputEvent : public InputEvent
38  {
39  RTTI_ENABLE(InputEvent)
40  public:
41  WindowInputEvent(int window) : mWindow(window) { }
42  int mWindow;
43  };
44 
45 
47  // Keyboard Input Events
49 
55  class NAPAPI KeyEvent : public WindowInputEvent
56  {
57  RTTI_ENABLE(WindowInputEvent)
58  public:
59  KeyEvent(EKeyCode inKey, int window) : WindowInputEvent(window),
60  mKey(inKey)
61  { }
62 
64  };
65 
66 
70  class NAPAPI KeyPressEvent : public KeyEvent
71  {
72  RTTI_ENABLE(KeyEvent)
73  public:
74  KeyPressEvent(EKeyCode inKey, int window) :
75  KeyEvent(inKey, window)
76  { }
77  };
78 
79 
83  class NAPAPI KeyReleaseEvent : public KeyEvent
84  {
85  RTTI_ENABLE(KeyEvent)
86  public:
87  KeyReleaseEvent(EKeyCode inKey, int window) :
88  KeyEvent(inKey, window)
89  { }
90  };
91 
92 
93 
95  // Text input event
97 
101  class NAPAPI TextInputEvent : public WindowInputEvent
102  {
103  RTTI_ENABLE(WindowInputEvent)
104  public:
105  TextInputEvent(const std::string& text, int window) :
106  WindowInputEvent(window), mText(text)
107  { }
108 
109  std::string mText;
110  };
111 
112 
114  // Pointer Input Events, always associated with a with a window
116 
121  class NAPAPI PointerEvent : public WindowInputEvent
122  {
123  RTTI_ENABLE(WindowInputEvent)
124  public:
125 
129  enum class ESource : int8
130  {
131  Mouse = 0,
132  Touch = 1
133  };
134 
135  PointerEvent(int inX, int inY, int window, ESource origin) :
136  WindowInputEvent(window), mX(inX), mY(inY), mSource(origin)
137  { }
138 
139  int mX;
140  int mY;
141  ESource mSource = ESource::Mouse;
142  };
143 
144 
148  class NAPAPI PointerClickEvent : public PointerEvent
149  {
150  RTTI_ENABLE(PointerEvent)
151  public:
152 
156  enum class EButton : int8
157  {
158  UNKNOWN = -1,
159  LEFT = 0,
160  RIGHT = 1,
161  MIDDLE = 2
162  };
163 
164  PointerClickEvent(int inX, int inY, EButton inButton, int window, ESource source) :
165  PointerEvent(inX, inY, window, source),
166  mButton(inButton)
167  { }
168 
170  };
171 
172 
176  class NAPAPI PointerPressEvent : public PointerClickEvent
177  {
178  RTTI_ENABLE(PointerClickEvent)
179  public:
180  PointerPressEvent(int inX, int inY, EButton inButton, int window, ESource source) :
181  PointerClickEvent(inX, inY, inButton, window, source)
182  { }
183  };
184 
185 
190  {
191  RTTI_ENABLE(PointerClickEvent)
192  public:
193  PointerReleaseEvent (int inX, int inY, EButton inButton, int window, ESource source) :
194  PointerClickEvent(inX, inY, inButton, window, source)
195  { }
196  };
197 
198 
202  class NAPAPI PointerMoveEvent : public PointerEvent
203  {
204  RTTI_ENABLE(PointerEvent)
205  public:
206  PointerMoveEvent(int relX, int relY, int inAbsX, int inAbsY, int window, ESource source) :
207  PointerEvent(inAbsX, inAbsY, window, source),
208  mRelX(relX),
209  mRelY(relY)
210  { }
211 
212  int mRelX;
213  int mRelY;
214  };
215 
216 
220  class NAPAPI MouseWheelEvent : public WindowInputEvent
221  {
222  RTTI_ENABLE(WindowInputEvent)
223  public:
224  MouseWheelEvent(int x, int y, int window=0) :
225  WindowInputEvent(window),
226  mX(x),
227  mY(y)
228  { }
229 
230  int mX;
231  int mY;
232  };
233 
234 
236  // Touch Input Events
238 
242  class NAPAPI TouchEvent : public WindowInputEvent
243  {
244  RTTI_ENABLE(WindowInputEvent)
245  public:
246  TouchEvent(int fingerID, int touchID, float x, float y, float pressure, int window = input::invalid, int wx = input::invalid, int wy = input::invalid) :
247  WindowInputEvent(window),
248  mFingerID(fingerID),
249  mTouchID(touchID),
250  mX(x), mY(y),
251  mPressure(pressure),
252  mXCoordinate(wx), mYCoordinate(wy)
253  { }
254 
255  int mFingerID;
256  int mTouchID;
257  float mX;
258  float mY;
259  float mPressure;
262 
267  bool hasWindow() const { return mWindow != input::invalid; }
268  };
269 
270 
274  class NAPAPI TouchPressEvent : public TouchEvent
275  {
276  RTTI_ENABLE(TouchEvent)
277  public:
278  TouchPressEvent(int fingerID, int touchID, float x, float y, float pressure, int window = input::invalid, int wx = input::invalid, int wy = input::invalid) :
279  TouchEvent(fingerID, touchID, x, y, pressure, window, wx, wy)
280  { }
281  };
282 
283 
287  class NAPAPI TouchReleaseEvent : public TouchEvent
288  {
289  RTTI_ENABLE(TouchEvent)
290  public:
291  TouchReleaseEvent(int fingerID, int touchID, float x, float y, float pressure, int window = input::invalid, int wx = input::invalid, int wy = input::invalid) :
292  TouchEvent(fingerID, touchID, x, y, pressure, window, wx, wy)
293  { }
294  };
295 
296 
300  class NAPAPI TouchMoveEvent : public TouchEvent
301  {
302  RTTI_ENABLE(TouchEvent)
303  public:
304  TouchMoveEvent(int fingerID, int touchID, float x, float y, float pressure, float dx, float dy, int window = input::invalid, int wx = input::invalid, int wy = input::invalid) :
305  TouchEvent(fingerID, touchID, x, y, pressure, window, wx, wy),
306  mDX (dx), mDY (dy)
307  { }
308 
309  float mDX;
310  float mDY;
311  };
312 
313 
315  // Controller Input Events
317 
321  class NAPAPI ControllerEvent : public InputEvent
322  {
323  RTTI_ENABLE(InputEvent)
324  public:
325  ControllerEvent(int deviceID) :
326  mDeviceID(deviceID) { }
327 
328  int mDeviceID = -1;
329  };
330 
338  class NAPAPI ControllerAxisEvent : public ControllerEvent
339  {
340  RTTI_ENABLE(ControllerEvent)
341  public:
342  ControllerAxisEvent(int deviceID, EControllerAxis axis, int axisID, double value) :
343  ControllerEvent(deviceID),
344  mAxis(axis),
345  mAxisID(axisID),
346  mValue(value) { }
347 
349  int mAxisID = -1;
350  double mValue = 0.0;
351  };
352 
361  {
362  RTTI_ENABLE(ControllerEvent)
363  public:
364  ControllerButtonEvent(int deviceID, EControllerButton button, int buttonID) :
365  ControllerEvent(deviceID),
366  mButton(button),
367  mButtonID(buttonID) { }
368 
370  int mButtonID = -1;
371  };
372 
373 
379  {
380  RTTI_ENABLE(ControllerButtonEvent)
381  public:
382  ControllerButtonPressEvent(int deviceID, EControllerButton button, int buttonID) :
383  ControllerButtonEvent(deviceID, button, buttonID) { }
384  };
385 
386 
392  {
393  RTTI_ENABLE(ControllerButtonEvent)
394  public:
395  ControllerButtonReleaseEvent(int deviceID, EControllerButton button, int buttonID) :
396  ControllerButtonEvent(deviceID, button, buttonID) { }
397  };
398 
399 
404  {
405  RTTI_ENABLE(ControllerEvent)
406  public:
407  ControllerConnectionEvent(int deviceID, bool connected) :
408  ControllerEvent(deviceID),
409  mConnected(connected) { }
410  bool mConnected = false;
411  };
412 
413 
414  using InputEventPtr = std::unique_ptr<nap::InputEvent>;
415  using InputEventPtrList = std::vector<InputEventPtr>;
416 }
nap::ControllerButtonEvent
Definition: inputevent.h:360
nap::EKeyCode
EKeyCode
Definition: keyboard.h:16
nap::TouchMoveEvent::TouchMoveEvent
TouchMoveEvent(int fingerID, int touchID, float x, float y, float pressure, float dx, float dy, int window=input::invalid, int wx=input::invalid, int wy=input::invalid)
Definition: inputevent.h:304
nap::TextInputEvent::TextInputEvent
TextInputEvent(const std::string &text, int window)
Definition: inputevent.h:105
nap::input::invalid
constexpr int invalid
Invalid input ID.
Definition: inputevent.h:21
nap::PointerClickEvent::PointerClickEvent
PointerClickEvent(int inX, int inY, EButton inButton, int window, ESource source)
Definition: inputevent.h:164
nap::TouchMoveEvent
Definition: inputevent.h:300
nap::KeyEvent
Definition: inputevent.h:55
nap::InputEventPtrList
std::vector< InputEventPtr > InputEventPtrList
Definition: inputevent.h:415
nap::PointerClickEvent::EButton
EButton
Definition: inputevent.h:156
nap::PointerEvent::mX
int mX
horizontal window coordinate
Definition: inputevent.h:139
nap::KeyPressEvent
Definition: inputevent.h:70
nap::TouchReleaseEvent
Definition: inputevent.h:287
nap::Event
Definition: event.h:17
nap::ControllerButtonEvent::ControllerButtonEvent
ControllerButtonEvent(int deviceID, EControllerButton button, int buttonID)
Definition: inputevent.h:364
nap::KeyReleaseEvent
Definition: inputevent.h:83
nap::PointerEvent::mY
int mY
vertical window coordinate
Definition: inputevent.h:140
nap::int8
int8_t int8
Definition: numeric.h:15
nap::TouchMoveEvent::mDX
float mDX
The distance moved in the x-axis, normalized (-1-1)
Definition: inputevent.h:309
nap::TouchEvent::mFingerID
int mFingerID
The finger ID.
Definition: inputevent.h:255
nap::ControllerAxisEvent
Definition: inputevent.h:338
nap::PointerReleaseEvent
Definition: inputevent.h:189
nap::TouchPressEvent
Definition: inputevent.h:274
nap::TextInputEvent::mText
std::string mText
text input
Definition: inputevent.h:109
nap::EControllerButton::UNKNOWN
@ UNKNOWN
nap::PointerMoveEvent::mRelY
int mRelY
Vertical relative movement in pixels.
Definition: inputevent.h:213
nap::PointerMoveEvent::PointerMoveEvent
PointerMoveEvent(int relX, int relY, int inAbsX, int inAbsY, int window, ESource source)
Definition: inputevent.h:206
nap::ControllerEvent::ControllerEvent
ControllerEvent(int deviceID)
Definition: inputevent.h:325
nap::PointerEvent::PointerEvent
PointerEvent(int inX, int inY, int window, ESource origin)
Definition: inputevent.h:135
nap::TouchMoveEvent::mDY
float mDY
The distance moved in the y-axis, normalized (-1-1)
Definition: inputevent.h:310
nap::PointerReleaseEvent::PointerReleaseEvent
PointerReleaseEvent(int inX, int inY, EButton inButton, int window, ESource source)
Definition: inputevent.h:193
nap::PointerEvent
Definition: inputevent.h:121
nap::TouchEvent::mX
float mX
The x-axis location of the touch event, normalized(0 - 1)
Definition: inputevent.h:257
nap::KeyPressEvent::KeyPressEvent
KeyPressEvent(EKeyCode inKey, int window)
Definition: inputevent.h:74
nap::EControllerAxis::UNKNOWN
@ UNKNOWN
nap::ControllerAxisEvent::ControllerAxisEvent
ControllerAxisEvent(int deviceID, EControllerAxis axis, int axisID, double value)
Definition: inputevent.h:342
nap::TouchEvent::mYCoordinate
int mYCoordinate
The y-axis window coordinate, if any. -1 otherwise.
Definition: inputevent.h:261
nap::PointerMoveEvent::mRelX
int mRelX
Horizontal relative movement in pixels.
Definition: inputevent.h:212
nap::TouchEvent::TouchEvent
TouchEvent(int fingerID, int touchID, float x, float y, float pressure, int window=input::invalid, int wx=input::invalid, int wy=input::invalid)
Definition: inputevent.h:246
nap::EControllerAxis
EControllerAxis
Definition: controller.h:39
nap::KeyEvent::KeyEvent
KeyEvent(EKeyCode inKey, int window)
Definition: inputevent.h:59
nap::MouseWheelEvent::mX
int mX
Definition: inputevent.h:230
nap::TouchEvent::mY
float mY
The y-axis location of the touch event, normalized(0 - 1)
Definition: inputevent.h:258
nap::WindowInputEvent::WindowInputEvent
WindowInputEvent(int window)
Definition: inputevent.h:41
nap::ControllerButtonPressEvent
Definition: inputevent.h:378
nap::PointerClickEvent
Definition: inputevent.h:148
nap::PointerMoveEvent
Definition: inputevent.h:202
nap::KeyReleaseEvent::KeyReleaseEvent
KeyReleaseEvent(EKeyCode inKey, int window)
Definition: inputevent.h:87
nap::MouseWheelEvent
Definition: inputevent.h:220
nap
Definition: templateapp.h:17
nap::EControllerButton
EControllerButton
Definition: controller.h:15
nap::InputEventPtr
std::unique_ptr< nap::InputEvent > InputEventPtr
Definition: inputevent.h:414
nap::TextInputEvent
Definition: inputevent.h:101
nap::WindowInputEvent::mWindow
int mWindow
Window ID.
Definition: inputevent.h:42
nap::EMouseButton::LEFT
@ LEFT
nap::ControllerConnectionEvent::ControllerConnectionEvent
ControllerConnectionEvent(int deviceID, bool connected)
Definition: inputevent.h:407
nap::ControllerButtonReleaseEvent::ControllerButtonReleaseEvent
ControllerButtonReleaseEvent(int deviceID, EControllerButton button, int buttonID)
Definition: inputevent.h:395
nap::TouchEvent::hasWindow
bool hasWindow() const
Definition: inputevent.h:267
nap::EMouseButton::MIDDLE
@ MIDDLE
nap::PointerEvent::ESource
ESource
Definition: inputevent.h:129
nap::EMouseButton::RIGHT
@ RIGHT
nap::TouchPressEvent::TouchPressEvent
TouchPressEvent(int fingerID, int touchID, float x, float y, float pressure, int window=input::invalid, int wx=input::invalid, int wy=input::invalid)
Definition: inputevent.h:278
nap::TouchEvent
Definition: inputevent.h:242
nap::ControllerButtonPressEvent::ControllerButtonPressEvent
ControllerButtonPressEvent(int deviceID, EControllerButton button, int buttonID)
Definition: inputevent.h:382
nap::MouseWheelEvent::mY
int mY
Definition: inputevent.h:231
nap::ControllerButtonReleaseEvent
Definition: inputevent.h:391
nap::TouchEvent::mTouchID
int mTouchID
The touch device ID.
Definition: inputevent.h:256
nap::TouchEvent::mXCoordinate
int mXCoordinate
The x-axis window coordinate, if any. -1 otherwise.
Definition: inputevent.h:260
nap::PointerPressEvent
Definition: inputevent.h:176
nap::InputEvent
Definition: inputevent.h:27
nap::PointerClickEvent::mButton
EButton mButton
clicked mouse button
Definition: inputevent.h:169
nap::WindowInputEvent
Definition: inputevent.h:37
nap::TouchEvent::mPressure
float mPressure
The quantity of the pressure applied, normalized (0 - 1)
Definition: inputevent.h:259
nap::ControllerEvent
Definition: inputevent.h:321
nap::PointerPressEvent::PointerPressEvent
PointerPressEvent(int inX, int inY, EButton inButton, int window, ESource source)
Definition: inputevent.h:180
nap::TouchReleaseEvent::TouchReleaseEvent
TouchReleaseEvent(int fingerID, int touchID, float x, float y, float pressure, int window=input::invalid, int wx=input::invalid, int wy=input::invalid)
Definition: inputevent.h:291
nap::MouseWheelEvent::MouseWheelEvent
MouseWheelEvent(int x, int y, int window=0)
Definition: inputevent.h:224
nap::ControllerConnectionEvent
Definition: inputevent.h:403
nap::KeyEvent::mKey
EKeyCode mKey
Associated Key.
Definition: inputevent.h:63