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

View File

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

View File

@ -39,13 +39,12 @@ class DLL_EXPORT WrapperCache : public QObject {
* e.g. `QScreen`. * e.g. `QScreen`.
* @param W - (template argument) The wrapper type which matches the object * @param W - (template argument) The wrapper type which matches the object
* `QScreenWrap`. * `QScreenWrap`.
* @param env = Napi environment
* @param object - Pointer to the QObject for which a wrapper is required. * @param object - Pointer to the QObject for which a wrapper is required.
* @return The JS wrapper object. * @return The JS wrapper object.
*/ */
template <class T, class W> template <class T, class W>
Napi::Object get(const Napi::CallbackInfo& info, T* object) { Napi::Object get(Napi::Env env, T* object) {
Napi::Env env = info.Env();
if (this->cache.contains(object)) { if (this->cache.contains(object)) {
napi_value result = nullptr; napi_value result = nullptr;
napi_get_reference_value(this->cache[object].env, this->cache[object].ref, 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); Napi::HandleScope scope(env);
auto screen = QApplication::primaryScreen(); auto screen = QApplication::primaryScreen();
if (screen) { if (screen) {
return WrapperCache::instance.get<QScreen, QScreenWrap>(info, screen); return WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
} else { } else {
return env.Null(); return env.Null();
} }
@ -192,7 +192,7 @@ Napi::Value StaticQApplicationWrapMethods::screens(
for (int i = 0; i < screens.size(); i++) { for (int i = 0; i < screens.size(); i++) {
QScreen* screen = screens[i]; QScreen* screen = screens[i];
auto instance = auto instance =
WrapperCache::instance.get<QScreen, QScreenWrap>(info, screen); WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
jsArray[i] = instance; jsArray[i] = instance;
} }
return jsArray; return jsArray;

View File

@ -40,7 +40,10 @@ void QWindowWrap::connectSignalsToEventEmitter() {
this->instance.data(), &QWindow::screenChanged, [=](QScreen* screen) { this->instance.data(), &QWindow::screenChanged, [=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env(); Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(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(); QScreen* screen = this->instance->screen();
if (screen) { if (screen) {
return WrapperCache::instance.get<QScreen, QScreenWrap>(info, screen); return WrapperCache::instance.get<QScreen, QScreenWrap>(env, screen);
} else { } else {
return env.Null(); return env.Null();
} }

View File

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