-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAPI.hpp
226 lines (180 loc) · 6.04 KB
/
API.hpp
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#pragma once
#include <Geode/Loader.hpp>
#include <cocos2d.h>
#include <Geode/Utils.hpp>
#ifdef GEODE_IS_WINDOWS
#ifdef GEODE_MOUSEAPI_EXPORTING
#define MOUSEAPI_DLL __declspec(dllexport)
#else
#define MOUSEAPI_DLL __declspec(dllimport)
#endif
#else
#define MOUSEAPI_DLL
#endif
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4275)
#endif
struct CCEGLViewModify;
struct CCTouchDispatcherModify;
class MouseEventListenerPool;
namespace mouse {
enum class MouseButton {
Left = 0,
Right = 1,
Middle = 2,
Back = 3,
Forward = 4,
};
enum class MouseResult {
Swallow = 2,
Eat = 1,
Leave = 0,
};
static cocos2d::ccTouchType CCTOUCHOTHER =
static_cast<cocos2d::ccTouchType>(85);
class Mouse;
class MouseEventFilter;
class MOUSEAPI_DLL MouseAttributes : public cocos2d::CCObject {
protected:
cocos2d::CCNode* m_node;
public:
static MouseAttributes* from(cocos2d::CCNode* node);
bool isHeld(MouseButton button) const;
bool isHovered() const;
void addHeld(MouseButton button);
void removeHeld(MouseButton button);
void clearHeld();
void setHovered(bool hovered);
};
class MOUSEAPI_DLL MouseEvent : public geode::Event {
protected:
bool m_swallow = false;
cocos2d::CCNode* m_target;
cocos2d::CCPoint m_position;
MouseEvent(
cocos2d::CCNode* target,
cocos2d::CCPoint const& position
);
void swallow();
void updateTouch(cocos2d::CCTouch* touch) const;
virtual void dispatchDefault(cocos2d::CCNode* target, cocos2d::CCTouch* touch) const = 0;
geode::EventListenerPool* getPool() const override;
friend class MouseEventFilter;
friend struct ::CCTouchDispatcherModify;
friend class ::MouseEventListenerPool;
public:
bool isSwallowed() const;
cocos2d::CCPoint getPosition() const;
cocos2d::CCNode* getTarget() const;
cocos2d::CCTouch* createTouch() const;
cocos2d::CCEvent* createEvent() const;
using Filter = MouseEventFilter;
};
class MOUSEAPI_DLL MouseClickEvent : public MouseEvent {
protected:
MouseButton m_button;
bool m_down;
void dispatchDefault(cocos2d::CCNode* target, cocos2d::CCTouch* touch) const override;
public:
MouseClickEvent(
MouseButton button,
bool down,
cocos2d::CCPoint const& position
);
MouseClickEvent(
cocos2d::CCNode* target, MouseButton button,
bool down,
cocos2d::CCPoint const& position
);
MouseButton getButton() const;
bool isDown() const;
};
class MOUSEAPI_DLL MouseMoveEvent : public MouseEvent {
protected:
void dispatchDefault(cocos2d::CCNode* target, cocos2d::CCTouch* touch) const override;
public:
MouseMoveEvent(
cocos2d::CCPoint const& position
);
MouseMoveEvent(
cocos2d::CCNode* target,
cocos2d::CCPoint const& position
);
};
class MOUSEAPI_DLL MouseScrollEvent : public MouseEvent {
protected:
float m_deltaY;
float m_deltaX;
void dispatchDefault(cocos2d::CCNode* target, cocos2d::CCTouch* touch) const override;
public:
MouseScrollEvent(
float deltaY, float deltaX,
cocos2d::CCPoint const& position
);
MouseScrollEvent(
cocos2d::CCNode* target,
float deltaY, float deltaX,
cocos2d::CCPoint const& position
);
float getDeltaY() const;
float getDeltaX() const;
};
class MOUSEAPI_DLL MouseHoverEvent : public MouseEvent {
protected:
bool m_enter;
void dispatchDefault(cocos2d::CCNode* target, cocos2d::CCTouch* touch) const override;
public:
MouseHoverEvent(
cocos2d::CCNode* target, bool enter,
cocos2d::CCPoint const& position
);
bool isEnter() const;
bool isLeave() const;
};
class MOUSEAPI_DLL MouseEventFilter : public geode::EventFilter<MouseEvent> {
protected:
cocos2d::CCNode* m_target;
geode::Ref<cocos2d::CCTouch> m_eaten = nullptr;
bool m_ignorePosition = false;
size_t m_filterIndex = 0;
public:
using Callback = MouseResult(MouseEvent*);
geode::ListenerResult handle(geode::utils::MiniFunction<Callback> fn, MouseEvent* event);
geode::EventListenerPool* getPool() const;
/**
* @warning The target is not retained, make sure it's valid for the
* entire lifetime of the filter!
*/
MouseEventFilter(cocos2d::CCNode* target, bool ignorePosition = false);
MouseEventFilter(MouseEventFilter const&) = default;
virtual ~MouseEventFilter();
cocos2d::CCNode* getTarget() const;
std::vector<int> getTargetPriority() const;
size_t getFilterIndex() const;
};
class MOUSEAPI_DLL Mouse {
public:
// i'm not gonna bother with friending an objc class
std::unordered_set<MouseButton> m_heldButtons;
protected:
static inline std::atomic_bool s_updating = false;
friend struct ::CCEGLViewModify;
public:
static Mouse* get();
geode::EventListener<MouseEventFilter>* getCapturing() const;
cocos2d::CCNode* getCapturingNode() const;
void capture(geode::EventListener<MouseEventFilter>* listener);
void release(geode::EventListener<MouseEventFilter>* listener);
bool isHeld(MouseButton button) const;
static void updateListeners();
};
}
template <>
struct json::Serialize<mouse::MouseButton> {
static json::Value MOUSEAPI_DLL to_json(mouse::MouseButton const& button);
static mouse::MouseButton MOUSEAPI_DLL from_json(json::Value const& button);
};
#ifdef _MSC_VER
#pragma warning(pop)
#endif