Add QWidget.setParent()

This commit is contained in:
Simon Edwards 2021-12-09 21:46:10 +01:00
parent e653c3ad1d
commit 47b3d514bb
7 changed files with 64 additions and 3 deletions

View File

@ -69,13 +69,34 @@
Napi::Env env = info.Env(); \
this->instance->dumpObjectInfo(); \
return env.Null(); \
} \
Napi::Value __external_qobject__(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
return Napi::External<QObject>::New(env, static_cast<QObject *>(this->instance)); \
}
// Ideally this macro below should go in
// QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE but some wrappers
// need their own setParent()` implementation which handles different
// arguments.
#define QOBJECT_SET_PARENT_IMPL \
Napi::Value setParent(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
if (info[0].IsNull()) { \
this->instance->setParent(nullptr); \
} else { \
QObject* parentObject = info[0].As<Napi::External<QObject>>().Data(); \
this->instance->setParent(parentObject); \
} \
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())
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this->instance.data()) \
QOBJECT_SET_PARENT_IMPL
#endif // QOBJECT_WRAPPED_METHODS_DECLARATION
#ifndef QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE
@ -84,13 +105,15 @@
EVENTWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \
\
InstanceMethod("__id__", &ComponentWrapName::__id__), \
InstanceMethod("__external_qobject__", &ComponentWrapName::__external_qobject__), \
InstanceMethod("inherits", &ComponentWrapName::inherits), \
InstanceMethod("setProperty", &ComponentWrapName::setProperty), \
InstanceMethod("property", &ComponentWrapName::property), \
InstanceMethod("setObjectName", &ComponentWrapName::setObjectName), \
InstanceMethod("objectName", &ComponentWrapName::objectName), \
InstanceMethod("dumpObjectTree", &ComponentWrapName::dumpObjectTree), \
InstanceMethod("dumpObjectInfo", &ComponentWrapName::dumpObjectInfo),
InstanceMethod("dumpObjectInfo", &ComponentWrapName::dumpObjectInfo), \
InstanceMethod("setParent", &ComponentWrapName::setParent),
#endif // QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE
@ -109,3 +132,5 @@
#ifndef QOBJECT_SIGNALS
#define QOBJECT_SIGNALS QOBJECT_SIGNALS_ON_TARGET(this)
#endif // QOBJECT_SIGNALS
#include "QtCore/QObject/qobject_wrap.h"

View File

@ -13,6 +13,7 @@ class DLL_EXPORT QClipboardWrap : public Napi::ObjectWrap<QClipboardWrap>,
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this)
// Note: We don't use EVENTWIDGET_IMPLEMENTATIONS() here because this class
// doesn't handle any QEvents.
QOBJECT_SET_PARENT_IMPL
private:
QPointer<QClipboard> instance;

View File

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

View File

@ -14,6 +14,17 @@ class DLL_EXPORT QWindowWrap : public Napi::ObjectWrap<QWindowWrap>,
// Note: We don't use EVENTWIDGET_IMPLEMENTATIONS() here because this class
// doesn't handle any QEvents.
// `QWindow` has a special setParent() which only accepts `QWindow`s
Napi::Value setParent(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
QObject* parentObject = info[0].As<Napi::External<QObject>>().Data();
QWindow* parentWindow = qobject_cast<QWindow*>(parentObject);
if (parentWindow) {
this->instance->setParent(parentWindow);
}
return env.Null();
}
private:
QPointer<QWindow> instance;

View File

@ -25,9 +25,22 @@
#ifndef QWIDGET_WRAPPED_METHODS_DECLARATION
#define QWIDGET_WRAPPED_METHODS_DECLARATION \
\
QOBJECT_WRAPPED_METHODS_DECLARATION \
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this->instance.data()) \
YOGAWIDGET_WRAPPED_METHODS_DECLARATION \
\
Napi::Value setParent(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
if (info[0].IsNull()) { \
this->instance->setParent(nullptr); \
} else { \
QObject* parentObject = info[0].As<Napi::External<QObject>>().Data(); \
QWidget* parentWidget = qobject_cast<QWidget*>(parentObject); \
if (parentWidget) { \
this->instance->setParent(parentWidget); \
} \
} \
return env.Null(); \
} \
Napi::Value show(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->show(); \

View File

@ -12,6 +12,7 @@ class DLL_EXPORT CacheTestQObjectWrap
: public Napi::ObjectWrap<CacheTestQObjectWrap>,
public EventWidget {
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this)
QOBJECT_SET_PARENT_IMPL
private:
QPointer<CacheTestQObject> instance;

View File

@ -27,6 +27,14 @@ export abstract class NodeObject<Signals extends QObjectSignals> extends EventWi
dumpObjectInfo(): void {
this.native.dumpObjectInfo();
}
setParent(parent: NodeObject<QObjectSignals>): void {
if (parent != null) {
const extern = parent.native.__external_qobject__();
this.native.setParent(extern);
} else {
this.native.setParent(null);
}
}
}
export interface QObjectSignals {