From 9363eb04b758063050f06b8492b70cebfa0a0531 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Borecki?=
Date: Thu, 5 Sep 2019 07:09:37 +0200
Subject: [PATCH 1/3] Added initial support for QTabWidget
---
config/application.gypi | 1 +
config/moc.gypi | 1 +
config/moc.json | 1 +
src/cpp/QtWidgets/QTabWidget/ntabwidget.h | 39 ++
.../QtWidgets/QTabWidget/qtabwidget_wrap.cpp | 105 ++++++
.../QtWidgets/QTabWidget/qtabwidget_wrap.h | 27 ++
src/cpp/autogen/ntabwidget_moc.cpp | 337 ++++++++++++++++++
src/cpp/main.cpp | 2 +
src/demo.ts | 37 +-
src/index.ts | 1 +
src/lib/QtEnums/TabPosition/index.ts | 6 +
src/lib/QtEnums/index.ts | 1 +
src/lib/QtWidgets/QTabWidget/index.ts | 56 +++
13 files changed, 607 insertions(+), 7 deletions(-)
create mode 100644 src/cpp/QtWidgets/QTabWidget/ntabwidget.h
create mode 100644 src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.cpp
create mode 100644 src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.h
create mode 100644 src/cpp/autogen/ntabwidget_moc.cpp
create mode 100644 src/lib/QtEnums/TabPosition/index.ts
create mode 100644 src/lib/QtWidgets/QTabWidget/index.ts
diff --git a/config/application.gypi b/config/application.gypi
index b3a835dab..7742ca49a 100644
--- a/config/application.gypi
+++ b/config/application.gypi
@@ -27,6 +27,7 @@
"../src/cpp/QtWidgets/QCheckBox/qcheckbox_wrap.cpp",
"../src/cpp/QtWidgets/QProgressBar/qprogressbar_wrap.cpp",
"../src/cpp/QtWidgets/QRadioButton/qradiobutton_wrap.cpp",
+ "../src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.cpp",
"../src/cpp/QtWidgets/QLineEdit/qlineedit_wrap.cpp",
"../src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp",
"../src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.cpp"
diff --git a/config/moc.gypi b/config/moc.gypi
index aabfe38d7..06304172f 100644
--- a/config/moc.gypi
+++ b/config/moc.gypi
@@ -12,6 +12,7 @@
"../src/cpp/autogen/npushbutton_moc.cpp",
"../src/cpp/autogen/nspinbox_moc.cpp",
"../src/cpp/autogen/nradiobutton_moc.cpp",
+ "../src/cpp/autogen/ntabwidget_moc.cpp",
"../src/cpp/autogen/nplaintextedit_moc.cpp",
"../src/cpp/autogen/nscrollarea_moc.cpp"
]
diff --git a/config/moc.json b/config/moc.json
index db5d1a0fb..cd21b2acd 100644
--- a/config/moc.json
+++ b/config/moc.json
@@ -11,6 +11,7 @@
"src/cpp/QtWidgets/QPushButton/npushbutton.h",
"src/cpp/QtWidgets/QSpinBox/nspinbox.h",
"src/cpp/QtWidgets/QRadioButton/nradiobutton.h",
+ "src/cpp/QtWidgets/QTabWidget/ntabwidget.h",
"src/cpp/QtWidgets/QPlainTextEdit/nplaintextedit.h",
"src/cpp/QtWidgets/QScrollArea/nscrollarea.h"
]
diff --git a/src/cpp/QtWidgets/QTabWidget/ntabwidget.h b/src/cpp/QtWidgets/QTabWidget/ntabwidget.h
new file mode 100644
index 000000000..221eed088
--- /dev/null
+++ b/src/cpp/QtWidgets/QTabWidget/ntabwidget.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include
+#include "src/cpp/core/NodeWidget/nodewidget.h"
+#include "napi.h"
+
+class NTabWidget: public QTabWidget, public NodeWidget
+{
+ NODEWIDGET_IMPLEMENTATIONS(QTabWidget)
+public:
+ using QTabWidget::QTabWidget; //inherit all constructors of QTabWidget
+
+ void connectWidgetSignalsToEventEmitter() {
+ // Qt Connects: Implement all signal connects here
+ QObject::connect(this, &QTabWidget::currentChanged, [=](int index) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({ Napi::String::New(env, "currentChanged"), Napi::Value::From(env, index) });
+ });
+ QObject::connect(this, &QTabWidget::tabBarClicked, [=](int index) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({ Napi::String::New(env, "tabBarClicked"), Napi::Value::From(env, index) });
+ });
+ QObject::connect(this, &QTabWidget::tabBarDoubleClicked, [=](int index) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({ Napi::String::New(env, "tabBarDoubleClicked"), Napi::Value::From(env, index) });
+ });
+
+ QObject::connect(this, &QTabWidget::tabCloseRequested, [=](int index) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({ Napi::String::New(env, "tabCloseRequested"), Napi::Value::From(env, index) });
+ });
+ }
+};
+
+
diff --git a/src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.cpp b/src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.cpp
new file mode 100644
index 000000000..c7ac8f6a0
--- /dev/null
+++ b/src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.cpp
@@ -0,0 +1,105 @@
+#include "qtabwidget_wrap.h"
+#include "src/cpp/QtWidgets/QWidget/qwidget_wrap.h"
+#include "src/cpp/QtGui/QIcon/qicon_wrap.h"
+#include "src/cpp/Extras/Utils/nutils.h"
+#include
+
+Napi::FunctionReference QTabWidgetWrap::constructor;
+
+Napi::Object QTabWidgetWrap::init(Napi::Env env, Napi::Object exports) {
+ Napi::HandleScope scope(env);
+ char CLASSNAME[] = "QTabWidget";
+ Napi::Function func = DefineClass(env, CLASSNAME, {
+ InstanceMethod("addTab", &QTabWidgetWrap::addTab),
+ InstanceMethod("setTabPosition", &QTabWidgetWrap::setTabPosition),
+ InstanceMethod("setCurrentIndex", &QTabWidgetWrap::setCurrentIndex),
+ InstanceMethod("currentIndex", &QTabWidgetWrap::currentIndex),
+ InstanceMethod("removeTab", &QTabWidgetWrap::removeTab),
+ InstanceMethod("setTabsClosable", &QTabWidgetWrap::setTabsClosable),
+ QWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(QTabWidgetWrap)
+ });
+ constructor = Napi::Persistent(func);
+ exports.Set(CLASSNAME, func);
+ return exports;
+}
+
+NTabWidget* QTabWidgetWrap::getInternalInstance() {
+ return this->instance;
+}
+
+QTabWidgetWrap::QTabWidgetWrap(const Napi::CallbackInfo& info): Napi::ObjectWrap(info) {
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+
+ if(info.Length() == 1) {
+ Napi::Object parentObject = info[0].As();
+ QWidgetWrap* parentWidgetWrap = Napi::ObjectWrap::Unwrap(parentObject);
+ this->instance = new NTabWidget(parentWidgetWrap->getInternalInstance()); //this sets the parent to current widget
+ } else if (info.Length() == 0){
+ this->instance = new NTabWidget();
+ } else {
+ Napi::TypeError::New(env, "Wrong number of arguments").ThrowAsJavaScriptException();
+ }
+ // Adds measure function on yoga node so that widget size is calculated based on its text also.
+ YGNodeSetMeasureFunc(this->instance->getFlexNode(), &extrautils::measureQtWidget);
+}
+
+QTabWidgetWrap::~QTabWidgetWrap() {
+ delete this->instance;
+}
+
+Napi::Value QTabWidgetWrap::addTab(const Napi::CallbackInfo &info)
+{
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+
+ Napi::Object pageObject = info[0].As();
+ Napi::Object iconObject = info[1].As();
+ Napi::String napiLabel = info[2].As();
+ std::string label = napiLabel.Utf8Value();
+
+ QWidgetWrap* pageObjectWrap = Napi::ObjectWrap::Unwrap(pageObject);
+ QIconWrap *iconWrap = Napi::ObjectWrap::Unwrap(iconObject);
+
+ this->instance->addTab(pageObjectWrap->getInternalInstance(), *iconWrap->getInternalInstance(), label.c_str());
+ return env.Null();
+}
+
+Napi::Value QTabWidgetWrap::setTabPosition(const Napi::CallbackInfo& info){
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ int tabPosition = info[0].As().Int32Value();
+ this->instance->setTabPosition(static_cast(tabPosition));
+ return env.Null();
+}
+
+Napi::Value QTabWidgetWrap::setCurrentIndex(const Napi::CallbackInfo& info) {
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ Napi::Number index = info[0].As();
+ this->instance->setCurrentIndex(index.Int32Value());
+ return env.Null();
+}
+
+Napi::Value QTabWidgetWrap::currentIndex(const Napi::CallbackInfo& info) {
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ int value = this->instance->currentIndex();
+ return Napi::Number::New(env, value);
+}
+
+Napi::Value QTabWidgetWrap::removeTab(const Napi::CallbackInfo& info) {
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ Napi::Number index = info[0].As();
+ this->instance->removeTab(index.Int32Value());
+ return env.Null();
+}
+
+Napi::Value QTabWidgetWrap::setTabsClosable(const Napi::CallbackInfo& info) {
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ Napi::Boolean closable = info[0].As();
+ this->instance->setTabsClosable(closable.Value());
+ return env.Null();
+}
\ No newline at end of file
diff --git a/src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.h b/src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.h
new file mode 100644
index 000000000..c12540498
--- /dev/null
+++ b/src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include
+#include "ntabwidget.h"
+#include "src/cpp/QtWidgets/QWidget/qwidget_macro.h"
+#include "src/cpp/Extras/Utils/nutils.h"
+
+class QTabWidgetWrap : public Napi::ObjectWrap {
+ private:
+ NTabWidget* instance;
+ public:
+ static Napi::Object init(Napi::Env env, Napi::Object exports);
+ QTabWidgetWrap(const Napi::CallbackInfo &info);
+ ~QTabWidgetWrap();
+ NTabWidget *getInternalInstance();
+ //class constructor
+ static Napi::FunctionReference constructor;
+ //wrapped methods
+ Napi::Value addTab(const Napi::CallbackInfo &info);
+ Napi::Value setTabPosition(const Napi::CallbackInfo &info);
+ Napi::Value setCurrentIndex (const Napi::CallbackInfo &info);
+ Napi::Value currentIndex (const Napi::CallbackInfo &info);
+ Napi::Value removeTab (const Napi::CallbackInfo &info);
+ Napi::Value setTabsClosable (const Napi::CallbackInfo &info);
+
+ QWIDGET_WRAPPED_METHODS_DECLARATION
+};
diff --git a/src/cpp/autogen/ntabwidget_moc.cpp b/src/cpp/autogen/ntabwidget_moc.cpp
new file mode 100644
index 000000000..abe50a602
--- /dev/null
+++ b/src/cpp/autogen/ntabwidget_moc.cpp
@@ -0,0 +1,337 @@
+/****************************************************************************
+** Meta object code from reading C++ file 'ntabwidget.h'
+**
+** Created by: The Qt Meta Object Compiler version 67 (Qt 5.13.0)
+**
+** WARNING! All changes made in this file will be lost!
+*****************************************************************************/
+
+#include
+#include "../QtWidgets/QTabWidget/ntabwidget.h"
+#include
+#include
+#if !defined(Q_MOC_OUTPUT_REVISION)
+#error "The header file 'ntabwidget.h' doesn't include ."
+#elif Q_MOC_OUTPUT_REVISION != 67
+#error "This file was generated using the moc from 5.13.0. It"
+#error "cannot be used with the include files from this version of Qt."
+#error "(The moc has changed too much.)"
+#endif
+
+QT_BEGIN_MOC_NAMESPACE
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+struct qt_meta_stringdata_NTabWidget_t {
+ QByteArrayData data[47];
+ char stringdata0[547];
+};
+#define QT_MOC_LITERAL(idx, ofs, len) \
+ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
+ qptrdiff(offsetof(qt_meta_stringdata_NTabWidget_t, stringdata0) + ofs \
+ - idx * sizeof(QByteArrayData)) \
+ )
+static const qt_meta_stringdata_NTabWidget_t qt_meta_stringdata_NTabWidget = {
+ {
+QT_MOC_LITERAL(0, 0, 10), // "NTabWidget"
+QT_MOC_LITERAL(1, 11, 8), // "yDisplay"
+QT_MOC_LITERAL(2, 20, 11), // "yAlignItems"
+QT_MOC_LITERAL(3, 32, 13), // "yAlignContent"
+QT_MOC_LITERAL(4, 46, 10), // "yAlignSelf"
+QT_MOC_LITERAL(5, 57, 15), // "yJustifyContent"
+QT_MOC_LITERAL(6, 73, 10), // "yDirection"
+QT_MOC_LITERAL(7, 84, 14), // "yFlexDirection"
+QT_MOC_LITERAL(8, 99, 9), // "yOverflow"
+QT_MOC_LITERAL(9, 109, 9), // "yPosition"
+QT_MOC_LITERAL(10, 119, 9), // "yFlexWrap"
+QT_MOC_LITERAL(11, 129, 5), // "yFlex"
+QT_MOC_LITERAL(12, 135, 9), // "yFlexGrow"
+QT_MOC_LITERAL(13, 145, 11), // "yFlexShrink"
+QT_MOC_LITERAL(14, 157, 12), // "yAspectRatio"
+QT_MOC_LITERAL(15, 170, 4), // "yTop"
+QT_MOC_LITERAL(16, 175, 6), // "yRight"
+QT_MOC_LITERAL(17, 182, 7), // "yBottom"
+QT_MOC_LITERAL(18, 190, 5), // "yLeft"
+QT_MOC_LITERAL(19, 196, 10), // "yFlexBasis"
+QT_MOC_LITERAL(20, 207, 9), // "yMinWidth"
+QT_MOC_LITERAL(21, 217, 10), // "yMinHeight"
+QT_MOC_LITERAL(22, 228, 6), // "yWidth"
+QT_MOC_LITERAL(23, 235, 7), // "yHeight"
+QT_MOC_LITERAL(24, 243, 9), // "yMaxWidth"
+QT_MOC_LITERAL(25, 253, 10), // "yMaxHeight"
+QT_MOC_LITERAL(26, 264, 11), // "yPaddingTop"
+QT_MOC_LITERAL(27, 276, 13), // "yPaddingRight"
+QT_MOC_LITERAL(28, 290, 14), // "yPaddingBottom"
+QT_MOC_LITERAL(29, 305, 12), // "yPaddingLeft"
+QT_MOC_LITERAL(30, 318, 18), // "yPaddingHorizontal"
+QT_MOC_LITERAL(31, 337, 16), // "yPaddingVertical"
+QT_MOC_LITERAL(32, 354, 8), // "yPadding"
+QT_MOC_LITERAL(33, 363, 10), // "yMarginTop"
+QT_MOC_LITERAL(34, 374, 12), // "yMarginRight"
+QT_MOC_LITERAL(35, 387, 13), // "yMarginBottom"
+QT_MOC_LITERAL(36, 401, 11), // "yMarginLeft"
+QT_MOC_LITERAL(37, 413, 17), // "yMarginHorizontal"
+QT_MOC_LITERAL(38, 431, 15), // "yMarginVertical"
+QT_MOC_LITERAL(39, 447, 7), // "yMargin"
+QT_MOC_LITERAL(40, 455, 10), // "yBorderTop"
+QT_MOC_LITERAL(41, 466, 12), // "yBorderRight"
+QT_MOC_LITERAL(42, 479, 13), // "yBorderBottom"
+QT_MOC_LITERAL(43, 493, 11), // "yBorderLeft"
+QT_MOC_LITERAL(44, 505, 17), // "yBorderHorizontal"
+QT_MOC_LITERAL(45, 523, 15), // "yBorderVertical"
+QT_MOC_LITERAL(46, 539, 7) // "yBorder"
+
+ },
+ "NTabWidget\0yDisplay\0yAlignItems\0"
+ "yAlignContent\0yAlignSelf\0yJustifyContent\0"
+ "yDirection\0yFlexDirection\0yOverflow\0"
+ "yPosition\0yFlexWrap\0yFlex\0yFlexGrow\0"
+ "yFlexShrink\0yAspectRatio\0yTop\0yRight\0"
+ "yBottom\0yLeft\0yFlexBasis\0yMinWidth\0"
+ "yMinHeight\0yWidth\0yHeight\0yMaxWidth\0"
+ "yMaxHeight\0yPaddingTop\0yPaddingRight\0"
+ "yPaddingBottom\0yPaddingLeft\0"
+ "yPaddingHorizontal\0yPaddingVertical\0"
+ "yPadding\0yMarginTop\0yMarginRight\0"
+ "yMarginBottom\0yMarginLeft\0yMarginHorizontal\0"
+ "yMarginVertical\0yMargin\0yBorderTop\0"
+ "yBorderRight\0yBorderBottom\0yBorderLeft\0"
+ "yBorderHorizontal\0yBorderVertical\0"
+ "yBorder"
+};
+#undef QT_MOC_LITERAL
+
+static const uint qt_meta_data_NTabWidget[] = {
+
+ // content:
+ 8, // revision
+ 0, // classname
+ 0, 0, // classinfo
+ 0, 0, // methods
+ 46, 14, // properties
+ 0, 0, // enums/sets
+ 0, 0, // constructors
+ 0, // flags
+ 0, // signalCount
+
+ // properties: name, type, flags
+ 1, QMetaType::QString, 0x00095103,
+ 2, QMetaType::QString, 0x00095103,
+ 3, QMetaType::QString, 0x00095103,
+ 4, QMetaType::QString, 0x00095103,
+ 5, QMetaType::QString, 0x00095103,
+ 6, QMetaType::QString, 0x00095103,
+ 7, QMetaType::QString, 0x00095103,
+ 8, QMetaType::QString, 0x00095103,
+ 9, QMetaType::QString, 0x00095103,
+ 10, QMetaType::QString, 0x00095103,
+ 11, QMetaType::Float, 0x00095103,
+ 12, QMetaType::Float, 0x00095103,
+ 13, QMetaType::Float, 0x00095103,
+ 14, QMetaType::Float, 0x00095103,
+ 15, QMetaType::QString, 0x00095003,
+ 16, QMetaType::QString, 0x00095003,
+ 17, QMetaType::QString, 0x00095003,
+ 18, QMetaType::QString, 0x00095003,
+ 19, QMetaType::QString, 0x00095103,
+ 20, QMetaType::QString, 0x00095103,
+ 21, QMetaType::QString, 0x00095103,
+ 22, QMetaType::QString, 0x00095103,
+ 23, QMetaType::QString, 0x00095103,
+ 24, QMetaType::QString, 0x00095103,
+ 25, QMetaType::QString, 0x00095103,
+ 26, QMetaType::QString, 0x00095103,
+ 27, QMetaType::QString, 0x00095103,
+ 28, QMetaType::QString, 0x00095103,
+ 29, QMetaType::QString, 0x00095103,
+ 30, QMetaType::QString, 0x00095103,
+ 31, QMetaType::QString, 0x00095103,
+ 32, QMetaType::QString, 0x00095103,
+ 33, QMetaType::QString, 0x00095103,
+ 34, QMetaType::QString, 0x00095103,
+ 35, QMetaType::QString, 0x00095103,
+ 36, QMetaType::QString, 0x00095103,
+ 37, QMetaType::QString, 0x00095103,
+ 38, QMetaType::QString, 0x00095103,
+ 39, QMetaType::QString, 0x00095003,
+ 40, QMetaType::Float, 0x00095103,
+ 41, QMetaType::Float, 0x00095103,
+ 42, QMetaType::Float, 0x00095103,
+ 43, QMetaType::Float, 0x00095103,
+ 44, QMetaType::Float, 0x00095103,
+ 45, QMetaType::Float, 0x00095103,
+ 46, QMetaType::Float, 0x00095103,
+
+ 0 // eod
+};
+
+void NTabWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
+{
+
+#ifndef QT_NO_PROPERTIES
+ if (_c == QMetaObject::ReadProperty) {
+ auto *_t = static_cast(_o);
+ Q_UNUSED(_t)
+ void *_v = _a[0];
+ switch (_id) {
+ case 0: *reinterpret_cast< QString*>(_v) = _t->_yDisplay; break;
+ case 1: *reinterpret_cast< QString*>(_v) = _t->_yAlignItems; break;
+ case 2: *reinterpret_cast< QString*>(_v) = _t->_yAlignContent; break;
+ case 3: *reinterpret_cast< QString*>(_v) = _t->_yAlignSelf; break;
+ case 4: *reinterpret_cast< QString*>(_v) = _t->_yJustifyContent; break;
+ case 5: *reinterpret_cast< QString*>(_v) = _t->_yDirection; break;
+ case 6: *reinterpret_cast< QString*>(_v) = _t->_yFlexDirection; break;
+ case 7: *reinterpret_cast< QString*>(_v) = _t->_yOverflow; break;
+ case 8: *reinterpret_cast< QString*>(_v) = _t->_yPosition; break;
+ case 9: *reinterpret_cast< QString*>(_v) = _t->_yFlexWrap; break;
+ case 10: *reinterpret_cast< float*>(_v) = _t->_yFlex; break;
+ case 11: *reinterpret_cast< float*>(_v) = _t->_yFlexGrow; break;
+ case 12: *reinterpret_cast< float*>(_v) = _t->_yFlexShrink; break;
+ case 13: *reinterpret_cast< float*>(_v) = _t->_yAspectRatio; break;
+ case 14: *reinterpret_cast< QString*>(_v) = _t->_yTop; break;
+ case 15: *reinterpret_cast< QString*>(_v) = _t->_yRight; break;
+ case 16: *reinterpret_cast< QString*>(_v) = _t->_yBottom; break;
+ case 17: *reinterpret_cast< QString*>(_v) = _t->_yLeft; break;
+ case 18: *reinterpret_cast< QString*>(_v) = _t->_yFlexBasis; break;
+ case 19: *reinterpret_cast< QString*>(_v) = _t->_yMinWidth; break;
+ case 20: *reinterpret_cast< QString*>(_v) = _t->_yMinHeight; break;
+ case 21: *reinterpret_cast< QString*>(_v) = _t->_yWidth; break;
+ case 22: *reinterpret_cast< QString*>(_v) = _t->_yHeight; break;
+ case 23: *reinterpret_cast< QString*>(_v) = _t->_yMaxWidth; break;
+ case 24: *reinterpret_cast< QString*>(_v) = _t->_yMaxHeight; break;
+ case 25: *reinterpret_cast< QString*>(_v) = _t->_yPaddingTop; break;
+ case 26: *reinterpret_cast< QString*>(_v) = _t->_yPaddingRight; break;
+ case 27: *reinterpret_cast< QString*>(_v) = _t->_yPaddingBottom; break;
+ case 28: *reinterpret_cast< QString*>(_v) = _t->_yPaddingLeft; break;
+ case 29: *reinterpret_cast< QString*>(_v) = _t->_yPaddingHorizontal; break;
+ case 30: *reinterpret_cast< QString*>(_v) = _t->_yPaddingVertical; break;
+ case 31: *reinterpret_cast< QString*>(_v) = _t->_yPadding; break;
+ case 32: *reinterpret_cast< QString*>(_v) = _t->_yMarginTop; break;
+ case 33: *reinterpret_cast< QString*>(_v) = _t->_yMarginRight; break;
+ case 34: *reinterpret_cast< QString*>(_v) = _t->_yMarginBottom; break;
+ case 35: *reinterpret_cast< QString*>(_v) = _t->_yMarginLeft; break;
+ case 36: *reinterpret_cast< QString*>(_v) = _t->_yMarginHorizontal; break;
+ case 37: *reinterpret_cast< QString*>(_v) = _t->_yMarginVertical; break;
+ case 38: *reinterpret_cast< QString*>(_v) = _t->_yMargin; break;
+ case 39: *reinterpret_cast< float*>(_v) = _t->_yBorderTop; break;
+ case 40: *reinterpret_cast< float*>(_v) = _t->_yBorderRight; break;
+ case 41: *reinterpret_cast< float*>(_v) = _t->_yBorderBottom; break;
+ case 42: *reinterpret_cast< float*>(_v) = _t->_yBorderLeft; break;
+ case 43: *reinterpret_cast< float*>(_v) = _t->_yBorderHorizontal; break;
+ case 44: *reinterpret_cast< float*>(_v) = _t->_yBorderVertical; break;
+ case 45: *reinterpret_cast< float*>(_v) = _t->_yBorder; break;
+ default: break;
+ }
+ } else if (_c == QMetaObject::WriteProperty) {
+ auto *_t = static_cast(_o);
+ Q_UNUSED(_t)
+ void *_v = _a[0];
+ switch (_id) {
+ case 0: _t->setYDisplay(*reinterpret_cast< QString*>(_v)); break;
+ case 1: _t->setYAlignItems(*reinterpret_cast< QString*>(_v)); break;
+ case 2: _t->setYAlignContent(*reinterpret_cast< QString*>(_v)); break;
+ case 3: _t->setYAlignSelf(*reinterpret_cast< QString*>(_v)); break;
+ case 4: _t->setYJustifyContent(*reinterpret_cast< QString*>(_v)); break;
+ case 5: _t->setYDirection(*reinterpret_cast< QString*>(_v)); break;
+ case 6: _t->setYFlexDirection(*reinterpret_cast< QString*>(_v)); break;
+ case 7: _t->setYOverflow(*reinterpret_cast< QString*>(_v)); break;
+ case 8: _t->setYPosition(*reinterpret_cast< QString*>(_v)); break;
+ case 9: _t->setYFlexWrap(*reinterpret_cast< QString*>(_v)); break;
+ case 10: _t->setYFlex(*reinterpret_cast< float*>(_v)); break;
+ case 11: _t->setYFlexGrow(*reinterpret_cast< float*>(_v)); break;
+ case 12: _t->setYFlexShrink(*reinterpret_cast< float*>(_v)); break;
+ case 13: _t->setYAspectRatio(*reinterpret_cast< float*>(_v)); break;
+ case 14: _t->setYNodeTop(*reinterpret_cast< QString*>(_v)); break;
+ case 15: _t->setYNodeRight(*reinterpret_cast< QString*>(_v)); break;
+ case 16: _t->setYNodeBottom(*reinterpret_cast< QString*>(_v)); break;
+ case 17: _t->setYNodeLeft(*reinterpret_cast< QString*>(_v)); break;
+ case 18: _t->setYFlexBasis(*reinterpret_cast< QString*>(_v)); break;
+ case 19: _t->setYMinWidth(*reinterpret_cast< QString*>(_v)); break;
+ case 20: _t->setYMinHeight(*reinterpret_cast< QString*>(_v)); break;
+ case 21: _t->setYWidth(*reinterpret_cast< QString*>(_v)); break;
+ case 22: _t->setYHeight(*reinterpret_cast< QString*>(_v)); break;
+ case 23: _t->setYMaxWidth(*reinterpret_cast< QString*>(_v)); break;
+ case 24: _t->setYMaxHeight(*reinterpret_cast< QString*>(_v)); break;
+ case 25: _t->setYPaddingTop(*reinterpret_cast< QString*>(_v)); break;
+ case 26: _t->setYPaddingRight(*reinterpret_cast< QString*>(_v)); break;
+ case 27: _t->setYPaddingBottom(*reinterpret_cast< QString*>(_v)); break;
+ case 28: _t->setYPaddingLeft(*reinterpret_cast< QString*>(_v)); break;
+ case 29: _t->setYPaddingHorizontal(*reinterpret_cast< QString*>(_v)); break;
+ case 30: _t->setYPaddingVertical(*reinterpret_cast< QString*>(_v)); break;
+ case 31: _t->setYPadding(*reinterpret_cast< QString*>(_v)); break;
+ case 32: _t->setYMarginTop(*reinterpret_cast< QString*>(_v)); break;
+ case 33: _t->setYMarginRight(*reinterpret_cast< QString*>(_v)); break;
+ case 34: _t->setYMarginBottom(*reinterpret_cast< QString*>(_v)); break;
+ case 35: _t->setYMarginLeft(*reinterpret_cast< QString*>(_v)); break;
+ case 36: _t->setYMarginHorizontal(*reinterpret_cast< QString*>(_v)); break;
+ case 37: _t->setYMarginVertical(*reinterpret_cast< QString*>(_v)); break;
+ case 38: _t->setYMarginAll(*reinterpret_cast< QString*>(_v)); break;
+ case 39: _t->setYBorderTop(*reinterpret_cast< float*>(_v)); break;
+ case 40: _t->setYBorderRight(*reinterpret_cast< float*>(_v)); break;
+ case 41: _t->setYBorderBottom(*reinterpret_cast< float*>(_v)); break;
+ case 42: _t->setYBorderLeft(*reinterpret_cast< float*>(_v)); break;
+ case 43: _t->setYBorderHorizontal(*reinterpret_cast< float*>(_v)); break;
+ case 44: _t->setYBorderVertical(*reinterpret_cast< float*>(_v)); break;
+ case 45: _t->setYBorder(*reinterpret_cast< float*>(_v)); break;
+ default: break;
+ }
+ } else if (_c == QMetaObject::ResetProperty) {
+ }
+#endif // QT_NO_PROPERTIES
+ Q_UNUSED(_o);
+ Q_UNUSED(_id);
+ Q_UNUSED(_c);
+ Q_UNUSED(_a);
+}
+
+QT_INIT_METAOBJECT const QMetaObject NTabWidget::staticMetaObject = { {
+ &QTabWidget::staticMetaObject,
+ qt_meta_stringdata_NTabWidget.data,
+ qt_meta_data_NTabWidget,
+ qt_static_metacall,
+ nullptr,
+ nullptr
+} };
+
+
+const QMetaObject *NTabWidget::metaObject() const
+{
+ return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
+}
+
+void *NTabWidget::qt_metacast(const char *_clname)
+{
+ if (!_clname) return nullptr;
+ if (!strcmp(_clname, qt_meta_stringdata_NTabWidget.stringdata0))
+ return static_cast(this);
+ if (!strcmp(_clname, "NodeWidget"))
+ return static_cast< NodeWidget*>(this);
+ return QTabWidget::qt_metacast(_clname);
+}
+
+int NTabWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
+{
+ _id = QTabWidget::qt_metacall(_c, _id, _a);
+ if (_id < 0)
+ return _id;
+
+#ifndef QT_NO_PROPERTIES
+ if (_c == QMetaObject::ReadProperty || _c == QMetaObject::WriteProperty
+ || _c == QMetaObject::ResetProperty || _c == QMetaObject::RegisterPropertyMetaType) {
+ qt_static_metacall(this, _c, _id, _a);
+ _id -= 46;
+ } else if (_c == QMetaObject::QueryPropertyDesignable) {
+ _id -= 46;
+ } else if (_c == QMetaObject::QueryPropertyScriptable) {
+ _id -= 46;
+ } else if (_c == QMetaObject::QueryPropertyStored) {
+ _id -= 46;
+ } else if (_c == QMetaObject::QueryPropertyEditable) {
+ _id -= 46;
+ } else if (_c == QMetaObject::QueryPropertyUser) {
+ _id -= 46;
+ }
+#endif // QT_NO_PROPERTIES
+ return _id;
+}
+QT_WARNING_POP
+QT_END_MOC_NAMESPACE
diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp
index 3ff51c7e5..e892eeca3 100644
--- a/src/cpp/main.cpp
+++ b/src/cpp/main.cpp
@@ -13,6 +13,7 @@
#include "src/cpp/QtWidgets/QCheckBox/qcheckbox_wrap.h"
#include "src/cpp/QtWidgets/QProgressBar/qprogressbar_wrap.h"
#include "src/cpp/QtWidgets/QRadioButton/qradiobutton_wrap.h"
+#include "src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.h"
#include "src/cpp/QtWidgets/QLineEdit/qlineedit_wrap.h"
#include "src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h"
#include "src/cpp/core/FlexLayout/flexlayout_wrap.h"
@@ -39,6 +40,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) {
QCheckBoxWrap::init(env, exports);
QProgressBarWrap::init(env, exports);
QRadioButtonWrap::init(env, exports);
+ QTabWidgetWrap::init(env, exports);
QLineEditWrap::init(env, exports);
QKeyEventWrap::init(env, exports);
QPlainTextEditWrap::init(env, exports);
diff --git a/src/demo.ts b/src/demo.ts
index 4352000d0..0aa725caa 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -10,20 +10,28 @@ import {
QWidget,
QIcon,
QDial,
- QPlainTextEdit
+ QPlainTextEdit,
+ QTabWidget,
+ QGridLayout
} from "./index";
import { QScrollArea } from "./lib/QtWidgets/QScrollArea";
import { QPixmap } from "./lib/QtGui/QPixmap";
import { CursorShape, WindowState } from "./lib/QtEnums"
+import { QTabWidgetEvents } from "./lib/QtWidgets/QTabWidget";
const path = require("path");
const win = new QMainWindow();
-const label = new QLabel();
-label.setText("Hello world 🧙");
-label.setInlineStyle("font-size: 20px;");
-label.setCursor(CursorShape.ForbiddenCursor);
+const label1 = new QLabel();
+label1.setText("Hello world 1 🧙");
+label1.setInlineStyle("font-size: 20px;");
+label1.setCursor(CursorShape.ForbiddenCursor);
+
+const label2 = new QLabel();
+label2.setText("Hello world 2 💻");
+label2.setInlineStyle("font-size: 20px;");
+label2.setCursor(CursorShape.ForbiddenCursor);
const checkbox = new QCheckBox();
checkbox.setText("Check me out?");
@@ -51,6 +59,21 @@ const icon = new QIcon(
);
button.setIcon(icon);
+const tabs = new QTabWidget();
+tabs.setTabsClosable(true);
+const tab1 = new QWidget();
+const tab2 = new QWidget();
+tab1.setLayout(new QGridLayout());
+tab2.setLayout(new QGridLayout());
+
+if(tab1.layout && tab2.layout) {
+ tab1.layout.addWidget(label1);
+ tab2.layout.addWidget(label2);
+}
+
+tabs.addTab(tab1, icon, "Tab 1");
+tabs.addTab(tab2, icon, "Tab 2");
+
const progressbar = new QProgressBar();
progressbar.setValue(6);
progressbar.setMinimum(1);
@@ -77,7 +100,7 @@ imageLabel.setPixmap(pixmap);
scrollArea.setWidget(imageLabel);
if (rootView.layout) {
- rootView.layout.addWidget(label);
+ rootView.layout.addWidget(tabs);
rootView.layout.addWidget(checkbox);
rootView.layout.addWidget(radioButton);
rootView.layout.addWidget(lineEdit);
@@ -101,7 +124,7 @@ win.setStyleSheet(`
win.setWindowIcon(nodeguiLogo);
win.setWindowTitle("NodeGUI Demo");
-win.resize(400, 400);
+win.resize(400, 500);
win.show();
win.setWindowState(WindowState.WindowActive);
diff --git a/src/index.ts b/src/index.ts
index 2b5734886..9e90c35d7 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -24,6 +24,7 @@ export { QProgressBar, QProgressBarEvents } from "./lib/QtWidgets/QProgressBar";
export { QPushButton, QPushButtonEvents } from "./lib/QtWidgets/QPushButton";
export { QSpinBox, QSpinBoxEvents } from "./lib/QtWidgets/QSpinBox";
export { QRadioButton, QRadioButtonEvents } from "./lib/QtWidgets/QRadioButton";
+export { QTabWidget, QTabWidgetEvents } from "./lib/QtWidgets/QTabWidget";
export {
QPlainTextEdit,
QPlainTextEditEvents
diff --git a/src/lib/QtEnums/TabPosition/index.ts b/src/lib/QtEnums/TabPosition/index.ts
new file mode 100644
index 000000000..79f6d0ae3
--- /dev/null
+++ b/src/lib/QtEnums/TabPosition/index.ts
@@ -0,0 +1,6 @@
+export enum TabPosition {
+ North = 0,
+ South = 1,
+ West = 2,
+ East = 3
+}
\ No newline at end of file
diff --git a/src/lib/QtEnums/index.ts b/src/lib/QtEnums/index.ts
index 8a45421aa..88c732083 100644
--- a/src/lib/QtEnums/index.ts
+++ b/src/lib/QtEnums/index.ts
@@ -61,6 +61,7 @@ export { SizeHint } from "./SizeHint";
export { SizeMode } from "./SizeMode";
export { SortOrder } from "./SortOrder";
export { TabFocusBehavior } from "./TabFocusBehavior";
+export { TabPosition } from "./TabPosition";
export { TextElideMode } from "./TextElideMode";
export { TextFlag } from "./TextFlag";
export { TextFormat } from "./TextFormat";
diff --git a/src/lib/QtWidgets/QTabWidget/index.ts b/src/lib/QtWidgets/QTabWidget/index.ts
new file mode 100644
index 000000000..cb80aeba7
--- /dev/null
+++ b/src/lib/QtWidgets/QTabWidget/index.ts
@@ -0,0 +1,56 @@
+import addon from "../../core/addon";
+import { NodeWidget } from "../QWidget";
+import { BaseWidgetEvents } from "../../core/EventWidget";
+import { NativeElement } from "../../core/Component";
+import { QIcon } from "../../QtGui/QIcon";
+import { TabPosition } from "../../QtEnums";
+
+export const QTabWidgetEvents = Object.freeze({
+ ...BaseWidgetEvents,
+ currentChanged: "currentChanged",
+ tabBarClicked: "tabBarClicked",
+ tabBarDoubleClicked: "tabBarDoubleClicked",
+ tabCloseRequested: "tabCloseRequested"
+});
+
+export class QTabWidget extends NodeWidget {
+ native: NativeElement;
+ constructor(parent?: NodeWidget) {
+ let native;
+ if (parent) {
+ native = new addon.QTabWidget(parent.native);
+ } else {
+ native = new addon.QTabWidget();
+ }
+ super(native);
+ this.parent = parent;
+ this.native = native;
+ // bind member functions
+ this.addTab.bind(this);
+ }
+
+ addTab(page: NodeWidget, icon: QIcon, label: string) {
+ this.children.add(page);
+ this.native.addTab(page.native, icon.native, label);
+ }
+
+ setTabPosition(tabPosition: TabPosition) {
+ this.native.setTabPosition(tabPosition);
+ }
+
+ setCurrentIndex(index: Number) {
+ this.native.setCurrentIndex(index);
+ }
+
+ currentIndex(): number {
+ return this.native.currentIndex();
+ }
+
+ removeTab(index: Number) {
+ this.native.removeTab(index);
+ }
+
+ setTabsClosable(closeable: Boolean) {
+ this.native.setTabsClosable(closeable);
+ }
+}
From d250b766cea6ee7959cb437036409eac486db47f Mon Sep 17 00:00:00 2001
From: Atul R
Date: Fri, 20 Sep 2019 23:32:46 +0200
Subject: [PATCH 2/3] updates readme
---
docs/api/QIcon.md | 2 +-
docs/api/QTabWidget.md | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
create mode 100644 docs/api/QTabWidget.md
diff --git a/docs/api/QIcon.md b/docs/api/QIcon.md
index 11a88e226..9720e3801 100644
--- a/docs/api/QIcon.md
+++ b/docs/api/QIcon.md
@@ -32,7 +32,7 @@ QIcon can access all the instance properties defined in [Component](api/Componen
QIcon can access all the instance methods defined in [Component](api/Component.md)
Additionally it also has the following instance methods:
-#### `icon.pixmap(width, height, mode?, state?)`
+#### `icon.pixmap(width, height, mode?, state?)` (v0.1.10 & up)
Returns a pixmap with the requested size, mode, and state, generating one if necessary. The pixmap might be smaller than requested, but never larger.
. It calls the native method [QIcon: pixmap](https://doc.qt.io/qt-5/qicon.html#pixmap-3).
diff --git a/docs/api/QTabWidget.md b/docs/api/QTabWidget.md
new file mode 100644
index 000000000..761c76e37
--- /dev/null
+++ b/docs/api/QTabWidget.md
@@ -0,0 +1,3 @@
+## Class: QTabWidget
+
+Will be available from NodeGUI v0.1.10 and up
From c8d957ef5f3961399e7385e8f481878ed6228b2d Mon Sep 17 00:00:00 2001
From: Atul R
Date: Fri, 20 Sep 2019 23:33:57 +0200
Subject: [PATCH 3/3] cleanup demo.ts a tiny bit
---
src/demo.ts | 20 +++-----------------
1 file changed, 3 insertions(+), 17 deletions(-)
diff --git a/src/demo.ts b/src/demo.ts
index ff0bbe855..320831026 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -18,13 +18,9 @@ import {
CursorShape,
WindowState,
QTextOptionWrapMode,
- QApplication,
- QClipboardMode,
QCheckBoxEvents
} from "./index";
-import { QTabWidgetEvents } from "./lib/QtWidgets/QTabWidget";
-
const path = require("path");
const win = new QMainWindow();
@@ -44,8 +40,8 @@ checkbox.setText("Check me out?");
checkbox.setObjectName("check");
checkbox.setChecked(true);
checkbox.addEventListener(QCheckBoxEvents.toggled, () => {
- console.log('checkbox was toggled!');
-})
+ console.log("checkbox was toggled!");
+});
const dial = new QDial();
checkbox.setObjectName("dial");
@@ -57,16 +53,6 @@ lineEdit.setObjectName("editable");
const button = new QPushButton();
button.setText("Push Push Push!");
button.setObjectName("btn");
-button.setFlat(true);
-button.addEventListener("clicked", () => {
- const clipboard = QApplication.clipboard();
- console.log("clipboard: ", clipboard.text(QClipboardMode.Clipboard));
- clipboard.setText("yooooo", QClipboardMode.Clipboard);
- if (rootView.layout) {
- (rootView.layout as FlexLayout).removeWidget(dial);
- }
- label.setInlineStyle("color:blue;");
-});
const nodeguiLogo = new QIcon(
path.resolve(__dirname, "../extras/assets/nodegui.png")
@@ -84,7 +70,7 @@ const tab2 = new QWidget();
tab1.setLayout(new QGridLayout());
tab2.setLayout(new QGridLayout());
-if(tab1.layout && tab2.layout) {
+if (tab1.layout && tab2.layout) {
tab1.layout.addWidget(label1);
tab2.layout.addWidget(label2);
}