diff --git a/src/cpp/include/nodegui/QtCore/QObject/qobject_macro.h b/src/cpp/include/nodegui/QtCore/QObject/qobject_macro.h index 1072f2519..298c8da05 100644 --- a/src/cpp/include/nodegui/QtCore/QObject/qobject_macro.h +++ b/src/cpp/include/nodegui/QtCore/QObject/qobject_macro.h @@ -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::New(env, static_cast(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>().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" diff --git a/src/cpp/include/nodegui/QtGui/QClipboard/qclipboard_wrap.h b/src/cpp/include/nodegui/QtGui/QClipboard/qclipboard_wrap.h index 27d9b95c3..3c4cc9cc2 100644 --- a/src/cpp/include/nodegui/QtGui/QClipboard/qclipboard_wrap.h +++ b/src/cpp/include/nodegui/QtGui/QClipboard/qclipboard_wrap.h @@ -13,6 +13,7 @@ class DLL_EXPORT QClipboardWrap : public Napi::ObjectWrap, 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 instance; diff --git a/src/cpp/include/nodegui/QtGui/QScreen/qscreen_wrap.h b/src/cpp/include/nodegui/QtGui/QScreen/qscreen_wrap.h index 68b77a714..a26898fb7 100644 --- a/src/cpp/include/nodegui/QtGui/QScreen/qscreen_wrap.h +++ b/src/cpp/include/nodegui/QtGui/QScreen/qscreen_wrap.h @@ -11,6 +11,8 @@ class DLL_EXPORT QScreenWrap : public Napi::ObjectWrap, 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. diff --git a/src/cpp/include/nodegui/QtGui/QWindow/qwindow_wrap.h b/src/cpp/include/nodegui/QtGui/QWindow/qwindow_wrap.h index ccbdb2594..3576d5c92 100644 --- a/src/cpp/include/nodegui/QtGui/QWindow/qwindow_wrap.h +++ b/src/cpp/include/nodegui/QtGui/QWindow/qwindow_wrap.h @@ -14,6 +14,17 @@ class DLL_EXPORT QWindowWrap : public Napi::ObjectWrap, // 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>().Data(); + QWindow* parentWindow = qobject_cast(parentObject); + if (parentWindow) { + this->instance->setParent(parentWindow); + } + return env.Null(); + } + private: QPointer instance; diff --git a/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h b/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h index 3017dd9fc..9646f33d6 100644 --- a/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h +++ b/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h @@ -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>().Data(); \ + QWidget* parentWidget = qobject_cast(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(); \ diff --git a/src/cpp/include/nodegui/test/cachetestqobject_wrap.h b/src/cpp/include/nodegui/test/cachetestqobject_wrap.h index f888a7a36..b16847bb4 100644 --- a/src/cpp/include/nodegui/test/cachetestqobject_wrap.h +++ b/src/cpp/include/nodegui/test/cachetestqobject_wrap.h @@ -12,6 +12,7 @@ class DLL_EXPORT CacheTestQObjectWrap : public Napi::ObjectWrap, public EventWidget { QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this) + QOBJECT_SET_PARENT_IMPL private: QPointer instance; diff --git a/src/lib/QtCore/QObject.ts b/src/lib/QtCore/QObject.ts index 1c91f4de0..18ddd8097 100644 --- a/src/lib/QtCore/QObject.ts +++ b/src/lib/QtCore/QObject.ts @@ -27,6 +27,14 @@ export abstract class NodeObject extends EventWi dumpObjectInfo(): void { this.native.dumpObjectInfo(); } + setParent(parent: NodeObject): void { + if (parent != null) { + const extern = parent.native.__external_qobject__(); + this.native.setParent(extern); + } else { + this.native.setParent(null); + } + } } export interface QObjectSignals {