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] 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); + } +}