13 #ifndef hifi_KeyboardMouseDevice_h
14 #define hifi_KeyboardMouseDevice_h
18 #include <QtCore/QPoint>
20 #include <controllers/InputDevice.h>
21 #include "InputPlugin.h"
29 class KeyboardMouseDevice :
public InputPlugin {
32 enum KeyboardChannel {
35 KEYBOARD_MASK = 0x00FF,
38 enum MouseButtonChannel {
39 MOUSE_BUTTON_LEFT = KEYBOARD_LAST + 1,
42 MOUSE_BUTTON_LEFT_CLICKED,
43 MOUSE_BUTTON_RIGHT_CLICKED,
44 MOUSE_BUTTON_MIDDLE_CLICKED,
47 enum MouseAxisChannel {
48 MOUSE_AXIS_X_POS = MOUSE_BUTTON_MIDDLE + 1,
54 MOUSE_AXIS_WHEEL_Y_POS,
55 MOUSE_AXIS_WHEEL_Y_NEG,
56 MOUSE_AXIS_WHEEL_X_POS,
57 MOUSE_AXIS_WHEEL_X_NEG,
60 enum TouchAxisChannel {
61 TOUCH_AXIS_X_POS = MOUSE_AXIS_WHEEL_X_NEG + 1,
65 TOUCH_GESTURE_PINCH_POS,
66 TOUCH_GESTURE_PINCH_NEG,
69 enum TouchButtonChannel {
70 TOUCH_BUTTON_PRESS = TOUCH_AXIS_Y_NEG + 1,
74 bool isSupported()
const override {
return true; }
75 const QString getName()
const override {
return NAME; }
77 void pluginFocusOutEvent()
override { _inputDevice->focusOutEvent(); }
78 void pluginUpdate(
float deltaTime,
const controller::InputCalibrationData& inputCalibrationData)
override;
80 void keyPressEvent(QKeyEvent* event);
81 void keyReleaseEvent(QKeyEvent* event);
83 void mouseMoveEvent(QMouseEvent* event,
bool capture, QPointF captureTarget);
84 void mousePressEvent(QMouseEvent* event);
85 void mouseReleaseEvent(QMouseEvent* event);
86 void eraseMouseClicked();
88 void touchGestureEvent(
const QGestureEvent* event);
89 void touchBeginEvent(
const QTouchEvent* event);
90 void touchEndEvent(
const QTouchEvent* event);
91 void touchUpdateEvent(
const QTouchEvent* event);
93 void wheelEvent(QWheelEvent* event);
94 bool isWheelByTouchPad(QWheelEvent* event);
97 void updateMousePositionForCapture(QPoint globalPos, QPointF captureTarget);
99 static void enableTouch(
bool enableTouch) { _enableTouch = enableTouch; }
101 static const char* NAME;
105 class InputDevice :
public controller::InputDevice {
107 InputDevice() : controller::InputDevice(
"Keyboard") {}
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;
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;
122 friend class KeyboardMouseDevice;
126 const std::shared_ptr<InputDevice>& getInputDevice()
const {
return _inputDevice; }
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>() };
138 bool _isTouching =
false;
139 std::chrono::high_resolution_clock _clock;
140 std::chrono::high_resolution_clock::time_point _lastTouchTime;
142 static bool _enableTouch;
143 QPoint _lastWheelDelta;
144 QPoint _wheelDeltaRepeatCount;
147 void updateDeltaAxisValue(
int channel,
float value);