From 42e92ecbffbec90721b92b69d4231e1d5b7199a4 Mon Sep 17 00:00:00 2001 From: Atul R Date: Fri, 20 Dec 2019 23:48:53 +0530 Subject: [PATCH] Adds Signals inheritance (#288) * Inherit signals * export signals * Fix Qvariant build * Adds Abstract button signals * added more test cases --- .../nodegui/QtCore/QObject/nobject.hpp | 3 + .../nodegui/QtCore/QObject/qobject_macro.h | 13 ++++ .../nodegui/QtCore/QVariant/qvariant_wrap.h | 4 ++ .../include/nodegui/QtGui/QMovie/nmovie.hpp | 2 +- .../QAbstractButton/qabstractbutton_macro.h | 28 ++++++++ .../nodegui/QtWidgets/QAction/naction.hpp | 2 +- .../nodegui/QtWidgets/QAction/qaction_wrap.h | 1 + .../nodegui/QtWidgets/QCheckBox/ncheckbox.hpp | 11 +--- .../nodegui/QtWidgets/QComboBox/ncombobox.hpp | 2 +- .../include/nodegui/QtWidgets/QDial/ndial.hpp | 2 +- .../QtWidgets/QFileDialog/nfiledialog.hpp | 2 +- .../nodegui/QtWidgets/QGroupBox/ngroupbox.hpp | 2 +- .../nodegui/QtWidgets/QLabel/nlabel.hpp | 5 +- .../nodegui/QtWidgets/QLineEdit/nlineedit.hpp | 2 +- .../QPlainTextEdit/nplaintextedit.hpp | 2 +- .../QtWidgets/QPushButton/npushbutton.hpp | 28 +------- .../QtWidgets/QRadioButton/nradiobutton.hpp | 6 ++ .../nodegui/QtWidgets/QShortcut/nshortcut.hpp | 2 +- .../nodegui/QtWidgets/QSpinBox/nspinbox.hpp | 2 +- .../QStackedWidget/nstackedwidget.hpp | 2 +- .../QSystemTrayIcon/nsystemtrayicon.hpp | 2 +- .../QtWidgets/QTabWidget/ntabwidget.hpp | 2 +- .../QtWidgets/QTableWidget/ntablewidget.hpp | 2 +- .../QtWidgets/QToolButton/ntoolbutton.hpp | 30 ++------- .../QtWidgets/QTreeWidget/ntreewidget.hpp | 2 +- .../nodegui/QtWidgets/QWidget/nwidget.hpp | 5 +- .../nodegui/QtWidgets/QWidget/qwidget_macro.h | 31 +++++++++ .../include/nodegui/core/Events/eventwidget.h | 2 +- .../nodegui/core/Events/eventwidget_macro.h | 2 +- src/cpp/lib/QtCore/QVariant/qvariant_wrap.cpp | 18 +++++- .../lib/QtWidgets/QAction/qaction_wrap.cpp | 34 ++++++---- src/cpp/lib/core/Events/eventwidget.cpp | 2 +- src/index.ts | 64 ++++++++++--------- src/lib/QtCore/QObject.ts | 13 ++-- src/lib/QtCore/QVariant.ts | 7 +- src/lib/QtCore/__tests__/QColor.test.ts | 2 +- src/lib/QtCore/__tests__/QPoint.test.ts | 2 +- src/lib/QtCore/__tests__/QRect.test.ts | 2 +- src/lib/QtCore/__tests__/QSize.test.ts | 2 +- src/lib/QtCore/__tests__/QUrl.test.ts | 2 +- src/lib/QtCore/__tests__/QVariant.test.ts | 2 +- src/lib/QtGui/QMovie.ts | 2 +- src/lib/QtGui/__tests__/QIcon.test.ts | 2 +- src/lib/QtGui/__tests__/QPixmap.test.ts | 2 +- src/lib/QtWidgets/QAbstractButton.ts | 8 ++- src/lib/QtWidgets/QAction.ts | 10 ++- src/lib/QtWidgets/QBoxLayout.ts | 2 +- src/lib/QtWidgets/QCheckBox.ts | 7 +- src/lib/QtWidgets/QComboBox.ts | 2 +- src/lib/QtWidgets/QDial.ts | 2 +- src/lib/QtWidgets/QFileDialog.ts | 2 +- src/lib/QtWidgets/QGridLayout.ts | 2 +- src/lib/QtWidgets/QGroupBox.ts | 2 +- src/lib/QtWidgets/QLabel.ts | 4 +- src/lib/QtWidgets/QLineEdit.ts | 2 +- src/lib/QtWidgets/QMainWindow.ts | 2 +- src/lib/QtWidgets/QMenu.ts | 2 +- src/lib/QtWidgets/QMenuBar.ts | 2 +- src/lib/QtWidgets/QPlainTextEdit.ts | 2 +- src/lib/QtWidgets/QProgressBar.ts | 2 +- src/lib/QtWidgets/QPushButton.ts | 9 +-- src/lib/QtWidgets/QRadioButton.ts | 4 +- src/lib/QtWidgets/QScrollArea.ts | 2 +- src/lib/QtWidgets/QShortcut.ts | 2 +- src/lib/QtWidgets/QSpinBox.ts | 2 +- src/lib/QtWidgets/QStackedWidget.ts | 2 +- src/lib/QtWidgets/QSystemTrayIcon.ts | 2 +- src/lib/QtWidgets/QTabWidget.ts | 2 +- src/lib/QtWidgets/QTableWidget.ts | 2 +- src/lib/QtWidgets/QToolButton.ts | 8 +-- src/lib/QtWidgets/QTreeWidget.ts | 2 +- src/lib/QtWidgets/QWidget.ts | 12 +++- src/lib/QtWidgets/__tests__/QCheckBox.test.ts | 16 +++++ src/lib/QtWidgets/__tests__/QLabel.test.ts | 16 +++++ .../QtWidgets/__tests__/QPushButton.test.ts | 16 +++++ .../QtWidgets/__tests__/QRadioButton.test.ts | 16 +++++ .../QtWidgets/__tests__/QToolButton.test.ts | 49 ++++++++++++++ src/lib/QtWidgets/__tests__/QWidget.test.ts | 16 +++++ src/lib/core/FlexLayout.ts | 2 +- .../development/signal_and_event_handling.md | 4 +- 80 files changed, 401 insertions(+), 191 deletions(-) create mode 100644 src/lib/QtWidgets/__tests__/QToolButton.test.ts diff --git a/src/cpp/include/nodegui/QtCore/QObject/nobject.hpp b/src/cpp/include/nodegui/QtCore/QObject/nobject.hpp index 1529fe8e7..67ea6d7e3 100644 --- a/src/cpp/include/nodegui/QtCore/QObject/nobject.hpp +++ b/src/cpp/include/nodegui/QtCore/QObject/nobject.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include "QtCore/QObject/qobject_macro.h" #include "core/Events/eventwidget.h" #include "core/Events/eventwidget_macro.h" @@ -9,4 +10,6 @@ class NObject : public QObject, public EventWidget { EVENTWIDGET_IMPLEMENTATIONS(QObject) public: using QObject::QObject; + + void connectSignalsToEventEmitter() { QOBJECT_SIGNALS } }; diff --git a/src/cpp/include/nodegui/QtCore/QObject/qobject_macro.h b/src/cpp/include/nodegui/QtCore/QObject/qobject_macro.h index 743330e50..859ebd759 100644 --- a/src/cpp/include/nodegui/QtCore/QObject/qobject_macro.h +++ b/src/cpp/include/nodegui/QtCore/QObject/qobject_macro.h @@ -72,3 +72,16 @@ InstanceMethod("objectName", &ComponentWrapName::objectName), #endif // QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE + +#ifndef QOBJECT_SIGNALS +#define QOBJECT_SIGNALS \ + QObject::connect(this, &QObject::objectNameChanged, \ + [=](const QString& objectName) { \ + Napi::Env env = this->emitOnNode.Env(); \ + Napi::HandleScope scope(env); \ + this->emitOnNode.Call( \ + {Napi::String::New(env, "objectNameChanged"), \ + Napi::Value::From(env, objectName.toStdString())}); \ + }); + +#endif // QOBJECT_SIGNALS diff --git a/src/cpp/include/nodegui/QtCore/QVariant/qvariant_wrap.h b/src/cpp/include/nodegui/QtCore/QVariant/qvariant_wrap.h index e6150cc12..3ac4a040e 100644 --- a/src/cpp/include/nodegui/QtCore/QVariant/qvariant_wrap.h +++ b/src/cpp/include/nodegui/QtCore/QVariant/qvariant_wrap.h @@ -23,3 +23,7 @@ class QVariantWrap : public Napi::ObjectWrap { // wrapped methods COMPONENT_WRAPPED_METHODS_DECLARATION }; + +namespace StaticQVariantWrapMethods { +Napi::Value converToQVariant(const Napi::CallbackInfo& info); +} // namespace StaticQVariantWrapMethods \ No newline at end of file diff --git a/src/cpp/include/nodegui/QtGui/QMovie/nmovie.hpp b/src/cpp/include/nodegui/QtGui/QMovie/nmovie.hpp index ac83b4fd5..50d612071 100644 --- a/src/cpp/include/nodegui/QtGui/QMovie/nmovie.hpp +++ b/src/cpp/include/nodegui/QtGui/QMovie/nmovie.hpp @@ -12,7 +12,7 @@ class NMovie : public QMovie, public EventWidget { public: using QMovie::QMovie; - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QMovie::error, [=](QImageReader::ImageReaderError error) { diff --git a/src/cpp/include/nodegui/QtWidgets/QAbstractButton/qabstractbutton_macro.h b/src/cpp/include/nodegui/QtWidgets/QAbstractButton/qabstractbutton_macro.h index 1ab44e910..a6014f651 100644 --- a/src/cpp/include/nodegui/QtWidgets/QAbstractButton/qabstractbutton_macro.h +++ b/src/cpp/include/nodegui/QtWidgets/QAbstractButton/qabstractbutton_macro.h @@ -43,3 +43,31 @@ InstanceMethod("setIcon", &WidgetWrapName::setIcon), #endif // QABSTRACTBUTTON_WRAPPED_METHODS_EXPORT_DEFINE + +#ifndef QABSTRACT_BUTTON_SIGNALS +#define QABSTRACT_BUTTON_SIGNALS \ + QWIDGET_SIGNALS \ + QObject::connect(this, &QAbstractButton::clicked, [=](bool checked) { \ + Napi::Env env = this->emitOnNode.Env(); \ + Napi::HandleScope scope(env); \ + this->emitOnNode.Call( \ + {Napi::String::New(env, "clicked"), Napi::Value::From(env, checked)}); \ + }); \ + QObject::connect(this, &QAbstractButton::pressed, [=]() { \ + Napi::Env env = this->emitOnNode.Env(); \ + Napi::HandleScope scope(env); \ + this->emitOnNode.Call({Napi::String::New(env, "pressed")}); \ + }); \ + QObject::connect(this, &QAbstractButton::released, [=]() { \ + Napi::Env env = this->emitOnNode.Env(); \ + Napi::HandleScope scope(env); \ + this->emitOnNode.Call({Napi::String::New(env, "released")}); \ + }); \ + QObject::connect(this, &QAbstractButton::toggled, [=](bool checked) { \ + Napi::Env env = this->emitOnNode.Env(); \ + Napi::HandleScope scope(env); \ + this->emitOnNode.Call( \ + {Napi::String::New(env, "toggled"), Napi::Value::From(env, checked)}); \ + }); + +#endif diff --git a/src/cpp/include/nodegui/QtWidgets/QAction/naction.hpp b/src/cpp/include/nodegui/QtWidgets/QAction/naction.hpp index 6bc9a5008..0254fe686 100644 --- a/src/cpp/include/nodegui/QtWidgets/QAction/naction.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QAction/naction.hpp @@ -10,7 +10,7 @@ class NAction : public QAction, public EventWidget { EVENTWIDGET_IMPLEMENTATIONS(QAction) public: using QAction::QAction; // inherit all constructors of QAction - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QAction::triggered, [=](bool checked) { Napi::Env env = this->emitOnNode.Env(); diff --git a/src/cpp/include/nodegui/QtWidgets/QAction/qaction_wrap.h b/src/cpp/include/nodegui/QtWidgets/QAction/qaction_wrap.h index ea0e6f3b9..3345b3a37 100644 --- a/src/cpp/include/nodegui/QtWidgets/QAction/qaction_wrap.h +++ b/src/cpp/include/nodegui/QtWidgets/QAction/qaction_wrap.h @@ -9,6 +9,7 @@ class QActionWrap : public Napi::ObjectWrap { private: QPointer instance; + bool disableDeletion; public: static Napi::Object init(Napi::Env env, Napi::Object exports); diff --git a/src/cpp/include/nodegui/QtWidgets/QCheckBox/ncheckbox.hpp b/src/cpp/include/nodegui/QtWidgets/QCheckBox/ncheckbox.hpp index 2f08e5d7e..6bfa0fda5 100644 --- a/src/cpp/include/nodegui/QtWidgets/QCheckBox/ncheckbox.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QCheckBox/ncheckbox.hpp @@ -2,6 +2,8 @@ #include +#include "QtWidgets/QAbstractButton/qabstractbutton_macro.h" +#include "QtWidgets/QWidget/qwidget_macro.h" #include "core/NodeWidget/nodewidget.h" #include "napi.h" @@ -11,12 +13,5 @@ class NCheckBox : public QCheckBox, public NodeWidget { public: using QCheckBox::QCheckBox; // inherit all constructors of QCheckBox - void connectWidgetSignalsToEventEmitter() { - QObject::connect(this, &QCheckBox::toggled, [=](bool checked) { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call( - {Napi::String::New(env, "toggled"), Napi::Value::From(env, checked)}); - }); - } + void connectSignalsToEventEmitter() { QABSTRACT_BUTTON_SIGNALS } }; diff --git a/src/cpp/include/nodegui/QtWidgets/QComboBox/ncombobox.hpp b/src/cpp/include/nodegui/QtWidgets/QComboBox/ncombobox.hpp index 76ca4d4f5..3be4c1883 100644 --- a/src/cpp/include/nodegui/QtWidgets/QComboBox/ncombobox.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QComboBox/ncombobox.hpp @@ -11,7 +11,7 @@ class NComboBox : public QComboBox, public NodeWidget { NODEWIDGET_IMPLEMENTATIONS(QComboBox) using QComboBox::QComboBox; - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect( this, QOverload::of(&QComboBox::currentIndexChanged), diff --git a/src/cpp/include/nodegui/QtWidgets/QDial/ndial.hpp b/src/cpp/include/nodegui/QtWidgets/QDial/ndial.hpp index e1662b514..2a7a921f8 100644 --- a/src/cpp/include/nodegui/QtWidgets/QDial/ndial.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QDial/ndial.hpp @@ -10,7 +10,7 @@ class NDial : public QDial, public NodeWidget { public: using QDial::QDial; // inherit all constructors of QDial - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QDial::valueChanged, [=](int value) { Napi::Env env = this->emitOnNode.Env(); diff --git a/src/cpp/include/nodegui/QtWidgets/QFileDialog/nfiledialog.hpp b/src/cpp/include/nodegui/QtWidgets/QFileDialog/nfiledialog.hpp index b5da8cacb..cf5de9fc9 100644 --- a/src/cpp/include/nodegui/QtWidgets/QFileDialog/nfiledialog.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QFileDialog/nfiledialog.hpp @@ -11,7 +11,7 @@ class NFileDialog : public QFileDialog, public NodeWidget { NODEWIDGET_IMPLEMENTATIONS(QFileDialog) using QFileDialog::QFileDialog; - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect( this, &QFileDialog::currentChanged, [=](const QString &path) { diff --git a/src/cpp/include/nodegui/QtWidgets/QGroupBox/ngroupbox.hpp b/src/cpp/include/nodegui/QtWidgets/QGroupBox/ngroupbox.hpp index 7bc0773d4..f7a7613b6 100644 --- a/src/cpp/include/nodegui/QtWidgets/QGroupBox/ngroupbox.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QGroupBox/ngroupbox.hpp @@ -11,7 +11,7 @@ class NGroupBox : public QGroupBox, public NodeWidget { public: using QGroupBox::QGroupBox; // inherit all constructors of QGroupBox - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { QObject::connect(this, &QGroupBox::clicked, [=](bool checked) { Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); diff --git a/src/cpp/include/nodegui/QtWidgets/QLabel/nlabel.hpp b/src/cpp/include/nodegui/QtWidgets/QLabel/nlabel.hpp index ca114c425..b42c20482 100644 --- a/src/cpp/include/nodegui/QtWidgets/QLabel/nlabel.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QLabel/nlabel.hpp @@ -2,6 +2,7 @@ #include +#include "QtWidgets/QWidget/qwidget_macro.h" #include "core/NodeWidget/nodewidget.h" class NLabel : public QLabel, public NodeWidget { @@ -10,8 +11,8 @@ class NLabel : public QLabel, public NodeWidget { public: using QLabel::QLabel; // inherit all constructors of QLabel - void connectWidgetSignalsToEventEmitter() { - // Qt Connects: Implement all signal connects here + void connectSignalsToEventEmitter() { + QWIDGET_SIGNALS QObject::connect(this, &QLabel::linkActivated, [=](const QString &link) { Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); diff --git a/src/cpp/include/nodegui/QtWidgets/QLineEdit/nlineedit.hpp b/src/cpp/include/nodegui/QtWidgets/QLineEdit/nlineedit.hpp index 725957851..30922379f 100644 --- a/src/cpp/include/nodegui/QtWidgets/QLineEdit/nlineedit.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QLineEdit/nlineedit.hpp @@ -10,7 +10,7 @@ class NLineEdit : public QLineEdit, public NodeWidget { public: using QLineEdit::QLineEdit; // inherit all constructors of QLineEdit - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QLineEdit::cursorPositionChanged, [=](int oldPost, int newPos) { diff --git a/src/cpp/include/nodegui/QtWidgets/QPlainTextEdit/nplaintextedit.hpp b/src/cpp/include/nodegui/QtWidgets/QPlainTextEdit/nplaintextedit.hpp index 24834e077..c78b6db19 100644 --- a/src/cpp/include/nodegui/QtWidgets/QPlainTextEdit/nplaintextedit.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QPlainTextEdit/nplaintextedit.hpp @@ -11,7 +11,7 @@ class NPlainTextEdit : public QPlainTextEdit, public NodeWidget { using QPlainTextEdit::QPlainTextEdit; // inherit all constructors of // QPlainTextEdit - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QPlainTextEdit::textChanged, [=]() { Napi::Env env = this->emitOnNode.Env(); diff --git a/src/cpp/include/nodegui/QtWidgets/QPushButton/npushbutton.hpp b/src/cpp/include/nodegui/QtWidgets/QPushButton/npushbutton.hpp index a03f527d5..9ea88a978 100644 --- a/src/cpp/include/nodegui/QtWidgets/QPushButton/npushbutton.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QPushButton/npushbutton.hpp @@ -2,6 +2,8 @@ #include +#include "QtWidgets/QAbstractButton/qabstractbutton_macro.h" +#include "QtWidgets/QWidget/qwidget_macro.h" #include "core/NodeWidget/nodewidget.h" #include "napi.h" @@ -11,29 +13,5 @@ class NPushButton : public QPushButton, public NodeWidget { public: using QPushButton::QPushButton; // inherit all constructors of QPushButton - void connectWidgetSignalsToEventEmitter() { - // Qt Connects: Implement all signal connects here - QObject::connect(this, &QPushButton::clicked, [=](bool checked) { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call( - {Napi::String::New(env, "clicked"), Napi::Value::From(env, checked)}); - }); - QObject::connect(this, &QPushButton::released, [=]() { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call({Napi::String::New(env, "released")}); - }); - QObject::connect(this, &QPushButton::pressed, [=]() { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call({Napi::String::New(env, "pressed")}); - }); - QObject::connect(this, &QPushButton::toggled, [=](bool checked) { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call( - {Napi::String::New(env, "toggled"), Napi::Value::From(env, checked)}); - }); - } + void connectSignalsToEventEmitter() { QABSTRACT_BUTTON_SIGNALS } }; diff --git a/src/cpp/include/nodegui/QtWidgets/QRadioButton/nradiobutton.hpp b/src/cpp/include/nodegui/QtWidgets/QRadioButton/nradiobutton.hpp index 437e21dde..aeac1d9b3 100644 --- a/src/cpp/include/nodegui/QtWidgets/QRadioButton/nradiobutton.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QRadioButton/nradiobutton.hpp @@ -2,6 +2,8 @@ #include +#include "QtWidgets/QAbstractButton/qabstractbutton_macro.h" +#include "QtWidgets/QWidget/qwidget_macro.h" #include "core/NodeWidget/nodewidget.h" class NRadioButton : public QRadioButton, public NodeWidget { @@ -9,4 +11,8 @@ class NRadioButton : public QRadioButton, public NodeWidget { NODEWIDGET_IMPLEMENTATIONS(QRadioButton) public: using QRadioButton::QRadioButton; // inherit all constructors of QRadioButton + void connectSignalsToEventEmitter() { + // Qt Connects: Implement all signal connects here + QABSTRACT_BUTTON_SIGNALS + } }; diff --git a/src/cpp/include/nodegui/QtWidgets/QShortcut/nshortcut.hpp b/src/cpp/include/nodegui/QtWidgets/QShortcut/nshortcut.hpp index 6a108fb21..c89f3a482 100644 --- a/src/cpp/include/nodegui/QtWidgets/QShortcut/nshortcut.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QShortcut/nshortcut.hpp @@ -10,7 +10,7 @@ class NShortcut : public QShortcut, public EventWidget { EVENTWIDGET_IMPLEMENTATIONS(QShortcut) public: using QShortcut::QShortcut; // inherit all constructors of QShortcut - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QShortcut::activated, [=]() { Napi::Env env = this->emitOnNode.Env(); diff --git a/src/cpp/include/nodegui/QtWidgets/QSpinBox/nspinbox.hpp b/src/cpp/include/nodegui/QtWidgets/QSpinBox/nspinbox.hpp index 10bb3d383..1343c04dc 100644 --- a/src/cpp/include/nodegui/QtWidgets/QSpinBox/nspinbox.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QSpinBox/nspinbox.hpp @@ -11,7 +11,7 @@ class NSpinBox : public QSpinBox, public NodeWidget { public: using QSpinBox::QSpinBox; // inherit all constructors of QSpinBox - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect( this, QOverload::of(&QSpinBox::valueChanged), [=](int val) { diff --git a/src/cpp/include/nodegui/QtWidgets/QStackedWidget/nstackedwidget.hpp b/src/cpp/include/nodegui/QtWidgets/QStackedWidget/nstackedwidget.hpp index 653d5b1af..8e0569ad1 100644 --- a/src/cpp/include/nodegui/QtWidgets/QStackedWidget/nstackedwidget.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QStackedWidget/nstackedwidget.hpp @@ -12,7 +12,7 @@ class NStackedWidget : public QStackedWidget, public NodeWidget { using QStackedWidget::QStackedWidget; // inherit all constructors of // QStackedWidget - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QStackedWidget::currentChanged, [=](int index) { Napi::Env env = this->emitOnNode.Env(); diff --git a/src/cpp/include/nodegui/QtWidgets/QSystemTrayIcon/nsystemtrayicon.hpp b/src/cpp/include/nodegui/QtWidgets/QSystemTrayIcon/nsystemtrayicon.hpp index f6734dcc1..cd191081c 100644 --- a/src/cpp/include/nodegui/QtWidgets/QSystemTrayIcon/nsystemtrayicon.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QSystemTrayIcon/nsystemtrayicon.hpp @@ -11,7 +11,7 @@ class NSystemTrayIcon : public QSystemTrayIcon, public EventWidget { public: // inherit all constructors of QSystemTrayIcon using QSystemTrayIcon::QSystemTrayIcon; - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { QObject::connect(this, &QSystemTrayIcon::activated, [=](int reason) { Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); diff --git a/src/cpp/include/nodegui/QtWidgets/QTabWidget/ntabwidget.hpp b/src/cpp/include/nodegui/QtWidgets/QTabWidget/ntabwidget.hpp index b62c87bc2..4e47fb609 100644 --- a/src/cpp/include/nodegui/QtWidgets/QTabWidget/ntabwidget.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QTabWidget/ntabwidget.hpp @@ -11,7 +11,7 @@ class NTabWidget : public QTabWidget, public NodeWidget { public: using QTabWidget::QTabWidget; // inherit all constructors of QTabWidget - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QTabWidget::currentChanged, [=](int index) { Napi::Env env = this->emitOnNode.Env(); diff --git a/src/cpp/include/nodegui/QtWidgets/QTableWidget/ntablewidget.hpp b/src/cpp/include/nodegui/QtWidgets/QTableWidget/ntablewidget.hpp index d93e13bc3..0fd07ddb5 100644 --- a/src/cpp/include/nodegui/QtWidgets/QTableWidget/ntablewidget.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QTableWidget/ntablewidget.hpp @@ -10,7 +10,7 @@ class NTableWidget : public QTableWidget, public NodeWidget { Q_OBJECT NODEWIDGET_IMPLEMENTATIONS(QTableWidget) using QTableWidget::QTableWidget; - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect( this, &QTableWidget::cellActivated, [=](int row, int column) { diff --git a/src/cpp/include/nodegui/QtWidgets/QToolButton/ntoolbutton.hpp b/src/cpp/include/nodegui/QtWidgets/QToolButton/ntoolbutton.hpp index eb6ff2942..f1c033c16 100644 --- a/src/cpp/include/nodegui/QtWidgets/QToolButton/ntoolbutton.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QToolButton/ntoolbutton.hpp @@ -3,6 +3,7 @@ #include #include +#include "QtWidgets/QAbstractButton/qabstractbutton_macro.h" #include "QtWidgets/QAction/qaction_wrap.h" #include "core/NodeWidget/nodewidget.h" #include "napi.h" @@ -13,36 +14,17 @@ class NToolButton : public QToolButton, public NodeWidget { public: using QToolButton::QToolButton; // inherit all constructors of QToolButton - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here - QObject::connect(this, &QToolButton::clicked, [=](bool checked) { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call( - {Napi::String::New(env, "clicked"), Napi::Value::From(env, checked)}); - }); - QObject::connect(this, &QToolButton::released, [=]() { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call({Napi::String::New(env, "released")}); - }); - QObject::connect(this, &QToolButton::pressed, [=]() { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call({Napi::String::New(env, "pressed")}); - }); - QObject::connect(this, &QToolButton::toggled, [=](bool checked) { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - this->emitOnNode.Call( - {Napi::String::New(env, "toggled"), Napi::Value::From(env, checked)}); - }); + QABSTRACT_BUTTON_SIGNALS QObject::connect(this, &QToolButton::triggered, [=](QAction *action) { Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); + // disable deletion of the native instance for these by passing true auto instance = QActionWrap::constructor.New( - {Napi::External::New(env, action)}); + {Napi::External::New(env, action), + Napi::Boolean::New(env, true)}); this->emitOnNode.Call({Napi::String::New(env, "triggered"), instance}); }); } diff --git a/src/cpp/include/nodegui/QtWidgets/QTreeWidget/ntreewidget.hpp b/src/cpp/include/nodegui/QtWidgets/QTreeWidget/ntreewidget.hpp index f70dfc228..69e70ad1d 100644 --- a/src/cpp/include/nodegui/QtWidgets/QTreeWidget/ntreewidget.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QTreeWidget/ntreewidget.hpp @@ -12,7 +12,7 @@ class NTreeWidget : public QTreeWidget, public NodeWidget { public: using QTreeWidget::QTreeWidget; // inherit all constructors of QTreeWidget - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { QObject::connect(this, &QTreeWidget::itemSelectionChanged, [=]() { Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); diff --git a/src/cpp/include/nodegui/QtWidgets/QWidget/nwidget.hpp b/src/cpp/include/nodegui/QtWidgets/QWidget/nwidget.hpp index 422c14c2c..2eca30f89 100644 --- a/src/cpp/include/nodegui/QtWidgets/QWidget/nwidget.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QWidget/nwidget.hpp @@ -4,6 +4,7 @@ #include #include +#include "QtWidgets/QWidget/qwidget_macro.h" #include "core/NodeWidget/nodewidget.h" class NWidget : public QWidget, public NodeWidget { @@ -12,11 +13,13 @@ class NWidget : public QWidget, public NodeWidget { public: using QWidget::QWidget; // https://doc.qt.io/qt-5/stylesheet-reference.html - void paintEvent(QPaintEvent *e) override { + void paintEvent(QPaintEvent* e) override { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); QWidget::paintEvent(e); } + + void connectSignalsToEventEmitter() { QWIDGET_SIGNALS } }; diff --git a/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h b/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h index e9962513e..2025b803d 100644 --- a/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h +++ b/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h @@ -363,3 +363,34 @@ InstanceMethod("showNormal", &WidgetWrapName::showNormal), #endif // QWIDGET_WRAPPED_METHODS_EXPORT_DEFINE + +#ifndef QWIDGET_SIGNALS +#define QWIDGET_SIGNALS \ + QOBJECT_SIGNALS \ + QObject::connect( \ + this, &QWidget::windowTitleChanged, [=](const QString& title) { \ + Napi::Env env = this->emitOnNode.Env(); \ + Napi::HandleScope scope(env); \ + this->emitOnNode.Call({Napi::String::New(env, "windowTitleChanged"), \ + Napi::Value::From(env, title.toStdString())}); \ + }); \ + QObject::connect(this, &QWidget::windowIconChanged, [=](const QIcon& icon) { \ + Napi::Env env = this->emitOnNode.Env(); \ + Napi::HandleScope scope(env); \ + auto instance = QIconWrap::constructor.New( \ + {Napi::External::New(env, new QIcon(icon))}); \ + this->emitOnNode.Call( \ + {Napi::String::New(env, "windowIconChanged"), instance}); \ + }); \ + QObject::connect( \ + this, &QWidget::customContextMenuRequested, [=](const QPoint& pos) { \ + Napi::Env env = this->emitOnNode.Env(); \ + Napi::HandleScope scope(env); \ + auto instance = Napi::Object::New(env); \ + instance.Set("x", Napi::Number::New(env, pos.x())); \ + instance.Set("y", Napi::Number::New(env, pos.y())); \ + this->emitOnNode.Call( \ + {Napi::String::New(env, "customContextMenuRequested"), instance}); \ + }); + +#endif // QWIDGET_SIGNALS diff --git a/src/cpp/include/nodegui/core/Events/eventwidget.h b/src/cpp/include/nodegui/core/Events/eventwidget.h index 2eb9e175f..5d1496b94 100644 --- a/src/cpp/include/nodegui/core/Events/eventwidget.h +++ b/src/cpp/include/nodegui/core/Events/eventwidget.h @@ -16,7 +16,7 @@ class EventWidget { void event(QEvent* event); - void connectWidgetSignalsToEventEmitter(); + void connectSignalsToEventEmitter(); ~EventWidget(); }; \ No newline at end of file diff --git a/src/cpp/include/nodegui/core/Events/eventwidget_macro.h b/src/cpp/include/nodegui/core/Events/eventwidget_macro.h index 2b5b80331..5a5e5f6b6 100644 --- a/src/cpp/include/nodegui/core/Events/eventwidget_macro.h +++ b/src/cpp/include/nodegui/core/Events/eventwidget_macro.h @@ -19,7 +19,7 @@ Napi::Env env = info.Env(); \ this->instance->emitOnNode = \ Napi::Persistent(info[0].As()); \ - this->instance->connectWidgetSignalsToEventEmitter(); \ + this->instance->connectSignalsToEventEmitter(); \ return env.Null(); \ } \ \ diff --git a/src/cpp/lib/QtCore/QVariant/qvariant_wrap.cpp b/src/cpp/lib/QtCore/QVariant/qvariant_wrap.cpp index 0cf4ea102..b34e68c76 100644 --- a/src/cpp/lib/QtCore/QVariant/qvariant_wrap.cpp +++ b/src/cpp/lib/QtCore/QVariant/qvariant_wrap.cpp @@ -13,6 +13,8 @@ Napi::Object QVariantWrap::init(Napi::Env env, Napi::Object exports) { InstanceMethod("toInt", &QVariantWrap::toInt), InstanceMethod("toDouble", &QVariantWrap::toDouble), InstanceMethod("toBool", &QVariantWrap::toBool), + StaticMethod("converToQVariant", + &StaticQVariantWrapMethods::converToQVariant), COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE}); constructor = Napi::Persistent(func); exports.Set(CLASSNAME, func); @@ -26,9 +28,8 @@ QVariantWrap::QVariantWrap(const Napi::CallbackInfo& info) Napi::Env env = info.Env(); Napi::HandleScope scope(env); if (info.Length() == 1) { - Napi::Value value = info[0].As(); this->instance = - QSharedPointer(extrautils::convertToQVariant(env, value)); + QSharedPointer(info[0].As>().Data()); } else { this->instance = QSharedPointer(new QVariant()); } @@ -59,3 +60,16 @@ Napi::Value QVariantWrap::toBool(const Napi::CallbackInfo& info) { bool value = this->instance->value(); return Napi::Value::From(env, value); } + +Napi::Value StaticQVariantWrapMethods::converToQVariant( + const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::Value value = info[0]; + QVariant* variant = extrautils::convertToQVariant(env, value); + // Use the variant from extrautils::convertToQVariant function as is and do + // not create a copy to prevent memory leak + auto instance = QVariantWrap::constructor.New( + {Napi::External::New(env, variant)}); + return instance; +} diff --git a/src/cpp/lib/QtWidgets/QAction/qaction_wrap.cpp b/src/cpp/lib/QtWidgets/QAction/qaction_wrap.cpp index 578d56363..e7cf1270f 100644 --- a/src/cpp/lib/QtWidgets/QAction/qaction_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QAction/qaction_wrap.cpp @@ -38,22 +38,34 @@ QActionWrap::QActionWrap(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 NAction(parentWidgetWrap->getInternalInstance()); - } else if (info.Length() == 0) { - this->instance = new NAction(); + if (info.Length() > 0 && info[0].IsExternal()) { + // --- if external --- + this->instance = info[0].As>().Data(); + if (info.Length() == 2) { + this->disableDeletion = info[1].As().Value(); + } } else { - Napi::TypeError::New(env, "Wrong number of arguments") - .ThrowAsJavaScriptException(); + // --- regular cases --- + if (info.Length() == 1) { + Napi::Object parentObject = info[0].As(); + QWidgetWrap* parentWidgetWrap = + Napi::ObjectWrap::Unwrap(parentObject); + this->instance = new NAction(parentWidgetWrap->getInternalInstance()); + } else if (info.Length() == 0) { + this->instance = new NAction(); + } else { + Napi::TypeError::New(env, "Wrong number of arguments") + .ThrowAsJavaScriptException(); + } } this->rawData = extrautils::configureQObject(this->getInternalInstance()); } -QActionWrap::~QActionWrap() { extrautils::safeDelete(this->instance); } +QActionWrap::~QActionWrap() { + if (!this->disableDeletion) { + extrautils::safeDelete(this->instance); + } +} Napi::Value QActionWrap::setText(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); diff --git a/src/cpp/lib/core/Events/eventwidget.cpp b/src/cpp/lib/core/Events/eventwidget.cpp index 283bc8418..ebffcdf07 100644 --- a/src/cpp/lib/core/Events/eventwidget.cpp +++ b/src/cpp/lib/core/Events/eventwidget.cpp @@ -47,7 +47,7 @@ void EventWidget::event(QEvent* event) { } } -void EventWidget::connectWidgetSignalsToEventEmitter() { +void EventWidget::connectSignalsToEventEmitter() { // Do nothing // This method should be overriden in sub classes to connect all signals to // event emiiter of node. See Push button diff --git a/src/index.ts b/src/index.ts index 0d369a557..59790cd14 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,39 +22,43 @@ export { NodeWidget } from './lib/QtWidgets/QWidget'; export { NodeLayout } from './lib/QtWidgets/QLayout'; export { QAbstractScrollArea } from './lib/QtWidgets/QAbstractScrollArea'; export { QAbstractSlider } from './lib/QtWidgets/QAbstractSlider'; -export { QAbstractButton } from './lib/QtWidgets/QAbstractButton'; +export { QAbstractButton, QAbstractButtonSignals } from './lib/QtWidgets/QAbstractButton'; // Widgets: -export { QWidget } from './lib/QtWidgets/QWidget'; -export { QCheckBox } from './lib/QtWidgets/QCheckBox'; -export { QLabel } from './lib/QtWidgets/QLabel'; -export { QDial } from './lib/QtWidgets/QDial'; -export { QFileDialog } from './lib/QtWidgets/QFileDialog'; -export { QLineEdit, EchoMode } from './lib/QtWidgets/QLineEdit'; -export { QMainWindow } from './lib/QtWidgets/QMainWindow'; -export { QProgressBar } from './lib/QtWidgets/QProgressBar'; -export { QComboBox, InsertPolicy } from './lib/QtWidgets/QComboBox'; -export { QPushButton } from './lib/QtWidgets/QPushButton'; -export { QToolButton, ToolButtonPopupMode } from './lib/QtWidgets/QToolButton'; -export { QSpinBox } from './lib/QtWidgets/QSpinBox'; -export { QRadioButton } from './lib/QtWidgets/QRadioButton'; -export { QStackedWidget } from './lib/QtWidgets/QStackedWidget'; -export { QTabWidget } from './lib/QtWidgets/QTabWidget'; -export { QTableWidget } from './lib/QtWidgets/QTableWidget'; +export { QWidget, QWidgetSignals } from './lib/QtWidgets/QWidget'; +export { QCheckBox, QCheckBoxSignals } from './lib/QtWidgets/QCheckBox'; +export { QLabel, QLabelSignals } from './lib/QtWidgets/QLabel'; +export { QDial, QDialSignals } from './lib/QtWidgets/QDial'; +export { QFileDialog, QFileDialogSignals } from './lib/QtWidgets/QFileDialog'; +export { QLineEdit, QLineEditSignals, EchoMode } from './lib/QtWidgets/QLineEdit'; +export { QMainWindow, QMainWindowSignals } from './lib/QtWidgets/QMainWindow'; +export { QProgressBar, QProgressBarSignals } from './lib/QtWidgets/QProgressBar'; +export { QComboBox, QComboBoxSignals, InsertPolicy } from './lib/QtWidgets/QComboBox'; +export { QPushButton, QPushButtonSignals } from './lib/QtWidgets/QPushButton'; +export { QToolButton, QToolButtonSignals, ToolButtonPopupMode } from './lib/QtWidgets/QToolButton'; +export { QSpinBox, QSpinBoxSignals } from './lib/QtWidgets/QSpinBox'; +export { QRadioButton, QRadioButtonSignals } from './lib/QtWidgets/QRadioButton'; +export { QStackedWidget, QStackedWidgetSignals } from './lib/QtWidgets/QStackedWidget'; +export { QTabWidget, QTabWidgetSignals } from './lib/QtWidgets/QTabWidget'; +export { QTableWidget, QTableWidgetSignals } from './lib/QtWidgets/QTableWidget'; export { QTableWidgetItem } from './lib/QtWidgets/QTableWidgetItem'; -export { QMenu } from './lib/QtWidgets/QMenu'; -export { QMenuBar } from './lib/QtWidgets/QMenuBar'; -export { QPlainTextEdit, LineWrapMode } from './lib/QtWidgets/QPlainTextEdit'; -export { QScrollArea } from './lib/QtWidgets/QScrollArea'; -export { QTreeWidget } from './lib/QtWidgets/QTreeWidget'; +export { QMenu, QMenuSignals } from './lib/QtWidgets/QMenu'; +export { QMenuBar, QMenuBarSignals } from './lib/QtWidgets/QMenuBar'; +export { QPlainTextEdit, QPlainTextEditSignals, LineWrapMode } from './lib/QtWidgets/QPlainTextEdit'; +export { QScrollArea, QScrollAreaSignals } from './lib/QtWidgets/QScrollArea'; +export { QTreeWidget, QTreeWidgetSignals } from './lib/QtWidgets/QTreeWidget'; export { QTreeWidgetItem } from './lib/QtWidgets/QTreeWidgetItem'; export { QPainter, RenderHint } from './lib/QtWidgets/QPainter'; -export { QSystemTrayIcon, QSystemTrayIconActivationReason } from './lib/QtWidgets/QSystemTrayIcon'; -export { QAction } from './lib/QtWidgets/QAction'; -export { QShortcut } from './lib/QtWidgets/QShortcut'; -export { QGroupBox } from './lib/QtWidgets/QGroupBox'; +export { + QSystemTrayIcon, + QSystemTrayIconSignals, + QSystemTrayIconActivationReason, +} from './lib/QtWidgets/QSystemTrayIcon'; +export { QAction, QActionSignals } from './lib/QtWidgets/QAction'; +export { QShortcut, QShortcutSignals } from './lib/QtWidgets/QShortcut'; +export { QGroupBox, QGroupBoxSignals } from './lib/QtWidgets/QGroupBox'; // Core -export { QObject, NodeObject } from './lib/QtCore/QObject'; +export { QObject, QObjectSignals, NodeObject } from './lib/QtCore/QObject'; export { QVariant } from './lib/QtCore/QVariant'; export { QSize } from './lib/QtCore/QSize'; export { QRect } from './lib/QtCore/QRect'; @@ -62,9 +66,9 @@ export { QPoint } from './lib/QtCore/QPoint'; export { QColor } from './lib/QtCore/QColor'; export { QUrl, ParsingMode } from './lib/QtCore/QUrl'; // Layouts: -export { QBoxLayout } from './lib/QtWidgets/QBoxLayout'; -export { QGridLayout } from './lib/QtWidgets/QGridLayout'; -export { FlexLayout } from './lib/core/FlexLayout'; +export { QBoxLayout, QBoxLayoutSignals } from './lib/QtWidgets/QBoxLayout'; +export { QGridLayout, QGridLayoutSignals } from './lib/QtWidgets/QGridLayout'; +export { FlexLayout, FlexLayoutSignals } from './lib/core/FlexLayout'; // Others: export { StyleSheet } from './lib/core/Style/StyleSheet'; export { NativeElement, Component } from './lib/core/Component'; diff --git a/src/lib/QtCore/QObject.ts b/src/lib/QtCore/QObject.ts index fc8c2adb8..82afeb6bb 100644 --- a/src/lib/QtCore/QObject.ts +++ b/src/lib/QtCore/QObject.ts @@ -2,15 +2,14 @@ import { EventWidget } from '../core/EventWidget'; import { NativeElement } from '../core/Component'; import { checkIfNativeElement } from '../utils/helpers'; import addon from '../utils/addon'; -import { QVariant } from './QVariant'; +import { QVariant, QVariantType } from './QVariant'; export abstract class NodeObject extends EventWidget { inherits(className: string): boolean { return this.native.inherits(className); } - setProperty(name: string, value: any): boolean { - const finalValue = value.native || value; - return this.native.setProperty(name, finalValue); + setProperty(name: string, value: QVariantType): boolean { + return this.native.setProperty(name, value); } property(name: string): QVariant { const nativeVariant = this.native.property(name); @@ -24,6 +23,10 @@ export abstract class NodeObject extends EventWidget { } } +export interface QObjectSignals { + objectNameChanged: (objectName: string) => void; +} + export class QObject extends NodeObject { native: NativeElement; constructor(); @@ -45,5 +48,3 @@ export class QObject extends NodeObject { this.native = native; } } - -type QObjectSignals = {}; diff --git a/src/lib/QtCore/QVariant.ts b/src/lib/QtCore/QVariant.ts index f5b8a939e..ca12c4e7b 100644 --- a/src/lib/QtCore/QVariant.ts +++ b/src/lib/QtCore/QVariant.ts @@ -2,7 +2,7 @@ import { NativeElement, Component } from '../core/Component'; import addon from '../utils/addon'; import { checkIfNativeElement } from '../utils/helpers'; -type QVariantType = Component | string | number | boolean; +export type QVariantType = NativeElement | string | number | boolean; export class QVariant extends Component { native: NativeElement; @@ -11,11 +11,10 @@ export class QVariant extends Component { constructor(variant: QVariantType); constructor(arg?: QVariantType | NativeElement) { super(); - if (checkIfNativeElement(arg)) { + if (checkIfNativeElement(arg) && arg instanceof addon.QVariant) { this.native = arg as NativeElement; } else if (arg) { - const component = (arg as Component).native || arg; - this.native = new addon.QVariant(component); + this.native = new addon.QVariant.converToQVariant(arg); } else { this.native = new addon.QVariant(); } diff --git a/src/lib/QtCore/__tests__/QColor.test.ts b/src/lib/QtCore/__tests__/QColor.test.ts index b1ac876e4..8db618d73 100644 --- a/src/lib/QtCore/__tests__/QColor.test.ts +++ b/src/lib/QtCore/__tests__/QColor.test.ts @@ -60,7 +60,7 @@ describe('QColor', () => { it('initialize from QVariant', () => { const color = new QColor(10, 10, 10); - const variant = new QVariant(color); + const variant = new QVariant(color.native); expect(variant).toBeTruthy(); expect(QColor.fromQVariant(variant).red()).toBe(10); }); diff --git a/src/lib/QtCore/__tests__/QPoint.test.ts b/src/lib/QtCore/__tests__/QPoint.test.ts index 1c9a09236..70c312b8f 100644 --- a/src/lib/QtCore/__tests__/QPoint.test.ts +++ b/src/lib/QtCore/__tests__/QPoint.test.ts @@ -27,7 +27,7 @@ describe('QPoint', () => { }); it('initialize from QVariant', () => { const point = new QPoint(10, 10); - const variant = new QVariant(point); + const variant = new QVariant(point.native); expect(variant).toBeTruthy(); expect(QPoint.fromQVariant(variant).x()).toBe(point.x()); }); diff --git a/src/lib/QtCore/__tests__/QRect.test.ts b/src/lib/QtCore/__tests__/QRect.test.ts index d665bc2ce..6cbf11552 100644 --- a/src/lib/QtCore/__tests__/QRect.test.ts +++ b/src/lib/QtCore/__tests__/QRect.test.ts @@ -32,7 +32,7 @@ describe('QRect', () => { }); it('initialize from QVariant', () => { const rect = new QRect(10, 10, 300, 200); - const variant = new QVariant(rect); + const variant = new QVariant(rect.native); expect(variant).toBeTruthy(); expect(QRect.fromQVariant(variant).left()).toBe(rect.left()); }); diff --git a/src/lib/QtCore/__tests__/QSize.test.ts b/src/lib/QtCore/__tests__/QSize.test.ts index 7adbdd3ec..f45a9fded 100644 --- a/src/lib/QtCore/__tests__/QSize.test.ts +++ b/src/lib/QtCore/__tests__/QSize.test.ts @@ -22,7 +22,7 @@ describe('QSize', () => { }); it('initialize from QVariant', () => { const size = new QSize(300, 200); - const variant = new QVariant(size); + const variant = new QVariant(size.native); expect(variant).toBeTruthy(); expect(QSize.fromQVariant(variant).height()).toBe(size.height()); }); diff --git a/src/lib/QtCore/__tests__/QUrl.test.ts b/src/lib/QtCore/__tests__/QUrl.test.ts index 9ffbd1384..9f7c09c43 100644 --- a/src/lib/QtCore/__tests__/QUrl.test.ts +++ b/src/lib/QtCore/__tests__/QUrl.test.ts @@ -17,7 +17,7 @@ describe('QUrl', () => { }); it('initialize from QVariant', () => { const url = new QUrl('https://google.com'); - const variant = new QVariant(url); + const variant = new QVariant(url.native); expect(variant).toBeTruthy(); expect(QUrl.fromQVariant(variant).toString()).toBe('https://google.com'); }); diff --git a/src/lib/QtCore/__tests__/QVariant.test.ts b/src/lib/QtCore/__tests__/QVariant.test.ts index 78b0f8ce3..fcffb5b7a 100644 --- a/src/lib/QtCore/__tests__/QVariant.test.ts +++ b/src/lib/QtCore/__tests__/QVariant.test.ts @@ -29,7 +29,7 @@ describe('QVariant', () => { }); it('initialize with complex objects', () => { const pixmap = new QPixmap(path.resolve(__dirname, 'nodegui.png')); - const variant = new QVariant(pixmap); + const variant = new QVariant(pixmap.native); expect(variant).toBeTruthy(); expect(QPixmap.fromQVariant(variant).height()).toBe(pixmap.height()); }); diff --git a/src/lib/QtGui/QMovie.ts b/src/lib/QtGui/QMovie.ts index bd4c57fb8..17531af03 100644 --- a/src/lib/QtGui/QMovie.ts +++ b/src/lib/QtGui/QMovie.ts @@ -75,7 +75,7 @@ export class QMovie extends NodeObject { } } -interface QMovieSignals { +export interface QMovieSignals { error: (error: ImageReaderError) => void; finished: () => void; frameChanged: (frameNumber?: number) => void; diff --git a/src/lib/QtGui/__tests__/QIcon.test.ts b/src/lib/QtGui/__tests__/QIcon.test.ts index 3efff97db..ecd911448 100644 --- a/src/lib/QtGui/__tests__/QIcon.test.ts +++ b/src/lib/QtGui/__tests__/QIcon.test.ts @@ -19,7 +19,7 @@ describe('QIcon', () => { }); it('initialize from QVariant', () => { const icon = new QIcon(testImagePath); - const variant = new QVariant(icon); + const variant = new QVariant(icon.native); expect(variant).toBeTruthy(); expect(QIcon.fromQVariant(variant).cacheKey()).toBe(icon.cacheKey()); }); diff --git a/src/lib/QtGui/__tests__/QPixmap.test.ts b/src/lib/QtGui/__tests__/QPixmap.test.ts index 75a643e7f..f8f5e06e7 100644 --- a/src/lib/QtGui/__tests__/QPixmap.test.ts +++ b/src/lib/QtGui/__tests__/QPixmap.test.ts @@ -24,7 +24,7 @@ describe('QPixmap', () => { }); it('initialize from QVariant', () => { const pixmap = new QPixmap(testImagePath); - const variant = new QVariant(pixmap); + const variant = new QVariant(pixmap.native); expect(variant).toBeTruthy(); expect(QPixmap.fromQVariant(variant).height()).toBe(pixmap.height()); }); diff --git a/src/lib/QtWidgets/QAbstractButton.ts b/src/lib/QtWidgets/QAbstractButton.ts index 9deba7161..7d7c75fcf 100644 --- a/src/lib/QtWidgets/QAbstractButton.ts +++ b/src/lib/QtWidgets/QAbstractButton.ts @@ -1,4 +1,4 @@ -import { NodeWidget } from './QWidget'; +import { NodeWidget, QWidgetSignals } from './QWidget'; import { QIcon } from '../QtGui/QIcon'; import { QSize } from '../QtCore/QSize'; @@ -17,3 +17,9 @@ export abstract class QAbstractButton extends NodeWidget { return QSize.fromQVariant(iconSize); } } +export interface QAbstractButtonSignals extends QWidgetSignals { + clicked: (checked: boolean) => void; + pressed: () => void; + released: () => void; + toggled: (checked: boolean) => void; +} diff --git a/src/lib/QtWidgets/QAction.ts b/src/lib/QtWidgets/QAction.ts index a7c7c6915..be99fe402 100644 --- a/src/lib/QtWidgets/QAction.ts +++ b/src/lib/QtWidgets/QAction.ts @@ -6,8 +6,9 @@ import { QIcon } from '../QtGui/QIcon'; import { QKeySequence } from '../QtGui/QKeySequence'; import { ShortcutContext } from '../QtEnums'; import { NodeObject } from '../QtCore/QObject'; +import { checkIfNativeElement } from '../utils/helpers'; -interface QActionSignals { +export interface QActionSignals { triggered: (checked: boolean) => void; changed: () => void; hovered: () => void; @@ -19,10 +20,13 @@ export class QAction extends NodeObject { icon?: QIcon; menu?: QMenu; constructor(); + constructor(native: NativeElement); constructor(parent: NodeWidget); - constructor(parent?: NodeWidget) { + constructor(parent?: NativeElement | NodeWidget) { let native; - if (parent) { + if (checkIfNativeElement(parent)) { + native = parent as NativeElement; + } else if (parent) { native = new addon.QAction(parent.native); } else { native = new addon.QAction(); diff --git a/src/lib/QtWidgets/QBoxLayout.ts b/src/lib/QtWidgets/QBoxLayout.ts index 9df35c861..230f4d236 100644 --- a/src/lib/QtWidgets/QBoxLayout.ts +++ b/src/lib/QtWidgets/QBoxLayout.ts @@ -4,7 +4,7 @@ import { NodeLayout } from './QLayout'; import { NativeElement } from '../core/Component'; import { Direction } from '../QtEnums'; -type QBoxLayoutSignals = {}; +export type QBoxLayoutSignals = {}; export class QBoxLayout extends NodeLayout { native: NativeElement; childLayouts: Set>; diff --git a/src/lib/QtWidgets/QCheckBox.ts b/src/lib/QtWidgets/QCheckBox.ts index ad95eb4f2..1fa1c6464 100644 --- a/src/lib/QtWidgets/QCheckBox.ts +++ b/src/lib/QtWidgets/QCheckBox.ts @@ -1,12 +1,9 @@ import addon from '../utils/addon'; import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; -import { QAbstractButton } from './QAbstractButton'; +import { QAbstractButton, QAbstractButtonSignals } from './QAbstractButton'; -interface QCheckBoxSignals { - //List all Signals below - toggled: (checked: boolean) => void; -} +export type QCheckBoxSignals = QAbstractButtonSignals; export class QCheckBox extends QAbstractButton { native: NativeElement; diff --git a/src/lib/QtWidgets/QComboBox.ts b/src/lib/QtWidgets/QComboBox.ts index 8a5cdf61b..5e2f5044c 100644 --- a/src/lib/QtWidgets/QComboBox.ts +++ b/src/lib/QtWidgets/QComboBox.ts @@ -5,7 +5,7 @@ import { SizeAdjustPolicy } from '../QtEnums'; import { QIcon } from '../QtGui/QIcon'; import { QVariant } from '../QtCore/QVariant'; -interface QComboBoxSignals { +export interface QComboBoxSignals { //List all Signals below currentIndexChanged: (index: number) => void; currentTextChanged: (text: string) => void; diff --git a/src/lib/QtWidgets/QDial.ts b/src/lib/QtWidgets/QDial.ts index 2cc94d342..9ed2e71ed 100644 --- a/src/lib/QtWidgets/QDial.ts +++ b/src/lib/QtWidgets/QDial.ts @@ -3,7 +3,7 @@ import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; import { QAbstractSlider } from './QAbstractSlider'; -interface QDialSignals { +export interface QDialSignals { valueChanged: (value: number) => void; rangeChanged: (min: number, max: number) => void; sliderMoved: (value: number) => void; diff --git a/src/lib/QtWidgets/QFileDialog.ts b/src/lib/QtWidgets/QFileDialog.ts index def0a0afa..4c55c9c16 100644 --- a/src/lib/QtWidgets/QFileDialog.ts +++ b/src/lib/QtWidgets/QFileDialog.ts @@ -3,7 +3,7 @@ import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; import { AcceptMode, DialogLabel, FileMode, Option, ViewMode } from '../QtEnums'; -interface QFileDialogSignals { +export interface QFileDialogSignals { currentChanged: (path: string) => void; currentUrlChanged: (url: string) => void; directoryEntered: (directory: string) => void; diff --git a/src/lib/QtWidgets/QGridLayout.ts b/src/lib/QtWidgets/QGridLayout.ts index 365d7db84..1c87e9f55 100644 --- a/src/lib/QtWidgets/QGridLayout.ts +++ b/src/lib/QtWidgets/QGridLayout.ts @@ -3,7 +3,7 @@ import { NodeWidget } from './QWidget'; import { NodeLayout } from './QLayout'; import { NativeElement } from '../core/Component'; -type QGridLayoutSignals = {}; +export type QGridLayoutSignals = {}; export class QGridLayout extends NodeLayout { native: NativeElement; diff --git a/src/lib/QtWidgets/QGroupBox.ts b/src/lib/QtWidgets/QGroupBox.ts index e5cefabd1..9578373c6 100644 --- a/src/lib/QtWidgets/QGroupBox.ts +++ b/src/lib/QtWidgets/QGroupBox.ts @@ -3,7 +3,7 @@ import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; import { AlignmentFlag } from '../QtEnums/AlignmentFlag'; -interface QGroupBoxSignals { +export interface QGroupBoxSignals { clicked: (checked: boolean) => void; toggled: (on: boolean) => void; } diff --git a/src/lib/QtWidgets/QLabel.ts b/src/lib/QtWidgets/QLabel.ts index acfe0375b..8833c0352 100644 --- a/src/lib/QtWidgets/QLabel.ts +++ b/src/lib/QtWidgets/QLabel.ts @@ -1,12 +1,12 @@ import addon from '../utils/addon'; -import { NodeWidget } from './QWidget'; +import { NodeWidget, QWidgetSignals } from './QWidget'; import { NativeElement } from '../core/Component'; import { QPixmap } from '../QtGui/QPixmap'; import { QMovie } from '../QtGui/QMovie'; import { AlignmentFlag } from '../QtEnums/AlignmentFlag'; import { TextFormat } from '../QtEnums/TextFormat'; -type QLabelSignals = {}; +export type QLabelSignals = QWidgetSignals; export class QLabel extends NodeWidget { native: NativeElement; private _pixmap?: QPixmap; diff --git a/src/lib/QtWidgets/QLineEdit.ts b/src/lib/QtWidgets/QLineEdit.ts index 5390703d4..ced118708 100644 --- a/src/lib/QtWidgets/QLineEdit.ts +++ b/src/lib/QtWidgets/QLineEdit.ts @@ -8,7 +8,7 @@ export enum EchoMode { Password, PasswordEchoOnEdit, } -interface QLineEditSignals { +export interface QLineEditSignals { cursorPositionChanged: (oldPos: number, newPos: number) => void; editingFinished: () => void; inputRejected: () => void; diff --git a/src/lib/QtWidgets/QMainWindow.ts b/src/lib/QtWidgets/QMainWindow.ts index c6df33ade..20bdf33d7 100644 --- a/src/lib/QtWidgets/QMainWindow.ts +++ b/src/lib/QtWidgets/QMainWindow.ts @@ -4,7 +4,7 @@ import { NativeElement } from '../core/Component'; import { NodeLayout } from './QLayout'; import { QMenuBar } from './QMenuBar'; -type QMainWindowSignals = {}; +export type QMainWindowSignals = {}; export class QMainWindow extends NodeWidget { native: NativeElement; public centralWidget?: NodeWidget | null; diff --git a/src/lib/QtWidgets/QMenu.ts b/src/lib/QtWidgets/QMenu.ts index ba7777de0..48df58900 100644 --- a/src/lib/QtWidgets/QMenu.ts +++ b/src/lib/QtWidgets/QMenu.ts @@ -3,7 +3,7 @@ import { NodeWidget } from './QWidget'; import addon from '../utils/addon'; import { QAction } from './QAction'; -type QMenuSignals = {}; +export type QMenuSignals = {}; export class QMenu extends NodeWidget { native: NativeElement; actions: Set; diff --git a/src/lib/QtWidgets/QMenuBar.ts b/src/lib/QtWidgets/QMenuBar.ts index b17e20eaa..7cd6d4eb2 100644 --- a/src/lib/QtWidgets/QMenuBar.ts +++ b/src/lib/QtWidgets/QMenuBar.ts @@ -4,7 +4,7 @@ import { NodeWidget } from './QWidget'; import addon from '../utils/addon'; import { checkIfNativeElement } from '../utils/helpers'; -type QMenuBarSignals = {}; +export type QMenuBarSignals = {}; export class QMenuBar extends NodeWidget { native: NativeElement; diff --git a/src/lib/QtWidgets/QPlainTextEdit.ts b/src/lib/QtWidgets/QPlainTextEdit.ts index e41549d2a..7596ed6ce 100644 --- a/src/lib/QtWidgets/QPlainTextEdit.ts +++ b/src/lib/QtWidgets/QPlainTextEdit.ts @@ -4,7 +4,7 @@ import { NativeElement } from '../core/Component'; import { QAbstractScrollArea } from './QAbstractScrollArea'; import { QTextOptionWrapMode } from '../QtGui/QTextOption'; -interface QPlainTextEditSignals { +export interface QPlainTextEditSignals { textChanged: () => void; blockCountChanged: (blockCount: number) => void; copyAvailable: (yes: boolean) => void; diff --git a/src/lib/QtWidgets/QProgressBar.ts b/src/lib/QtWidgets/QProgressBar.ts index 791ed72ce..3da192df6 100644 --- a/src/lib/QtWidgets/QProgressBar.ts +++ b/src/lib/QtWidgets/QProgressBar.ts @@ -3,7 +3,7 @@ import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; import { Orientation } from '../QtEnums'; -type QProgressBarSignals = {}; +export type QProgressBarSignals = {}; export class QProgressBar extends NodeWidget { native: NativeElement; constructor(); diff --git a/src/lib/QtWidgets/QPushButton.ts b/src/lib/QtWidgets/QPushButton.ts index 456a56494..39a693b6e 100644 --- a/src/lib/QtWidgets/QPushButton.ts +++ b/src/lib/QtWidgets/QPushButton.ts @@ -1,14 +1,9 @@ import addon from '../utils/addon'; import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; -import { QAbstractButton } from './QAbstractButton'; +import { QAbstractButton, QAbstractButtonSignals } from './QAbstractButton'; -interface QPushButtonSignals { - clicked: (checked: boolean) => void; - pressed: () => void; - released: () => void; - toggled: (checked: boolean) => void; -} +export type QPushButtonSignals = QAbstractButtonSignals; export class QPushButton extends QAbstractButton { native: NativeElement; diff --git a/src/lib/QtWidgets/QRadioButton.ts b/src/lib/QtWidgets/QRadioButton.ts index 98c5acbf2..5eac5c5a2 100644 --- a/src/lib/QtWidgets/QRadioButton.ts +++ b/src/lib/QtWidgets/QRadioButton.ts @@ -1,9 +1,9 @@ import addon from '../utils/addon'; import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; -import { QAbstractButton } from './QAbstractButton'; +import { QAbstractButton, QAbstractButtonSignals } from './QAbstractButton'; -type QRadioButtonSignals = {}; +export type QRadioButtonSignals = QAbstractButtonSignals; export class QRadioButton extends QAbstractButton { native: NativeElement; constructor(); diff --git a/src/lib/QtWidgets/QScrollArea.ts b/src/lib/QtWidgets/QScrollArea.ts index 1ae3b17cb..a522c6b1b 100644 --- a/src/lib/QtWidgets/QScrollArea.ts +++ b/src/lib/QtWidgets/QScrollArea.ts @@ -3,7 +3,7 @@ import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; import { QAbstractScrollArea } from './QAbstractScrollArea'; -type QScrollAreaSignals = {}; +export type QScrollAreaSignals = {}; export class QScrollArea extends QAbstractScrollArea { native: NativeElement; contentWidget?: NodeWidget | null; diff --git a/src/lib/QtWidgets/QShortcut.ts b/src/lib/QtWidgets/QShortcut.ts index c2b33dc49..4128faa91 100644 --- a/src/lib/QtWidgets/QShortcut.ts +++ b/src/lib/QtWidgets/QShortcut.ts @@ -5,7 +5,7 @@ import { QKeySequence } from '../QtGui/QKeySequence'; import { ShortcutContext } from '../QtEnums'; import { NodeObject } from '../QtCore/QObject'; -interface QShortcutSignals { +export interface QShortcutSignals { activated: () => void; activatedAmbiguously: () => void; } diff --git a/src/lib/QtWidgets/QSpinBox.ts b/src/lib/QtWidgets/QSpinBox.ts index 3011aabda..0bb3b3ab6 100644 --- a/src/lib/QtWidgets/QSpinBox.ts +++ b/src/lib/QtWidgets/QSpinBox.ts @@ -2,7 +2,7 @@ import addon from '../utils/addon'; import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; -interface QSpinBoxSignals { +export interface QSpinBoxSignals { valueChanged: (value: number) => void; } diff --git a/src/lib/QtWidgets/QStackedWidget.ts b/src/lib/QtWidgets/QStackedWidget.ts index ea25cc346..7de72ae2e 100644 --- a/src/lib/QtWidgets/QStackedWidget.ts +++ b/src/lib/QtWidgets/QStackedWidget.ts @@ -2,7 +2,7 @@ import addon from '../utils/addon'; import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; -interface QStackedWidgetSignals { +export interface QStackedWidgetSignals { currentChanged: (index: number) => void; } diff --git a/src/lib/QtWidgets/QSystemTrayIcon.ts b/src/lib/QtWidgets/QSystemTrayIcon.ts index 352fd77a1..f429074bd 100644 --- a/src/lib/QtWidgets/QSystemTrayIcon.ts +++ b/src/lib/QtWidgets/QSystemTrayIcon.ts @@ -5,7 +5,7 @@ import { QIcon } from '../QtGui/QIcon'; import { QMenu } from './QMenu'; import { NodeObject } from '../QtCore/QObject'; -interface QSystemTrayIconSignals { +export interface QSystemTrayIconSignals { activated: (reason: QSystemTrayIconActivationReason) => void; messageClicked: () => void; } diff --git a/src/lib/QtWidgets/QTabWidget.ts b/src/lib/QtWidgets/QTabWidget.ts index 50b2dac41..767e6e3ca 100644 --- a/src/lib/QtWidgets/QTabWidget.ts +++ b/src/lib/QtWidgets/QTabWidget.ts @@ -4,7 +4,7 @@ import { NativeElement } from '../core/Component'; import { QIcon } from '../QtGui/QIcon'; import { TabPosition } from '../QtEnums'; -interface QTabWidgetSignals { +export interface QTabWidgetSignals { currentChanged: (index: number) => void; tabBarClicked: (index: number) => void; tabBarDoubleClicked: (index: number) => void; diff --git a/src/lib/QtWidgets/QTableWidget.ts b/src/lib/QtWidgets/QTableWidget.ts index 4fe93f439..a2369dd30 100644 --- a/src/lib/QtWidgets/QTableWidget.ts +++ b/src/lib/QtWidgets/QTableWidget.ts @@ -5,7 +5,7 @@ import { ScrollHint, SortOrder } from '../QtEnums'; import { QTableWidgetItem } from './QTableWidgetItem'; import { QAbstractScrollArea } from './QAbstractScrollArea'; -interface QTableWidgetSignals { +export interface QTableWidgetSignals { cellActivated: (row: number, col: number) => void; cellChanged: (row: number, col: number) => void; cellClicked: (row: number, col: number) => void; diff --git a/src/lib/QtWidgets/QToolButton.ts b/src/lib/QtWidgets/QToolButton.ts index d9c4bdc38..aadebc0c1 100644 --- a/src/lib/QtWidgets/QToolButton.ts +++ b/src/lib/QtWidgets/QToolButton.ts @@ -1,7 +1,7 @@ import addon from '../utils/addon'; import { NodeWidget } from './QWidget'; import { NativeElement } from '../core/Component'; -import { QAbstractButton } from './QAbstractButton'; +import { QAbstractButton, QAbstractButtonSignals } from './QAbstractButton'; import { ToolButtonStyle } from '../QtEnums/ToolButtonStyle'; import { ArrowType } from '../QtEnums/ArrowType'; import { QAction } from '../QtWidgets/QAction'; @@ -13,11 +13,7 @@ export enum ToolButtonPopupMode { InstantPopup, } -interface QToolButtonSignals { - clicked: (checked: boolean) => void; - pressed: () => void; - released: () => void; - toggled: (checked: boolean) => void; +export interface QToolButtonSignals extends QAbstractButtonSignals { triggered: (nativeAction: NativeElement) => void; } export class QToolButton extends QAbstractButton { diff --git a/src/lib/QtWidgets/QTreeWidget.ts b/src/lib/QtWidgets/QTreeWidget.ts index aff2e2186..f3f8afef6 100644 --- a/src/lib/QtWidgets/QTreeWidget.ts +++ b/src/lib/QtWidgets/QTreeWidget.ts @@ -4,7 +4,7 @@ import { NativeElement } from '../core/Component'; import { QAbstractScrollArea } from './QAbstractScrollArea'; import { QTreeWidgetItem } from './QTreeWidgetItem'; -interface QTreeWidgetSignals { +export interface QTreeWidgetSignals { itemSelectionChanged: () => void; } diff --git a/src/lib/QtWidgets/QWidget.ts b/src/lib/QtWidgets/QWidget.ts index 75d7310f8..193f61d2b 100644 --- a/src/lib/QtWidgets/QWidget.ts +++ b/src/lib/QtWidgets/QWidget.ts @@ -2,7 +2,7 @@ import addon from '../utils/addon'; import { NodeLayout } from './QLayout'; import { NativeElement } from '../core/Component'; import { FlexLayout } from '../core/FlexLayout'; -import { WidgetAttribute, WindowType } from '../QtEnums'; +import { WidgetAttribute, WindowType, ContextMenuPolicy } from '../QtEnums'; import { QIcon } from '../QtGui/QIcon'; import { QCursor } from '../QtGui/QCursor'; import { CursorShape, WindowState } from '../QtEnums'; @@ -11,6 +11,7 @@ import { checkIfNativeElement } from '../utils/helpers'; import { YogaWidget } from '../core/YogaWidget'; import { QSize } from '../QtCore/QSize'; import { QRect } from '../QtCore/QRect'; +import { QObjectSignals } from '../QtCore/QObject'; // All Widgets should extend from NodeWidget // Implement all native QWidget methods here so that all widgets get access to those aswell export abstract class NodeWidget extends YogaWidget { @@ -157,6 +158,9 @@ export abstract class NodeWidget extends YogaWidget { this.setInlineStyle(this._rawInlineStyle); } } + setContextMenuPolicy(contextMenuPolicy: ContextMenuPolicy): void { + this.setProperty('contextMenuPolicy', contextMenuPolicy); + } showFullScreen(): void { this.native.showFullScreen(); } @@ -171,7 +175,11 @@ export abstract class NodeWidget extends YogaWidget { } } -type QWidgetSignals = {}; +export interface QWidgetSignals extends QObjectSignals { + windowTitleChanged: (title: string) => void; + windowIconChanged: (iconNative: NativeElement) => void; + customContextMenuRequested: (pos: { x: number; y: number }) => void; +} export class QWidget extends NodeWidget { native: NativeElement; constructor(arg?: NodeWidget | NativeElement) { diff --git a/src/lib/QtWidgets/__tests__/QCheckBox.test.ts b/src/lib/QtWidgets/__tests__/QCheckBox.test.ts index ab71475cc..cac078679 100644 --- a/src/lib/QtWidgets/__tests__/QCheckBox.test.ts +++ b/src/lib/QtWidgets/__tests__/QCheckBox.test.ts @@ -37,4 +37,20 @@ describe('QCheckBox', () => { expect(returnedSize.width()).toBe(111); expect(returnedSize.height()).toBe(111); }); + it('check if signals are working from QObject', () => { + const widget = new QCheckBox(); + const mock = jest.fn(); + widget.addEventListener('objectNameChanged', mock); + widget.setObjectName('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); + it('check if signals are working from QWidget', () => { + const widget = new QCheckBox(); + const mock = jest.fn(); + widget.addEventListener('windowTitleChanged', mock); + widget.setWindowTitle('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); }); diff --git a/src/lib/QtWidgets/__tests__/QLabel.test.ts b/src/lib/QtWidgets/__tests__/QLabel.test.ts index 812e558c9..4a45bd3ba 100644 --- a/src/lib/QtWidgets/__tests__/QLabel.test.ts +++ b/src/lib/QtWidgets/__tests__/QLabel.test.ts @@ -35,4 +35,20 @@ describe('QLabel', () => { label.setMovie(movie); expect(label.movie()).toEqual(movie); }); + it('check if signals are working', () => { + const widget = new QLabel(); + const mock = jest.fn(); + widget.addEventListener('objectNameChanged', mock); + widget.setObjectName('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); + it('check if signals are working from QWidget', () => { + const widget = new QLabel(); + const mock = jest.fn(); + widget.addEventListener('windowTitleChanged', mock); + widget.setWindowTitle('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); }); diff --git a/src/lib/QtWidgets/__tests__/QPushButton.test.ts b/src/lib/QtWidgets/__tests__/QPushButton.test.ts index 7cc830181..91194c9ec 100644 --- a/src/lib/QtWidgets/__tests__/QPushButton.test.ts +++ b/src/lib/QtWidgets/__tests__/QPushButton.test.ts @@ -35,4 +35,20 @@ describe('QPushButton', () => { expect(returnedSize.width()).toBe(111); expect(returnedSize.height()).toBe(111); }); + it('check if signals are working', () => { + const widget = new QPushButton(); + const mock = jest.fn(); + widget.addEventListener('objectNameChanged', mock); + widget.setObjectName('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); + it('check if signals are working from QWidget', () => { + const widget = new QPushButton(); + const mock = jest.fn(); + widget.addEventListener('windowTitleChanged', mock); + widget.setWindowTitle('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); }); diff --git a/src/lib/QtWidgets/__tests__/QRadioButton.test.ts b/src/lib/QtWidgets/__tests__/QRadioButton.test.ts index 3a486425c..7f0c26dc0 100644 --- a/src/lib/QtWidgets/__tests__/QRadioButton.test.ts +++ b/src/lib/QtWidgets/__tests__/QRadioButton.test.ts @@ -30,4 +30,20 @@ describe('QRadioButton', () => { expect(returnedSize.width()).toBe(111); expect(returnedSize.height()).toBe(111); }); + it('check if signals are working', () => { + const widget = new QRadioButton(); + const mock = jest.fn(); + widget.addEventListener('objectNameChanged', mock); + widget.setObjectName('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); + it('check if signals are working from QWidget', () => { + const widget = new QRadioButton(); + const mock = jest.fn(); + widget.addEventListener('windowTitleChanged', mock); + widget.setWindowTitle('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); }); diff --git a/src/lib/QtWidgets/__tests__/QToolButton.test.ts b/src/lib/QtWidgets/__tests__/QToolButton.test.ts new file mode 100644 index 000000000..e23e8319f --- /dev/null +++ b/src/lib/QtWidgets/__tests__/QToolButton.test.ts @@ -0,0 +1,49 @@ +import { QToolButton } from '../QToolButton'; +import { QIcon } from '../../QtGui/QIcon'; +import path from 'path'; +import { QSize } from '../../QtCore/QSize'; + +describe('QToolButton', () => { + it('instantiate a button instance', () => { + const button = new QToolButton(); + expect(button.inherits('QToolButton')).toBe(true); + }); + it('setText', () => { + const button = new QToolButton(); + button.setText('hello'); + expect(button.property('text').toString()).toEqual('hello'); + }); + it('setIcon', () => { + const button = new QToolButton(); + const testImagePath = path.resolve(__dirname, 'assets', 'nodegui.png'); + const icon = new QIcon(testImagePath); + button.setIcon(icon); + expect(QIcon.fromQVariant(button.property('icon')).cacheKey()).toEqual(icon.cacheKey()); + }); + it('setIconSize', () => { + const button = new QToolButton(); + const testImagePath = path.resolve(__dirname, 'assets', 'nodegui.png'); + const icon = new QIcon(testImagePath); + button.setIcon(icon); + button.setIconSize(new QSize(111, 111)); + const returnedSize = button.iconSize(); + expect(returnedSize.width()).toBe(111); + expect(returnedSize.height()).toBe(111); + }); + it('check if signals are working', () => { + const widget = new QToolButton(); + const mock = jest.fn(); + widget.addEventListener('objectNameChanged', mock); + widget.setObjectName('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); + it('check if signals are working from QWidget', () => { + const widget = new QToolButton(); + const mock = jest.fn(); + widget.addEventListener('windowTitleChanged', mock); + widget.setWindowTitle('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); +}); diff --git a/src/lib/QtWidgets/__tests__/QWidget.test.ts b/src/lib/QtWidgets/__tests__/QWidget.test.ts index 56c5b6a06..a67aeca05 100644 --- a/src/lib/QtWidgets/__tests__/QWidget.test.ts +++ b/src/lib/QtWidgets/__tests__/QWidget.test.ts @@ -82,4 +82,20 @@ describe('QWidget', () => { view.setWindowOpacity(0.6); expect(view.windowOpacity().toFixed(1)).toBe(`0.6`); }); + it('check if signals are working', () => { + const widget = new QWidget(); + const mock = jest.fn(); + widget.addEventListener('objectNameChanged', mock); + widget.setObjectName('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); + it('check if signals are working from QWidget', () => { + const widget = new QWidget(); + const mock = jest.fn(); + widget.addEventListener('windowTitleChanged', mock); + widget.setWindowTitle('testName'); + expect(mock).toBeCalledWith('testName'); + expect(mock).toBeCalledTimes(1); + }); }); diff --git a/src/lib/core/FlexLayout.ts b/src/lib/core/FlexLayout.ts index a455ef1f6..29e09d5ff 100644 --- a/src/lib/core/FlexLayout.ts +++ b/src/lib/core/FlexLayout.ts @@ -4,7 +4,7 @@ import { NodeLayout } from '../QtWidgets/QLayout'; import { FlexNode } from './YogaWidget'; import { NativeElement } from './Component'; -type FlexLayoutSignals = {}; +export type FlexLayoutSignals = {}; export class FlexLayout extends NodeLayout { native: NativeElement; protected flexNode?: FlexNode; diff --git a/website/docs/development/signal_and_event_handling.md b/website/docs/development/signal_and_event_handling.md index 4926bb9bf..766a851e3 100644 --- a/website/docs/development/signal_and_event_handling.md +++ b/website/docs/development/signal_and_event_handling.md @@ -107,7 +107,7 @@ public: using QPushButton::QPushButton; //inherit all constructors of QPushButton // override this method and implement all signals here - void connectWidgetSignalsToEventEmitter() { + void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QObject::connect(this, &QPushButton::clicked, [=](bool checked) { Napi::Env env = this->emitOnNode.Env(); @@ -145,4 +145,4 @@ We need to run Qt's MOC (Meta Object Compiler) on the file whenever we use Q_OBJ 1. On JS side for each widget instance we create an instance of NodeJS's Event Emitter. This is done by the class `EventWidget` from which `NodeWidget` inherits 2. We send this event emiiter's `emit` function to the C++ side by calling `initNodeEventEmitter` method and store a pointer to the event emitter's emit function using `emitOnNode`. initNodeEventEmitter function is added by a macro from EventWidget (c++). You can find the initNodeEventEmitter method with the event widget macros. -3. We setup Qt's connect method for all the signals that we want to listen to and call the emitOnNode (which is actually emit from Event emitter) whenever a signal arrives. This is done manually on every widget by overriding the method `connectWidgetSignalsToEventEmitter`. Check `npushbutton.h` for details. This takes care of all the signals of the widgets. Now to export all qt events of the widget, we had overriden the widgets `event(Event*)` method to listen to events received by the widget and send it to the event emitter. This is done inside the EVENTWIDGET_IMPLEMENTATIONS macro +3. We setup Qt's connect method for all the signals that we want to listen to and call the emitOnNode (which is actually emit from Event emitter) whenever a signal arrives. This is done manually on every widget by overriding the method `connectSignalsToEventEmitter`. Check `npushbutton.h` for details. This takes care of all the signals of the widgets. Now to export all qt events of the widget, we had overriden the widgets `event(Event*)` method to listen to events received by the widget and send it to the event emitter. This is done inside the EVENTWIDGET_IMPLEMENTATIONS macro