Pass env to WrapperCache::get()

This commit is contained in:
Simon Edwards 2021-10-31 17:02:43 +01:00
parent 2b2d2a65b2
commit f7f86d5cfa
6 changed files with 25 additions and 22 deletions

View File

@ -6,6 +6,7 @@
#include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h"
#include "QtGui/QScreen/qscreen_wrap.h"
#include "core/WrapperCache/wrappercache.h"
#include "napi.h"
class DLL_EXPORT NApplication : public QApplication, public EventWidget {
@ -28,8 +29,8 @@ class DLL_EXPORT NApplication : public QApplication, public EventWidget {
this, &QGuiApplication::primaryScreenChanged, [=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
auto instance = QScreenWrap::constructor.New(
{Napi::External<QScreen>::New(env, screen)});
auto instance =
WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
this->emitOnNode.Call(
{Napi::String::New(env, "primaryScreenChanged"), instance});
});
@ -37,19 +38,19 @@ class DLL_EXPORT NApplication : public QApplication, public EventWidget {
QObject::connect(this, &QGuiApplication::screenAdded, [=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
auto instance = QScreenWrap::constructor.New(
{Napi::External<QScreen>::New(env, screen)});
auto instance =
WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
this->emitOnNode.Call({Napi::String::New(env, "screenAdded"), instance});
});
QObject::connect(this, &QGuiApplication::screenRemoved,
[=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
auto instance = QScreenWrap::constructor.New(
{Napi::External<QScreen>::New(env, screen)});
this->emitOnNode.Call(
{Napi::String::New(env, "screenRemoved"), instance});
});
QObject::connect(
this, &QGuiApplication::screenRemoved, [=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
auto instance =
WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
this->emitOnNode.Call(
{Napi::String::New(env, "screenRemoved"), instance});
});
}
};

View File

@ -545,7 +545,7 @@
Napi::HandleScope scope(env); \
QWindow* window = this->instance->windowHandle(); \
if (window) { \
return WrapperCache::instance.get<QWindow, QWindowWrap>(info, window); \
return WrapperCache::instance.get<QWindow, QWindowWrap>(env, window); \
} else { \
return env.Null(); \
} \

View File

@ -39,13 +39,12 @@ class DLL_EXPORT WrapperCache : public QObject {
* e.g. `QScreen`.
* @param W - (template argument) The wrapper type which matches the object
* `QScreenWrap`.
* @param env = Napi environment
* @param object - Pointer to the QObject for which a wrapper is required.
* @return The JS wrapper object.
*/
template <class T, class W>
Napi::Object get(const Napi::CallbackInfo& info, T* object) {
Napi::Env env = info.Env();
Napi::Object get(Napi::Env env, T* object) {
if (this->cache.contains(object)) {
napi_value result = nullptr;
napi_get_reference_value(this->cache[object].env, this->cache[object].ref,

View File

@ -176,7 +176,7 @@ Napi::Value StaticQApplicationWrapMethods::primaryScreen(
Napi::HandleScope scope(env);
auto screen = QApplication::primaryScreen();
if (screen) {
return WrapperCache::instance.get<QScreen, QScreenWrap>(info, screen);
return WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
} else {
return env.Null();
}
@ -192,7 +192,7 @@ Napi::Value StaticQApplicationWrapMethods::screens(
for (int i = 0; i < screens.size(); i++) {
QScreen* screen = screens[i];
auto instance =
WrapperCache::instance.get<QScreen, QScreenWrap>(info, screen);
WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
jsArray[i] = instance;
}
return jsArray;

View File

@ -40,7 +40,10 @@ void QWindowWrap::connectSignalsToEventEmitter() {
this->instance.data(), &QWindow::screenChanged, [=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
this->emitOnNode.Call({Napi::String::New(env, "screenChanged")});
auto instance =
WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
this->emitOnNode.Call(
{Napi::String::New(env, "screenChanged"), instance});
});
}
@ -50,7 +53,7 @@ Napi::Value QWindowWrap::screen(const Napi::CallbackInfo& info) {
QScreen* screen = this->instance->screen();
if (screen) {
return WrapperCache::instance.get<QScreen, QScreenWrap>(info, screen);
return WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
} else {
return env.Null();
}

View File

@ -22,5 +22,5 @@ export class QWindow extends NodeObject<QWindowSignals> {
}
export interface QWindowSignals extends QObjectSignals {
screenChanged: () => void;
screenChanged: (screen: QScreen) => void;
}