diff --git a/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp b/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp index 3feb29a43..5b01d47b4 100644 --- a/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp +++ b/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp @@ -1,5 +1,7 @@ #pragma once #include +#include +#include #include "Extras/Export/export.h" #include "QtCore/QObject/qobject_macro.h" @@ -13,5 +15,12 @@ class DLL_EXPORT NApplication : public QApplication, public EventWidget { void connectSignalsToEventEmitter() { // Qt Connects: Implement all signal connects here QOBJECT_SIGNALS + + QObject::connect( + this, &QGuiApplication::focusWindowChanged, [=](QWindow* focusWindow) { + Napi::Env env = this->emitOnNode.Env(); + Napi::HandleScope scope(env); + this->emitOnNode.Call({Napi::String::New(env, "focusWindowChanged")}); + }); } }; diff --git a/src/cpp/include/nodegui/QtWidgets/QAbstractScrollArea/qabstractscrollarea_macro.h b/src/cpp/include/nodegui/QtWidgets/QAbstractScrollArea/qabstractscrollarea_macro.h index 4de5a7607..6536883e5 100644 --- a/src/cpp/include/nodegui/QtWidgets/QAbstractScrollArea/qabstractscrollarea_macro.h +++ b/src/cpp/include/nodegui/QtWidgets/QAbstractScrollArea/qabstractscrollarea_macro.h @@ -1,6 +1,8 @@ #pragma once +#include "QtCore/QSize/qsize_wrap.h" #include "QtWidgets/QFrame/qframe_macro.h" +#include "QtWidgets/QScrollBar/qscrollbar_wrap.h" #include "QtWidgets/QWidget/qwidget_wrap.h" /* @@ -11,39 +13,75 @@ */ #ifndef QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION -#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \ - \ - QFRAME_WRAPPED_METHODS_DECLARATION \ - \ - Napi::Value setViewport(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::Object viewPortObject = info[0].As(); \ - NodeWidgetWrap* viewPortWidgetWrap = \ - Napi::ObjectWrap::Unwrap(viewPortObject); \ - QWidget* viewPort = viewPortWidgetWrap->getInternalInstance(); \ - this->instance->setViewport(viewPort); \ - return env.Null(); \ - } \ - \ - Napi::Value viewport(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - QWidget* viewPort = this->instance->viewport(); \ - NWidget* nviewPort = reinterpret_cast(viewPort); \ - auto instance = QWidgetWrap::constructor.New( \ - {Napi::External::New(env, nviewPort)}); \ - return instance; \ +#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \ + \ + QFRAME_WRAPPED_METHODS_DECLARATION \ + \ + Napi::Value maximumViewportSize(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + QSize size = this->instance->maximumViewportSize(); \ + auto instance = QSizeWrap::constructor.New( \ + {Napi::External::New(env, new QSize(size))}); \ + return instance; \ + } \ + \ + Napi::Value setHorizontalScrollBar(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Object scrollBarObject = info[0].As(); \ + QScrollBarWrap* scrollBarWrap = \ + Napi::ObjectWrap::Unwrap(scrollBarObject); \ + QScrollBar* scrollBar = scrollBarWrap->getInternalInstance(); \ + this->instance->setHorizontalScrollBar(scrollBar); \ + return env.Null(); \ + } \ + \ + Napi::Value setVerticalScrollBar(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Object scrollBarObject = info[0].As(); \ + QScrollBarWrap* scrollBarWrap = \ + Napi::ObjectWrap::Unwrap(scrollBarObject); \ + QScrollBar* scrollBar = scrollBarWrap->getInternalInstance(); \ + this->instance->setVerticalScrollBar(scrollBar); \ + return env.Null(); \ + } \ + \ + Napi::Value setViewport(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Object viewPortObject = info[0].As(); \ + NodeWidgetWrap* viewPortWidgetWrap = \ + Napi::ObjectWrap::Unwrap(viewPortObject); \ + QWidget* viewPort = viewPortWidgetWrap->getInternalInstance(); \ + this->instance->setViewport(viewPort); \ + return env.Null(); \ + } \ + \ + Napi::Value viewport(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + QWidget* viewPort = this->instance->viewport(); \ + NWidget* nviewPort = reinterpret_cast(viewPort); \ + auto instance = QWidgetWrap::constructor.New( \ + {Napi::External::New(env, nviewPort)}); \ + return instance; \ } #endif // QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION #ifndef QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE -#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ - \ - QFRAME_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ - \ - InstanceMethod("setViewport", &WidgetWrapName::setViewport), \ +#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ + \ + QFRAME_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ + \ + InstanceMethod("maximumViewportSize", &WidgetWrapName::maximumViewportSize), \ + InstanceMethod("setHorizontalScrollBar", \ + &WidgetWrapName::setVerticalScrollBar), \ + InstanceMethod("setVerticalScrollBar", \ + &WidgetWrapName::setVerticalScrollBar), \ + InstanceMethod("setViewport", &WidgetWrapName::setViewport), \ InstanceMethod("viewport", &WidgetWrapName::viewport), #endif // QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE diff --git a/src/cpp/include/nodegui/QtWidgets/QAction/qaction_wrap.h b/src/cpp/include/nodegui/QtWidgets/QAction/qaction_wrap.h index a8bb475e7..d4d118b77 100644 --- a/src/cpp/include/nodegui/QtWidgets/QAction/qaction_wrap.h +++ b/src/cpp/include/nodegui/QtWidgets/QAction/qaction_wrap.h @@ -35,4 +35,6 @@ class DLL_EXPORT QActionWrap : public Napi::ObjectWrap { Napi::Value isSeparator(const Napi::CallbackInfo& info); Napi::Value setSeparator(const Napi::CallbackInfo& info); Napi::Value setFont(const Napi::CallbackInfo& info); + Napi::Value data(const Napi::CallbackInfo& info); + Napi::Value setData(const Napi::CallbackInfo& info); }; diff --git a/src/cpp/include/nodegui/QtWidgets/QMenu/nmenu.hpp b/src/cpp/include/nodegui/QtWidgets/QMenu/nmenu.hpp index 1f815fd69..06902f8c7 100644 --- a/src/cpp/include/nodegui/QtWidgets/QMenu/nmenu.hpp +++ b/src/cpp/include/nodegui/QtWidgets/QMenu/nmenu.hpp @@ -11,5 +11,16 @@ class DLL_EXPORT NMenu : public QMenu, public NodeWidget { NODEWIDGET_IMPLEMENTATIONS(QMenu) public: using QMenu::QMenu; // inherit all constructors of QMenu - void connectSignalsToEventEmitter() { QWIDGET_SIGNALS } + void connectSignalsToEventEmitter() { + QWIDGET_SIGNALS + + QObject::connect(this, &QMenu::triggered, [=](QAction* action) { + Napi::Env env = this->emitOnNode.Env(); + Napi::HandleScope scope(env); + auto actionInstance = QActionWrap::constructor.New( + {Napi::External::New(env, action)}); + this->emitOnNode.Call( + {Napi::String::New(env, "triggered"), actionInstance}); + }); + } }; diff --git a/src/cpp/include/nodegui/QtWidgets/QMenu/qmenu_wrap.h b/src/cpp/include/nodegui/QtWidgets/QMenu/qmenu_wrap.h index fd1d4186f..f45b158f5 100644 --- a/src/cpp/include/nodegui/QtWidgets/QMenu/qmenu_wrap.h +++ b/src/cpp/include/nodegui/QtWidgets/QMenu/qmenu_wrap.h @@ -19,6 +19,7 @@ class DLL_EXPORT QMenuWrap : public Napi::ObjectWrap { NMenu* getInternalInstance(); static Napi::FunctionReference constructor; // wrapped methods + Napi::Value clear(const Napi::CallbackInfo& info); Napi::Value setTitle(const Napi::CallbackInfo& info); Napi::Value addSeparator(const Napi::CallbackInfo& info); Napi::Value exec(const Napi::CallbackInfo& info); diff --git a/src/cpp/lib/QtWidgets/QAction/qaction_wrap.cpp b/src/cpp/lib/QtWidgets/QAction/qaction_wrap.cpp index 887286d92..7c1e531d2 100644 --- a/src/cpp/lib/QtWidgets/QAction/qaction_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QAction/qaction_wrap.cpp @@ -29,6 +29,8 @@ Napi::Object QActionWrap::init(Napi::Env env, Napi::Object exports) { InstanceMethod("isSeparator", &QActionWrap::isSeparator), InstanceMethod("setSeparator", &QActionWrap::setSeparator), InstanceMethod("setFont", &QActionWrap::setFont), + InstanceMethod("data", &QActionWrap::data), + InstanceMethod("setData", &QActionWrap::setData), QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE(QActionWrap)}); constructor = Napi::Persistent(func); exports.Set(CLASSNAME, func); @@ -204,4 +206,32 @@ Napi::Value QActionWrap::setFont(const Napi::CallbackInfo& info) { this->instance->setFont(*font); return env.Null(); -} \ No newline at end of file +} + +Napi::Value QActionWrap::setData(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + Napi::Object variantObject = info[0].As(); + QVariantWrap* variantWrap = + Napi::ObjectWrap::Unwrap(variantObject); + QVariant* variant = variantWrap->getInternalInstance(); + + this->instance->setData(*variant); + + return env.Null(); +} + +Napi::Value QActionWrap::data(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + QVariant variant = this->instance->data(); + if (variant.isNull()) { + return env.Null(); + } + auto instance = QVariantWrap::constructor.New( + {Napi::External::New(env, new QVariant(variant))}); + + return instance; +} diff --git a/src/cpp/lib/QtWidgets/QMenu/qmenu_wrap.cpp b/src/cpp/lib/QtWidgets/QMenu/qmenu_wrap.cpp index 082300b6e..bcfb9ebe2 100644 --- a/src/cpp/lib/QtWidgets/QMenu/qmenu_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QMenu/qmenu_wrap.cpp @@ -16,6 +16,7 @@ Napi::Object QMenuWrap::init(Napi::Env env, Napi::Object exports) { Napi::Function func = DefineClass(env, CLASSNAME, {InstanceMethod("setTitle", &QMenuWrap::setTitle), + InstanceMethod("clear", &QMenuWrap::clear), InstanceMethod("addSeparator", &QMenuWrap::addSeparator), InstanceMethod("exec", &QMenuWrap::exec), InstanceMethod("popup", &QMenuWrap::popup), @@ -50,6 +51,14 @@ QMenuWrap::QMenuWrap(const Napi::CallbackInfo& info) QMenuWrap::~QMenuWrap() { extrautils::safeDelete(this->instance); } +Napi::Value QMenuWrap::clear(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + this->instance->clear(); + return env.Null(); +} + Napi::Value QMenuWrap::setTitle(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); Napi::HandleScope scope(env); diff --git a/src/lib/QtGui/QApplication.ts b/src/lib/QtGui/QApplication.ts index 34e74bb3b..294b5f9e0 100644 --- a/src/lib/QtGui/QApplication.ts +++ b/src/lib/QtGui/QApplication.ts @@ -70,4 +70,6 @@ export class QApplication extends NodeObject { } } -export type QApplicationSignals = QObjectSignals; +export interface QApplicationSignals extends QObjectSignals { + focusWindowChanged: () => void; +} diff --git a/src/lib/QtWidgets/QAbstractScrollArea.ts b/src/lib/QtWidgets/QAbstractScrollArea.ts index dda9457be..cff280855 100644 --- a/src/lib/QtWidgets/QAbstractScrollArea.ts +++ b/src/lib/QtWidgets/QAbstractScrollArea.ts @@ -1,9 +1,11 @@ import { NodeWidget, QWidget } from './QWidget'; import { NodeFrame, QFrameSignals } from './QFrame'; import { ScrollBarPolicy } from '../QtEnums/ScrollBarPolicy'; +import { QSize } from '../QtCore/QSize'; +import { QScrollBar } from './QScrollBar'; /** - + > Abstract class to add functionalities common to all scrollarea based widgets. **This class implements all methods, properties of Qt's [QAbstractScrollArea class](https://doc.qt.io/qt-5/qabstractscrollarea.html) so that it can be inherited by all scroll based widgets** @@ -27,9 +29,18 @@ export abstract class QAbstractScrollArea The QAction class provides an abstract user interface action that can be inserted into widgets. * **This class is a JS wrapper around Qt's [QAction class](https://doc.qt.io/qt-5/qaction.html)** @@ -92,6 +93,12 @@ export class QAction extends NodeObject { font(): QFont { return QFont.fromQVariant(this.property('font')); } + setData(value: QVariant): void { + this.native.setData(value.native); + } + data(): QVariant { + return new QVariant(this.native.data()); + } } export interface QActionSignals extends QObjectSignals { diff --git a/src/lib/QtWidgets/QMenu.ts b/src/lib/QtWidgets/QMenu.ts index 2152e1964..14346496b 100644 --- a/src/lib/QtWidgets/QMenu.ts +++ b/src/lib/QtWidgets/QMenu.ts @@ -5,7 +5,7 @@ import { QAction } from './QAction'; import { QPoint } from '../QtCore/QPoint'; /** - + > The QMenu class provides a menu widget for use in menu bars, context menus, and other popup menus. * **This class is a JS wrapper around Qt's [QMenu class](https://doc.qt.io/qt-5/qmenu.html)** @@ -33,6 +33,9 @@ export class QMenu extends NodeWidget { this.native = native; this.setNodeParent(parent); } + clear(): void { + this.native.clear(); + } setTitle(title: string): void { this.native.setTitle(title); } @@ -53,4 +56,6 @@ export class QMenu extends NodeWidget { } } -export type QMenuSignals = QWidgetSignals; +export interface QMenuSignals extends QWidgetSignals { + triggered: (action: NativeElement) => void; +} diff --git a/src/lib/QtWidgets/QWidget.ts b/src/lib/QtWidgets/QWidget.ts index 3b385ac17..8a18b64f5 100644 --- a/src/lib/QtWidgets/QWidget.ts +++ b/src/lib/QtWidgets/QWidget.ts @@ -220,6 +220,9 @@ export abstract class NodeWidget extends YogaWid activateWindow(): void { this.native.activateWindow(); } + isActiveWindow(): boolean { + return this.property('isActiveWindow').toBool(); + } raise(): void { this.native.raise(); } diff --git a/src/lib/core/EventWidget.ts b/src/lib/core/EventWidget.ts index 5a9734290..711d883a2 100644 --- a/src/lib/core/EventWidget.ts +++ b/src/lib/core/EventWidget.ts @@ -40,7 +40,16 @@ export abstract class EventWidget extends Component { if (native.initNodeEventEmitter) { this.emitter = new EventEmitter(); this.emitter.emit = wrapWithActivateUvLoop(this.emitter.emit.bind(this.emitter)); - native.initNodeEventEmitter(this.emitter.emit); + const logExceptions = (event: string | symbol, ...args: any[]): boolean => { + try { + return this.emitter.emit(event, ...args); + } catch (e) { + console.log(`An exception was thrown while dispatching an event of type '${event.toString()}':`); + console.log(e); + } + return false; + }; + native.initNodeEventEmitter(logExceptions); } else { throw new Error('initNodeEventEmitter not implemented on native side'); }