Skip to content

Commit 0be6e75

Browse files
committed
Handle touch event in scripting
1 parent ac2aad6 commit 0be6e75

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

src/core/src/scripting/scripting_api.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,29 @@ Error ScriptingAPI::mountGrowlScripts(API& api) {
9393
return err;
9494
}
9595

96+
auto input_touch_event_res = createClass("InputTouchEvent", false);
97+
if (!input_touch_event_res) {
98+
return std::move(input_touch_event_res.error());
99+
}
100+
auto& input_touch_event_cls = *input_touch_event_res;
101+
102+
if (auto err =
103+
input_touch_event_cls->addConstructor<const InputTouchEvent*>(
104+
[](ClassSelf* self, void* ctx,
105+
const std::vector<ScriptingParam>& args)
106+
-> Result<ScriptingParam> {
107+
auto event = static_cast<const InputTouchEvent*>(
108+
std::get<const void*>(args.at(0)));
109+
self->setField("type", (int)event->type);
110+
self->setField("touchX", (int)event->touchX);
111+
self->setField("touchY", (int)event->touchY);
112+
self->setField("id", (int)event->id);
113+
return ScriptingParam();
114+
},
115+
nullptr);
116+
err) {
117+
return err;
118+
}
119+
96120
return nullptr;
97121
}

src/scene/include/growl/scene/node.h

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class Node : public InputProcessor {
5454
bool onMouseEventRaw(const InputMouseEvent& event);
5555
virtual bool onKeyboardEvent(const InputKeyboardEvent& event) override;
5656
bool onKeyboardEventRaw(const InputKeyboardEvent& event);
57+
virtual bool onTouchEvent(const InputTouchEvent& event) override;
58+
bool onTouchEventRaw(const InputTouchEvent& event);
5759

5860
private:
5961
API* api;

src/scene/src/node.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,39 @@ bool Node::onKeyboardEvent(const InputKeyboardEvent& event) {
213213
bool Node::onKeyboardEventRaw(const InputKeyboardEvent& event) {
214214
return InputProcessor::onKeyboardEvent(event);
215215
}
216+
217+
bool Node::onTouchEvent(const InputTouchEvent& event) {
218+
if (!bound_script_obj) {
219+
return onTouchEventRaw(event);
220+
}
221+
222+
std::vector<ScriptingParam> ctor_args;
223+
ctor_args.push_back(&event);
224+
auto ctor_result =
225+
api->scripting().executeConstructor<const InputTouchEvent*>(
226+
"InputTouchEvent", ctor_args);
227+
if (!ctor_result) {
228+
api->system().log(
229+
LogLevel::Warn, "Node::onTouchEvent",
230+
"Failed to execute constructor: {}",
231+
ctor_result.error()->message());
232+
return false;
233+
}
234+
235+
std::vector<ScriptingParam> v;
236+
v.push_back(std::move(ctor_result.get()));
237+
auto exec_res =
238+
api->scripting().executeMethod<bool, std::unique_ptr<ScriptingRef>>(
239+
bound_script_obj.get(), "onTouchEvent", v);
240+
if (!exec_res) {
241+
api->system().log(
242+
LogLevel::Warn, "Node::onTouchEvent",
243+
"Failed to execute method: {}", exec_res.error()->message());
244+
return false;
245+
}
246+
return std::get<bool>(*exec_res);
247+
}
248+
249+
bool Node::onTouchEventRaw(const InputTouchEvent& event) {
250+
return InputProcessor::onTouchEvent(event);
251+
}

src/scene/src/scene.cpp

+46
Original file line numberDiff line numberDiff line change
@@ -300,5 +300,51 @@ Error Growl::initSceneGraph(API& api) {
300300
return err;
301301
}
302302

303+
if (auto err = node_cls->addMethod<bool, std::unique_ptr<ScriptingRef>>(
304+
"onTouchEvent",
305+
[](ClassSelf* self, void* ctx,
306+
const std::vector<ScriptingParam>& args)
307+
-> Result<ScriptingParam> {
308+
ScriptingAPI* scripting = static_cast<ScriptingAPI*>(ctx);
309+
Node* n =
310+
static_cast<Node*>(const_cast<void*>(std::get<const void*>(
311+
self->getField("__ptr", ScriptingType::Ptr))));
312+
auto& script_event =
313+
std::get<std::unique_ptr<ScriptingRef>>(args.at(0));
314+
InputTouchEvent event;
315+
if (auto res = scripting->getField(
316+
script_event.get(), "touchX", ScriptingType::Int);
317+
!res) {
318+
return std::move(res.error());
319+
} else {
320+
event.touchX = std::get<int>(res.get());
321+
}
322+
if (auto res = scripting->getField(
323+
script_event.get(), "touchY", ScriptingType::Int);
324+
!res) {
325+
return std::move(res.error());
326+
} else {
327+
event.touchY = std::get<int>(res.get());
328+
}
329+
if (auto res = scripting->getField(
330+
script_event.get(), "type", ScriptingType::Int);
331+
!res) {
332+
return std::move(res.error());
333+
} else {
334+
event.type = PointerEventType(std::get<int>(res.get()));
335+
}
336+
if (auto res = scripting->getField(
337+
script_event.get(), "id", ScriptingType::Int);
338+
!res) {
339+
return std::move(res.error());
340+
} else {
341+
event.id = std::get<int>(res.get());
342+
}
343+
return ScriptingParam(n->onTouchEventRaw(event));
344+
},
345+
&(api.scripting()))) {
346+
return err;
347+
}
348+
303349
return nullptr;
304350
}

0 commit comments

Comments
 (0)