-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathMouseAdapter.h
67 lines (51 loc) · 1.81 KB
/
MouseAdapter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#pragma once
#include <memory>
#include <functional>
#include <vector>
#include <unordered_map>
#include <QMouseEvent>
#include "PipedEventAdapter.h"
#include "Core/geometry/Vector2.h"
#include "Core/util/WeakPointer.h"
class MouseAdapter {
public:
enum class MouseEventType {
ButtonPress = 0,
ButtonRelease = 1,
ButtonClick = 2,
MouseMove = 3,
WheelScroll = 4
};
class MouseEvent {
public:
MouseEvent(MouseEventType type): type(type) {}
MouseEventType getType() {return type;}
Core::UInt32 buttons;
Core::Vector2i position;
Core::Real scrollDelta;
private:
MouseEventType type;
};
using ButtonEventCallback = std::function<void(MouseEventType, Core::UInt32, Core::UInt32, Core::UInt32)>;
using MoveEventCallback = std::function<void(Core::UInt32, Core::UInt32)>;
MouseAdapter();
bool processEvent(QObject* obj, QEvent* event);
bool setPipedEventAdapter(Core::WeakPointer<PipedEventAdapter<MouseEvent>> adapter);
void onMouseMoved(MoveEventCallback callback);
void onMouseButtonPressed(ButtonEventCallback callback);
void onMouseButtonReleased(ButtonEventCallback callback);
void onMouseButtonClicked(ButtonEventCallback callback);
private:
class MouseButtonStatus {
public:
bool pressed;
Core::Vector2i pressedLocation;
};
static const unsigned int MAX_BUTTONS = 16;
MouseButtonStatus buttonStatuses[MAX_BUTTONS];
unsigned int pressedButtonMask = 0;
static unsigned int getMouseButtonIndex(const Qt::MouseButton& button);
Core::WeakPointer<PipedEventAdapter<MouseEvent>> pipedEventAdapter;
std::unordered_map<Core::UInt32, std::vector<ButtonEventCallback>> buttonEventCallbacks;
std::vector<MoveEventCallback> moveEventCallbacks;
};