Support addEventListener() when the wrapper handles signals

This commit is contained in:
Simon Edwards 2021-10-23 18:48:45 +02:00
parent 8ce6dde45b
commit fa52c674ef
4 changed files with 57 additions and 51 deletions

View File

@ -12,10 +12,10 @@
and every widget we export.
*/
#ifndef QOBJECT_WRAPPED_METHODS_DECLARATION
#define QOBJECT_WRAPPED_METHODS_DECLARATION \
#ifndef QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE
#define QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(source) \
\
EVENTWIDGET_WRAPPED_METHODS_DECLARATION \
EVENTWIDGET_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(source) \
\
Napi::Value inherits(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
@ -73,6 +73,11 @@
return env.Null(); \
}
#endif // QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE
#ifndef QOBJECT_WRAPPED_METHODS_DECLARATION
#define QOBJECT_WRAPPED_METHODS_DECLARATION \
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this->instance.data())
#endif // QOBJECT_WRAPPED_METHODS_DECLARATION
#ifndef QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE

View File

@ -10,7 +10,7 @@
class DLL_EXPORT QScreenWrap : public Napi::ObjectWrap<QScreenWrap>,
public EventWidget {
QOBJECT_WRAPPED_METHODS_DECLARATION
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this)
// Note: We don't use EVENTWIDGET_IMPLEMENTATIONS() here because this class
// doesn't handle any QEvents.

View File

@ -10,7 +10,7 @@
class DLL_EXPORT QWindowWrap : public Napi::ObjectWrap<QWindowWrap>,
public EventWidget {
QOBJECT_WRAPPED_METHODS_DECLARATION
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this)
// Note: We don't use EVENTWIDGET_IMPLEMENTATIONS() here because this class
// doesn't handle any QEvents.

View File

@ -33,54 +33,55 @@ struct InitHelper {
}
};
#ifndef EVENTWIDGET_WRAPPED_METHODS_DECLARATION
#define EVENTWIDGET_WRAPPED_METHODS_DECLARATION \
COMPONENT_WRAPPED_METHODS_DECLARATION \
Napi::Value initNodeEventEmitter(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
EventWidget* eventWidget = \
dynamic_cast<EventWidget*>(this->instance.data()); \
if (eventWidget) { \
eventWidget->emitOnNode = \
Napi::Persistent(info[0].As<Napi::Function>()); \
} \
InitHelper<std::remove_pointer<decltype(this->instance.data())>::type>:: \
connectSignalsToEventEmitter(this->instance.data()); \
return env.Null(); \
} \
Napi::Value getNodeEventEmitter(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
EventWidget* eventWidget = \
dynamic_cast<EventWidget*>(this->instance.data()); \
if (eventWidget && eventWidget->emitOnNode) { \
return eventWidget->emitOnNode.Value(); \
} else { \
return env.Null(); \
} \
} \
Napi::Value subscribeToQtEvent(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
Napi::String eventString = info[0].As<Napi::String>(); \
EventWidget* eventWidget = \
dynamic_cast<EventWidget*>(this->instance.data()); \
bool success = false; \
if (eventWidget) { \
eventWidget->subscribeToQtEvent(eventString.Utf8Value()); \
success = true; \
} \
return Napi::Boolean::New(env, success); \
} \
Napi::Value unSubscribeToQtEvent(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
Napi::String eventString = info[0].As<Napi::String>(); \
EventWidget* eventWidget = \
dynamic_cast<EventWidget*>(this->instance.data()); \
if (eventWidget) { \
eventWidget->unSubscribeToQtEvent(eventString.Utf8Value()); \
} \
return env.Null(); \
#ifndef EVENTWIDGET_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE
#define EVENTWIDGET_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(source) \
COMPONENT_WRAPPED_METHODS_DECLARATION \
Napi::Value initNodeEventEmitter(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
EventWidget* eventWidget = dynamic_cast<EventWidget*>(source); \
if (eventWidget) { \
eventWidget->emitOnNode = \
Napi::Persistent(info[0].As<Napi::Function>()); \
} \
InitHelper<std::remove_pointer<decltype(source)>::type>:: \
connectSignalsToEventEmitter(source); \
return env.Null(); \
} \
Napi::Value getNodeEventEmitter(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
EventWidget* eventWidget = dynamic_cast<EventWidget*>(source); \
if (eventWidget && eventWidget->emitOnNode) { \
return eventWidget->emitOnNode.Value(); \
} else { \
return env.Null(); \
} \
} \
Napi::Value subscribeToQtEvent(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
Napi::String eventString = info[0].As<Napi::String>(); \
EventWidget* eventWidget = dynamic_cast<EventWidget*>(source); \
bool success = false; \
if (eventWidget) { \
eventWidget->subscribeToQtEvent(eventString.Utf8Value()); \
success = true; \
} \
return Napi::Boolean::New(env, success); \
} \
Napi::Value unSubscribeToQtEvent(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
Napi::String eventString = info[0].As<Napi::String>(); \
EventWidget* eventWidget = dynamic_cast<EventWidget*>(source); \
if (eventWidget) { \
eventWidget->unSubscribeToQtEvent(eventString.Utf8Value()); \
} \
return env.Null(); \
}
#endif // EVENTWIDGET_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE
#ifndef EVENTWIDGET_WRAPPED_METHODS_DECLARATION
#define EVENTWIDGET_WRAPPED_METHODS_DECLARATION \
EVENTWIDGET_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE( \
this->instance.data())
#endif // EVENTWIDGET_WRAPPED_METHODS_DECLARATION
#ifndef EVENTWIDGET_WRAPPED_METHODS_EXPORT_DEFINE