From 2aeda4a556e19bb10fe1514d7833457feb778d3b Mon Sep 17 00:00:00 2001 From: Atul R Date: Thu, 6 Jun 2019 08:20:47 +0200 Subject: [PATCH] Adds supprt for getting flex nodes from c++ side --- config/application.gypi | 2 + demo.ts | 5 ++ src/cpp/QtWidgets/QLabel/qlabel_wrap.cpp | 11 ++++ src/cpp/QtWidgets/QLabel/qlabel_wrap.h | 1 + src/cpp/core/FlexLayout/flexlayout.cpp | 4 +- src/cpp/core/FlexLayout/flexlayout.h | 2 +- src/cpp/core/FlexLayout/flexlayout_wrap.cpp | 60 +++++++++++++++++++++ src/cpp/core/FlexLayout/flexlayout_wrap.h | 23 ++++++++ src/cpp/core/FlexLayout/flexnode_wrap.cpp | 31 +++++++++++ src/cpp/core/FlexLayout/flexnode_wrap.h | 19 +++++++ src/cpp/main.cpp | 6 ++- src/lib/QtWidgets/FlexLayout/index.ts | 11 ++++ src/lib/QtWidgets/QLabel/index.ts | 5 ++ src/lib/core/FlexLayout/FlexNode/index.ts | 12 +++++ 14 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 src/cpp/core/FlexLayout/flexlayout_wrap.cpp create mode 100644 src/cpp/core/FlexLayout/flexlayout_wrap.h create mode 100644 src/cpp/core/FlexLayout/flexnode_wrap.cpp create mode 100644 src/cpp/core/FlexLayout/flexnode_wrap.h create mode 100644 src/lib/QtWidgets/FlexLayout/index.ts create mode 100644 src/lib/core/FlexLayout/FlexNode/index.ts diff --git a/config/application.gypi b/config/application.gypi index 76aa0ee1d..032ffe23c 100644 --- a/config/application.gypi +++ b/config/application.gypi @@ -17,6 +17,8 @@ # wrapped cpps "../src/cpp/QtGui/QApplication/qapplication_wrap.cpp", "../src/cpp/QtGui/QWidget/qwidget_wrap.cpp", + '../src/cpp/core/FlexLayout/flexnode_wrap.cpp', + '../src/cpp/core/FlexLayout/flexlayout_wrap.cpp', "../src/cpp/QtWidgets/QGridLayout/qgridlayout_wrap.cpp", "../src/cpp/QtWidgets/QLabel/nlabel.cpp", "../src/cpp/QtWidgets/QLabel/qlabel_wrap.cpp", diff --git a/demo.ts b/demo.ts index e9754232e..dcd276c7b 100644 --- a/demo.ts +++ b/demo.ts @@ -7,6 +7,7 @@ import { QCheckBox } from "./src/lib/QtWidgets/QCheckBox"; import { QProgressBar } from "./src/lib/QtWidgets/QProgressBar"; import { QRadioButton } from "./src/lib/QtWidgets/QRadioButton"; import { QLineEdit } from "./src/lib/QtWidgets/QLineEdit"; +import { FlexLayout } from "./src/lib/QtWidgets/FlexLayout"; const win = new QMainWindow(); const view = new QWidget(); @@ -19,6 +20,10 @@ label.setText("Testing1234"); const label2 = new QLabel(); label2.setText("Hello12321"); label2.setStyleSheet("background-color:blue; color:white;"); +const label2FlexNode = label2.getFlexNode(); +label2FlexNode.debugValue(); +const flayout = new FlexLayout(); +flayout.addWidget(label2, label2FlexNode); const button1 = new QPushButton(); button1.setText("Yolo"); diff --git a/src/cpp/QtWidgets/QLabel/qlabel_wrap.cpp b/src/cpp/QtWidgets/QLabel/qlabel_wrap.cpp index e072d5f26..7877860a6 100644 --- a/src/cpp/QtWidgets/QLabel/qlabel_wrap.cpp +++ b/src/cpp/QtWidgets/QLabel/qlabel_wrap.cpp @@ -1,6 +1,7 @@ #include "qlabel_wrap.h" #include "src/cpp/QtGui/QWidget/qwidget_wrap.h" #include "src/cpp/Extras/Utils/utils.h" +#include "src/cpp/core/FlexLayout/flexnode_wrap.h" #include @@ -12,6 +13,7 @@ Napi::Object QLabelWrap::init(Napi::Env env, Napi::Object exports) { Napi::Function func = DefineClass(env, CLASSNAME, { InstanceMethod("setWordWrap", &QLabelWrap::setWordWrap), InstanceMethod("setText", &QLabelWrap::setText), + InstanceMethod("getFlexNode", &QLabelWrap::getFlexNode), QWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(QLabelWrap) }); constructor = Napi::Persistent(func); @@ -67,3 +69,12 @@ Napi::Value QLabelWrap::setText(const Napi::CallbackInfo& info) { return env.Null(); } + + Napi::Value QLabelWrap::getFlexNode(const Napi::CallbackInfo& info) { + Napi::EscapableHandleScope scope(info.Env()); + Napi::Value arg = info[0]; + Napi::Object flexNodeObject = FlexNodeWrap::constructor.New({ arg }); + FlexNodeWrap* flexNodeWrap = FlexNodeWrap::Unwrap(flexNodeObject); + flexNodeWrap->instance = this->instance->getFlexNode(); + return scope.Escape(napi_value(flexNodeObject)).ToObject(); + } diff --git a/src/cpp/QtWidgets/QLabel/qlabel_wrap.h b/src/cpp/QtWidgets/QLabel/qlabel_wrap.h index e34ee9ec5..5cee0f620 100644 --- a/src/cpp/QtWidgets/QLabel/qlabel_wrap.h +++ b/src/cpp/QtWidgets/QLabel/qlabel_wrap.h @@ -17,6 +17,7 @@ class QLabelWrap : public Napi::ObjectWrap{ //wrapped methods Napi::Value setWordWrap(const Napi::CallbackInfo& info); Napi::Value setText(const Napi::CallbackInfo& info); + Napi::Value getFlexNode(const Napi::CallbackInfo& info); QWIDGET_WRAPPED_METHODS_DECLARATION }; diff --git a/src/cpp/core/FlexLayout/flexlayout.cpp b/src/cpp/core/FlexLayout/flexlayout.cpp index 5e6b5f375..456262d96 100644 --- a/src/cpp/core/FlexLayout/flexlayout.cpp +++ b/src/cpp/core/FlexLayout/flexlayout.cpp @@ -85,7 +85,7 @@ int FlexLayout::count() const void FlexLayout::addWidget(QWidget* childWidget, YGNodeRef childNode) { if(!this->node){ - qDebug()<<"Flex layout's parent yoga node not set yet. Child widget will not be added to Flex Layout"; + qDebug()<<"Flex layout's parent yoga node not set yet. Set it using setFlexNode. Child widget will not be added to Flex Layout"; return; } uint count = YGNodeGetChildCount(this->node); @@ -129,7 +129,7 @@ void FlexLayout::setGeometry(const QRect &rect) QLayout::setGeometry(rect); } -void FlexLayout::setYogaNode(YGNodeRef parentNode) +void FlexLayout::setFlexNode(YGNodeRef parentNode) { this->node = parentNode; } diff --git a/src/cpp/core/FlexLayout/flexlayout.h b/src/cpp/core/FlexLayout/flexlayout.h index 30e4e566c..8bda47770 100644 --- a/src/cpp/core/FlexLayout/flexlayout.h +++ b/src/cpp/core/FlexLayout/flexlayout.h @@ -27,7 +27,7 @@ public: int count() const override; void addWidget(QWidget* childWidget, YGNodeRef childNode); void setGeometry(const QRect &rect) override; - void setYogaNode(YGNodeRef parentNode); + void setFlexNode(YGNodeRef parentNode); }; #endif // FLEXLAYOUT_H diff --git a/src/cpp/core/FlexLayout/flexlayout_wrap.cpp b/src/cpp/core/FlexLayout/flexlayout_wrap.cpp new file mode 100644 index 000000000..6b1fec8d1 --- /dev/null +++ b/src/cpp/core/FlexLayout/flexlayout_wrap.cpp @@ -0,0 +1,60 @@ +#include "flexlayout_wrap.h" +#include "flexnode_wrap.h" +#include "src/cpp/QtGui/QWidget/qwidget_wrap.h" +#include "src/cpp/Extras/Utils/utils.h" +#include + +Napi::FunctionReference FlexLayoutWrap::constructor; + +Napi::Object FlexLayoutWrap::init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + char CLASSNAME[] = "FlexLayout"; + Napi::Function func = DefineClass(env, CLASSNAME, { + InstanceMethod("addWidget", &FlexLayoutWrap::addWidget), + // InstanceMethod("setFlexNode", &FlexLayoutWrap::setFlexNode) + }); + constructor = Napi::Persistent(func); + exports.Set(CLASSNAME, func); + return exports; +} + +FlexLayout* FlexLayoutWrap::getInternalInstance() { + return this->instance; +} + +FlexLayoutWrap::FlexLayoutWrap(const Napi::CallbackInfo& info): Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + if(info.Length() == 2) { + Napi::Object object_parent = info[0].As(); + QWidgetWrap* w_parent = Napi::ObjectWrap::Unwrap(object_parent); + this->instance = new FlexLayout(w_parent->getInternalInstance()); + } else if(info.Length() == 1) { + Napi::Object object_parent = info[0].As(); + QWidgetWrap* w_parent = Napi::ObjectWrap::Unwrap(object_parent); + this->instance = new FlexLayout(w_parent->getInternalInstance()); //this sets the parent to current widget + }else if (info.Length() == 0){ + this->instance = new FlexLayout(); + }else { + extrautils::throwTypeError(env, "Wrong number of arguments"); + } +} + +FlexLayoutWrap::~FlexLayoutWrap() { + delete this->instance; +} + +Napi::Value FlexLayoutWrap::addWidget(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + Napi::Object qwidgetObject = info[0].As(); + Napi::Object childFlexNodeObject = info[1].As(); + QWidgetWrap* widget = Napi::ObjectWrap::Unwrap(qwidgetObject); + FlexNodeWrap* childFlexNodeWrap = Napi::ObjectWrap::Unwrap(childFlexNodeObject); + this->instance->addWidget(widget->getInternalInstance(),childFlexNodeWrap->getInternalInstance()); + + return env.Null(); +} + diff --git a/src/cpp/core/FlexLayout/flexlayout_wrap.h b/src/cpp/core/FlexLayout/flexlayout_wrap.h new file mode 100644 index 000000000..62a4ae21a --- /dev/null +++ b/src/cpp/core/FlexLayout/flexlayout_wrap.h @@ -0,0 +1,23 @@ +#ifndef FLEXLAYOUT_WRAP_H +#define FLEXLAYOUT_WRAP_H + +#include +#include "flexlayout.h" + +class FlexLayoutWrap : public Napi::ObjectWrap{ + private: + FlexLayout* instance; + + public: + static Napi::Object init(Napi::Env env, Napi::Object exports); + FlexLayoutWrap(const Napi::CallbackInfo& info); + ~FlexLayoutWrap(); + FlexLayout* getInternalInstance(); + //class constructor + static Napi::FunctionReference constructor; + //wrapped methods + Napi::Value addWidget(const Napi::CallbackInfo& info); + // Napi::Value setFlexNode(const Napi::CallbackInfo& info); +}; + +#endif //FLEXLAYOUT_WRAP_H \ No newline at end of file diff --git a/src/cpp/core/FlexLayout/flexnode_wrap.cpp b/src/cpp/core/FlexLayout/flexnode_wrap.cpp new file mode 100644 index 000000000..7437a9d4f --- /dev/null +++ b/src/cpp/core/FlexLayout/flexnode_wrap.cpp @@ -0,0 +1,31 @@ +#include "flexnode_wrap.h" +#include + +Napi::FunctionReference FlexNodeWrap::constructor; + +void FlexNodeWrap::init(Napi::Env env) { + Napi::HandleScope scope(env); + char CLASSNAME[] = "FlexNode"; + Napi::Function func = DefineClass(env, CLASSNAME, { + InstanceMethod("debugValue", &FlexNodeWrap::printValue), + }); + constructor = Napi::Persistent(func); +} + +YGNodeRef FlexNodeWrap::getInternalInstance() { + return this->instance; +} + +FlexNodeWrap::FlexNodeWrap(const Napi::CallbackInfo& info): Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); +} + +Napi::Value FlexNodeWrap::debugValue(const Napi::CallbackInfo& info) { + uint64_t addr = reinterpret_cast(this->getInternalInstance()); + return info.Env().Null(); +} + +FlexNodeWrap::~FlexNodeWrap() { + delete this->instance; +} diff --git a/src/cpp/core/FlexLayout/flexnode_wrap.h b/src/cpp/core/FlexLayout/flexnode_wrap.h new file mode 100644 index 000000000..6316455fa --- /dev/null +++ b/src/cpp/core/FlexLayout/flexnode_wrap.h @@ -0,0 +1,19 @@ +#ifndef FLEXNODE_WRAP_H +#define FLEXNODE_WRAP_H +#include +#include "deps/yoga/YGNode.h" + +//ABSTRACT CLASS +class FlexNodeWrap : public Napi::ObjectWrap{ + public: + YGNodeRef instance; + static void init(Napi::Env env); + FlexNodeWrap(const Napi::CallbackInfo& info); + ~FlexNodeWrap(); + YGNodeRef getInternalInstance(); +//class constructor + static Napi::FunctionReference constructor; + Napi::Value debugValue(const Napi::CallbackInfo& info); +}; + +#endif \ No newline at end of file diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index d41734a83..7da09f19c 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -9,11 +9,14 @@ #include "src/cpp/QtWidgets/QProgressBar/qprogressbar_wrap.h" #include "src/cpp/QtWidgets/QRadioButton/qradiobutton_wrap.h" #include "src/cpp/QtWidgets/QLineEdit/qlineedit_wrap.h" +#include "src/cpp/core/FlexLayout/flexnode_wrap.h" +#include "src/cpp/core/FlexLayout/flexlayout_wrap.h" #include -//private : will not be accessibe in js +// These cant be instantiated in JS Side void InitPrivateHelpers(Napi::Env env){ QLayoutWrap::init(env); //Abstact class wrapper for pointing to any layout + FlexNodeWrap::init(env); //Abstact class wrapper for pointing to flex/yoga node } Napi::Object Main(Napi::Env env, Napi::Object exports) { @@ -21,6 +24,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) { QApplicationWrap::init(env, exports); QWidgetWrap::init(env, exports); QGridLayoutWrap::init(env, exports); + FlexLayoutWrap::init(env, exports); QMainWindowWrap::init(env,exports); QPushButtonWrap::init(env, exports); QCheckBoxWrap::init(env, exports); diff --git a/src/lib/QtWidgets/FlexLayout/index.ts b/src/lib/QtWidgets/FlexLayout/index.ts new file mode 100644 index 000000000..f804b7824 --- /dev/null +++ b/src/lib/QtWidgets/FlexLayout/index.ts @@ -0,0 +1,11 @@ +import addon from "../../core/addon"; +import { Component } from "../../core/Component"; +import { QWidget } from "../../QtGui/QWidget"; +import { FlexNode } from "../../core/FlexLayout/FlexNode"; + +export class FlexLayout extends Component { + native = new addon.FlexLayout(); + addWidget(childWidget: QWidget, childFlexNode: FlexNode) { + this.native.addWidget(childWidget.native, childFlexNode.native); + } +} diff --git a/src/lib/QtWidgets/QLabel/index.ts b/src/lib/QtWidgets/QLabel/index.ts index c8d94aa31..eb181b234 100644 --- a/src/lib/QtWidgets/QLabel/index.ts +++ b/src/lib/QtWidgets/QLabel/index.ts @@ -1,6 +1,7 @@ import addon from "../../core/addon"; import { NodeWidget } from "../../QtGui/QWidget"; import { QLayout } from "../QLayout"; +import { FlexNode } from "../../core/FlexLayout/FlexNode"; export class QLabel extends NodeWidget { native: any; @@ -20,4 +21,8 @@ export class QLabel extends NodeWidget { setText(text: string) { this.native.setText(text); } + getFlexNode(): FlexNode { + const nativeFlexNode = this.native.getFlexNode(); + return new FlexNode(nativeFlexNode); + } } diff --git a/src/lib/core/FlexLayout/FlexNode/index.ts b/src/lib/core/FlexLayout/FlexNode/index.ts new file mode 100644 index 000000000..4ff7e1245 --- /dev/null +++ b/src/lib/core/FlexLayout/FlexNode/index.ts @@ -0,0 +1,12 @@ +import { Component } from "../../../core/Component"; + +export class FlexNode extends Component { + native: any; + constructor(nativeNode: any) { + super(); + this.native = nativeNode; + } + debugValue() { + this.native.debugValue(); + } +}