diff --git a/.gitignore b/.gitignore index 716c4b2fe..c97230290 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ dist .vscode .cache coverage -.DS_Store \ No newline at end of file +.DS_Store +/.idea/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ce90ca78..b52f89711 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QCheckBox/qcheckbox_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QProgressBar/qprogressbar_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QRadioButton/qradiobutton_wrap.cpp" + "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QStackedWidget/qstackedwidget_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTabWidget/qtabwidget_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QLineEdit/qlineedit_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp" @@ -87,6 +88,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QRadioButton/nradiobutton.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QPlainTextEdit/nplaintextedit.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QScrollArea/nscrollarea.hpp" + "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QStackedWidget/nstackedwidget.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTabWidget/ntabwidget.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QSystemTrayIcon/nsystemtrayicon.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QAction/naction.hpp" diff --git a/src/cpp/include/nodegui/QtWidgets/QStackedWidget/nstackedwidget.hpp b/src/cpp/include/nodegui/QtWidgets/QStackedWidget/nstackedwidget.hpp new file mode 100644 index 000000000..653d5b1af --- /dev/null +++ b/src/cpp/include/nodegui/QtWidgets/QStackedWidget/nstackedwidget.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include "core/NodeWidget/nodewidget.h" +#include "napi.h" + +class NStackedWidget : public QStackedWidget, public NodeWidget { + Q_OBJECT + NODEWIDGET_IMPLEMENTATIONS(QStackedWidget) + public: + using QStackedWidget::QStackedWidget; // inherit all constructors of + // QStackedWidget + + void connectWidgetSignalsToEventEmitter() { + // Qt Connects: Implement all signal connects here + QObject::connect(this, &QStackedWidget::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)}); + }); + } +}; diff --git a/src/cpp/include/nodegui/QtWidgets/QStackedWidget/qstackedwidget_wrap.h b/src/cpp/include/nodegui/QtWidgets/QStackedWidget/qstackedwidget_wrap.h new file mode 100644 index 000000000..b7e20bbb9 --- /dev/null +++ b/src/cpp/include/nodegui/QtWidgets/QStackedWidget/qstackedwidget_wrap.h @@ -0,0 +1,30 @@ +#pragma once + +#include + +#include + +#include "Extras/Utils/nutils.h" +#include "QtWidgets/QStackedWidget/nstackedwidget.hpp" +#include "QtWidgets/QWidget/qwidget_macro.h" + +class QStackedWidgetWrap : public Napi::ObjectWrap { + private: + QPointer instance; + + public: + static Napi::Object init(Napi::Env env, Napi::Object exports); + QStackedWidgetWrap(const Napi::CallbackInfo &info); + ~QStackedWidgetWrap(); + NStackedWidget *getInternalInstance(); + // class constructor + static Napi::FunctionReference constructor; + // wrapped methods + Napi::Value addWidget(const Napi::CallbackInfo &info); + Napi::Value removeWidget(const Napi::CallbackInfo &info); + Napi::Value setCurrentIndex(const Napi::CallbackInfo &info); + Napi::Value currentIndex(const Napi::CallbackInfo &info); + Napi::Value setCurrentWidget(const Napi::CallbackInfo &info); + + QWIDGET_WRAPPED_METHODS_DECLARATION +}; diff --git a/src/cpp/lib/QtWidgets/QGridLayout/qgridlayout_wrap.cpp b/src/cpp/lib/QtWidgets/QGridLayout/qgridlayout_wrap.cpp index 1da7e40e0..328a47786 100644 --- a/src/cpp/lib/QtWidgets/QGridLayout/qgridlayout_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QGridLayout/qgridlayout_wrap.cpp @@ -45,8 +45,13 @@ Napi::Value QGridLayoutWrap::addWidget(const Napi::CallbackInfo& info) { Napi::HandleScope scope(env); Napi::Object qwidgetObject = info[0].As(); + Napi::Number qrow = info[1].As(); + Napi::Number qcol = info[2].As(); + Napi::Number qrowSpan = info[3].As(); + Napi::Number qcolSpan = info[4].As(); QWidgetWrap* widget = Napi::ObjectWrap::Unwrap(qwidgetObject); - this->instance->addWidget(widget->getInternalInstance()); + this->instance->addWidget(widget->getInternalInstance(), qrow, qcol, qrowSpan, + qcolSpan); return env.Null(); } diff --git a/src/cpp/lib/QtWidgets/QStackedWidget/qstackedwidget_wrap.cpp b/src/cpp/lib/QtWidgets/QStackedWidget/qstackedwidget_wrap.cpp new file mode 100644 index 000000000..071d898f5 --- /dev/null +++ b/src/cpp/lib/QtWidgets/QStackedWidget/qstackedwidget_wrap.cpp @@ -0,0 +1,105 @@ +#include "QtWidgets/QStackedWidget/qstackedwidget_wrap.h" + +#include + +#include "Extras/Utils/nutils.h" +#include "QtWidgets/QWidget/qwidget_wrap.h" + +Napi::FunctionReference QStackedWidgetWrap::constructor; + +Napi::Object QStackedWidgetWrap::init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + char CLASSNAME[] = "QStackedWidget"; + Napi::Function func = DefineClass( + env, CLASSNAME, + {InstanceMethod("addWidget", &QStackedWidgetWrap::addWidget), + InstanceMethod("removeWidget", &QStackedWidgetWrap::removeWidget), + InstanceMethod("setCurrentIndex", &QStackedWidgetWrap::setCurrentIndex), + InstanceMethod("currentIndex", &QStackedWidgetWrap::currentIndex), + InstanceMethod("setCurrentWidget", + &QStackedWidgetWrap::setCurrentWidget), + QWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(QStackedWidgetWrap)}); + constructor = Napi::Persistent(func); + exports.Set(CLASSNAME, func); + return exports; +} + +NStackedWidget* QStackedWidgetWrap::getInternalInstance() { + return this->instance; +} + +QStackedWidgetWrap::~QStackedWidgetWrap() { + extrautils::safeDelete(this->instance); +} + +QStackedWidgetWrap::QStackedWidgetWrap(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 NStackedWidget( + parentWidgetWrap + ->getInternalInstance()); // this sets the parent to current widget + } else if (info.Length() == 0) { + this->instance = new NStackedWidget(); + } else { + Napi::TypeError::New(env, "Wrong number of arguments") + .ThrowAsJavaScriptException(); + } + this->rawData = extrautils::configureQWidget( + this->getInternalInstance(), this->getInternalInstance()->getFlexNode(), + true); +} + +Napi::Value QStackedWidgetWrap::addWidget(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + Napi::Object qwidgetObject = info[0].As(); + QWidgetWrap* widget = Napi::ObjectWrap::Unwrap(qwidgetObject); + this->instance->addWidget(widget->getInternalInstance()); + + return env.Null(); +} + +Napi::Value QStackedWidgetWrap::removeWidget(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + Napi::Object qwidgetObject = info[0].As(); + QWidgetWrap* widget = Napi::ObjectWrap::Unwrap(qwidgetObject); + this->instance->removeWidget(widget->getInternalInstance()); + return env.Null(); +} + +Napi::Value QStackedWidgetWrap::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 QStackedWidgetWrap::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 QStackedWidgetWrap::setCurrentWidget( + const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + Napi::Object qwidgetObject = info[0].As(); + QWidgetWrap* widget = Napi::ObjectWrap::Unwrap(qwidgetObject); + + this->instance->setCurrentWidget(widget->getInternalInstance()); + return env.Null(); +} diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index f234cefbf..5df2bbb3c 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -32,6 +32,7 @@ #include "QtWidgets/QScrollArea/qscrollarea_wrap.h" #include "QtWidgets/QShortcut/qshortcut_wrap.h" #include "QtWidgets/QSpinBox/qspinbox_wrap.h" +#include "QtWidgets/QStackedWidget/qstackedwidget_wrap.h" #include "QtWidgets/QSystemTrayIcon/qsystemtrayicon_wrap.h" #include "QtWidgets/QTabWidget/qtabwidget_wrap.h" #include "QtWidgets/QWidget/qwidget_wrap.h" @@ -66,6 +67,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) { QCheckBoxWrap::init(env, exports); QProgressBarWrap::init(env, exports); QRadioButtonWrap::init(env, exports); + QStackedWidgetWrap::init(env, exports); QTabWidgetWrap::init(env, exports); QLineEditWrap::init(env, exports); QKeyEventWrap::init(env, exports); diff --git a/src/index.ts b/src/index.ts index 1d990cdda..ef02e1a55 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,6 +32,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 { QStackedWidget, QStackedWidgetEvents } from './lib/QtWidgets/QStackedWidget'; export { QTabWidget, QTabWidgetEvents } from './lib/QtWidgets/QTabWidget'; export { QMenu, QMenuEvents } from './lib/QtWidgets/QMenu'; export { QMenuBar, QMenuBarEvents } from './lib/QtWidgets/QMenuBar'; diff --git a/src/lib/QtWidgets/QGridLayout.ts b/src/lib/QtWidgets/QGridLayout.ts index dd1a80d84..f42b30fec 100644 --- a/src/lib/QtWidgets/QGridLayout.ts +++ b/src/lib/QtWidgets/QGridLayout.ts @@ -16,8 +16,8 @@ export class QGridLayout extends NodeLayout { this.nodeParent = parent; this.native = native; } - addWidget(widget: NodeWidget): void { - this.native.addWidget(widget.native); + addWidget(widget: NodeWidget, row = 0, col = 0, rowSpan = 1, colSpan = 1): void { + this.native.addWidget(widget.native, row, col, rowSpan, colSpan); this.nodeChildren.add(widget); } removeWidget(widget: NodeWidget): void { diff --git a/src/lib/QtWidgets/QMainWindow.ts b/src/lib/QtWidgets/QMainWindow.ts index fc39e18f3..c2075f10b 100644 --- a/src/lib/QtWidgets/QMainWindow.ts +++ b/src/lib/QtWidgets/QMainWindow.ts @@ -61,9 +61,9 @@ export class QMainWindow extends NodeWidget { get layout(): NodeLayout | undefined { if (this.centralWidget) { return this.centralWidget.layout; - } else { - return super.layout; } + + return super.layout; } center(): void { this.native.center(); diff --git a/src/lib/QtWidgets/QStackedWidget.ts b/src/lib/QtWidgets/QStackedWidget.ts new file mode 100644 index 000000000..52b284aba --- /dev/null +++ b/src/lib/QtWidgets/QStackedWidget.ts @@ -0,0 +1,46 @@ +import addon from '../utils/addon'; +import { NodeWidget, QWidget } from './QWidget'; +import { BaseWidgetEvents } from '../core/EventWidget'; +import { NativeElement } from '../core/Component'; + +export const QStackedWidgetEvents = Object.freeze({ + ...BaseWidgetEvents, + currentChanged: 'currentChanged', +}); + +export class QStackedWidget extends NodeWidget { + native: NativeElement; + constructor(parent?: NodeWidget) { + let native; + if (parent) { + native = new addon.QStackedWidget(parent.native); + } else { + native = new addon.QStackedWidget(); + } + super(native); + this.nodeParent = parent; + this.native = native; + } + + addWidget(widget: NodeWidget): void { + this.native.addWidget(widget.native); + this.nodeChildren.add(widget); + } + + removeWidget(widget: NodeWidget): void { + this.native.removeWidget(widget.native); + this.nodeChildren.delete(widget); + } + + setCurrentIndex(index: number): void { + this.native.setCurrentIndex(index); + } + + currentIndex(): number { + return this.native.currentIndex(); + } + + setCurrentWidget(widget: NodeWidget): void { + this.native.setCurrentWidget(widget.native); + } +}