Overte C++ Documentation
KeyboardMouseDevice.h
1 //
2 // KeyboardMouseDevice.h
3 // input-plugins/src/input-plugins
4 //
5 // Created by Sam Gateau on 4/27/15.
6 // Copyright 2015 High Fidelity, Inc.
7 // Copyright 2020 Vircadia contributors.
8 //
9 // Distributed under the Apache License, Version 2.0.
10 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
11 //
12 
13 #ifndef hifi_KeyboardMouseDevice_h
14 #define hifi_KeyboardMouseDevice_h
15 
16 #include <chrono>
17 
18 #include <QtCore/QPoint>
19 
20 #include <controllers/InputDevice.h>
21 #include "InputPlugin.h"
22 
23 class QTouchEvent;
24 class QKeyEvent;
25 class QMouseEvent;
26 class QWheelEvent;
27 class QGestureEvent;
28 
29 class KeyboardMouseDevice : public InputPlugin {
30  Q_OBJECT
31 public:
32  enum KeyboardChannel {
33  KEYBOARD_FIRST = 0,
34  KEYBOARD_LAST = 255,
35  KEYBOARD_MASK = 0x00FF,
36  };
37 
38  enum MouseButtonChannel {
39  MOUSE_BUTTON_LEFT = KEYBOARD_LAST + 1,
40  MOUSE_BUTTON_RIGHT,
41  MOUSE_BUTTON_MIDDLE,
42  MOUSE_BUTTON_LEFT_CLICKED,
43  MOUSE_BUTTON_RIGHT_CLICKED,
44  MOUSE_BUTTON_MIDDLE_CLICKED,
45  };
46 
47  enum MouseAxisChannel {
48  MOUSE_AXIS_X_POS = MOUSE_BUTTON_MIDDLE + 1,
49  MOUSE_AXIS_X_NEG,
50  MOUSE_AXIS_Y_POS,
51  MOUSE_AXIS_Y_NEG,
52  MOUSE_AXIS_X,
53  MOUSE_AXIS_Y,
54  MOUSE_AXIS_WHEEL_Y_POS,
55  MOUSE_AXIS_WHEEL_Y_NEG,
56  MOUSE_AXIS_WHEEL_X_POS,
57  MOUSE_AXIS_WHEEL_X_NEG,
58  };
59 
60  enum TouchAxisChannel {
61  TOUCH_AXIS_X_POS = MOUSE_AXIS_WHEEL_X_NEG + 1,
62  TOUCH_AXIS_X_NEG,
63  TOUCH_AXIS_Y_POS,
64  TOUCH_AXIS_Y_NEG,
65  TOUCH_GESTURE_PINCH_POS,
66  TOUCH_GESTURE_PINCH_NEG,
67  };
68 
69  enum TouchButtonChannel {
70  TOUCH_BUTTON_PRESS = TOUCH_AXIS_Y_NEG + 1,
71  };
72 
73  // Plugin functions
74  bool isSupported() const override { return true; }
75  const QString getName() const override { return NAME; }
76 
77  void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); }
78  void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override;
79 
80  void keyPressEvent(QKeyEvent* event);
81  void keyReleaseEvent(QKeyEvent* event);
82 
83  void mouseMoveEvent(QMouseEvent* event, bool capture, QPointF captureTarget);
84  void mousePressEvent(QMouseEvent* event);
85  void mouseReleaseEvent(QMouseEvent* event);
86  void eraseMouseClicked();
87 
88  void touchGestureEvent(const QGestureEvent* event);
89  void touchBeginEvent(const QTouchEvent* event);
90  void touchEndEvent(const QTouchEvent* event);
91  void touchUpdateEvent(const QTouchEvent* event);
92 
93  void wheelEvent(QWheelEvent* event);
94  bool isWheelByTouchPad(QWheelEvent* event);
95 
96  // This gets called from Application::update just before resetting cursor position when mouse capture is enabled
97  void updateMousePositionForCapture(QPoint globalPos, QPointF captureTarget);
98 
99  static void enableTouch(bool enableTouch) { _enableTouch = enableTouch; }
100 
101  static const char* NAME;
102 
103 protected:
104 
105  class InputDevice : public controller::InputDevice {
106  public:
107  InputDevice() : controller::InputDevice("Keyboard") {}
108  private:
109  // Device functions
110  virtual controller::Input::NamedVector getAvailableInputs() const override;
111  virtual QString getDefaultMappingConfig() const override;
112  virtual void update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override;
113  virtual void focusOutEvent() override;
114 
115  // Let's make it easy for Qt because we assume we love Qt forever
116  controller::Input makeInput(Qt::Key code) const;
117  controller::Input makeInput(Qt::MouseButton code, bool clicked = false) const;
118  controller::Input makeInput(MouseAxisChannel axis) const;
119  controller::Input makeInput(TouchAxisChannel axis) const;
120  controller::Input makeInput(TouchButtonChannel button) const;
121 
122  friend class KeyboardMouseDevice;
123  };
124 
125 public:
126  const std::shared_ptr<InputDevice>& getInputDevice() const { return _inputDevice; }
127 
128 protected:
129  QPoint _lastCursor;
130  QPoint _accumulatedMove;
131  QPoint _mousePressPos;
132  quint64 _mousePressTime;
133  qreal _lastTotalScaleFactor;
134  bool _clickDeadspotActive;
135  glm::vec2 _lastTouch;
136  std::shared_ptr<InputDevice> _inputDevice { std::make_shared<InputDevice>() };
137 
138  bool _isTouching = false;
139  std::chrono::high_resolution_clock _clock;
140  std::chrono::high_resolution_clock::time_point _lastTouchTime;
141 
142  static bool _enableTouch;
143  QPoint _lastWheelDelta;
144  QPoint _wheelDeltaRepeatCount;
145 
146 private:
147  void updateDeltaAxisValue(int channel, float value);
148 };
149 
150 #endif // hifi_KeyboardMouseDevice_h