From e3667c0bbdeddc51b0d80e37e83769825ba1c10d Mon Sep 17 00:00:00 2001 From: Atul R Date: Mon, 11 Nov 2019 22:51:15 +0100 Subject: [PATCH] Adds QSize and few more test cases for pixmap, qsize and qvariant (#194) * Adds qsize, qvariant adn qpixmap testcases * lint --- CMakeLists.txt | 1 + .../include/nodegui/QtCore/QSize/qsize_wrap.h | 31 ++ .../nodegui/QtWidgets/QWidget/qwidget_macro.h | 496 +++++++++--------- src/cpp/lib/QtCore/QSize/qsize_wrap.cpp | 86 +++ src/cpp/main.cpp | 2 + src/index.ts | 1 + src/lib/QtCore/QSize.ts | 35 ++ src/lib/QtCore/__tests__/QSize.test.ts | 29 + src/lib/QtCore/__tests__/QVariant.test.ts | 16 +- src/lib/QtGui/QPixmap.ts | 13 +- src/lib/QtGui/__tests__/QPixmap.test.ts | 66 +++ src/lib/QtGui/__tests__/assets/.gitignore | 2 + src/lib/QtGui/__tests__/assets/nodegui.png | Bin 0 -> 67511 bytes src/lib/QtWidgets/QWidget.ts | 5 +- src/lib/QtWidgets/__tests__/QWidget.test.ts | 4 +- 15 files changed, 519 insertions(+), 268 deletions(-) create mode 100644 src/cpp/include/nodegui/QtCore/QSize/qsize_wrap.h create mode 100644 src/cpp/lib/QtCore/QSize/qsize_wrap.cpp create mode 100644 src/lib/QtCore/QSize.ts create mode 100644 src/lib/QtCore/__tests__/QSize.test.ts create mode 100644 src/lib/QtGui/__tests__/QPixmap.test.ts create mode 100644 src/lib/QtGui/__tests__/assets/.gitignore create mode 100644 src/lib/QtGui/__tests__/assets/nodegui.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 5233ec216..bc2802e54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QKeySequence/qkeysequence_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QObject/qobject_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QVariant/qvariant_wrap.cpp" + "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSize/qsize_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QWidget/qwidget_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QGridLayout/qgridlayout_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDial/qdial_wrap.cpp" diff --git a/src/cpp/include/nodegui/QtCore/QSize/qsize_wrap.h b/src/cpp/include/nodegui/QtCore/QSize/qsize_wrap.h new file mode 100644 index 000000000..e69927d62 --- /dev/null +++ b/src/cpp/include/nodegui/QtCore/QSize/qsize_wrap.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +#include + +#include "core/Component/component_macro.h" + +class QSizeWrap : public Napi::ObjectWrap { + private: + std::unique_ptr instance; + + public: + static Napi::FunctionReference constructor; + static Napi::Object init(Napi::Env env, Napi::Object exports); + QSizeWrap(const Napi::CallbackInfo& info); + ~QSizeWrap(); + QSize* getInternalInstance(); + // Wrapped methods + Napi::Value setHeight(const Napi::CallbackInfo& info); + Napi::Value setWidth(const Napi::CallbackInfo& info); + Napi::Value height(const Napi::CallbackInfo& info); + Napi::Value width(const Napi::CallbackInfo& info); + + COMPONENT_WRAPPED_METHODS_DECLARATION +}; + +namespace StaticQSizeWrapMethods { +Napi::Value fromQVariant(const Napi::CallbackInfo& info); +} // namespace StaticQSizeWrapMethods \ No newline at end of file diff --git a/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h b/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h index f942bc839..f7523b2d8 100644 --- a/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h +++ b/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h @@ -3,6 +3,7 @@ #include #include "QtCore/QObject/qobject_macro.h" +#include "QtCore/QSize/qsize_wrap.h" #include "QtGui/QIcon/qicon_wrap.h" #include "QtWidgets/QLayout/qlayout_wrap.h" #include "core/YogaWidget/yogawidget_macro.h" @@ -14,254 +15,253 @@ */ #ifndef QWIDGET_WRAPPED_METHODS_DECLARATION -#define QWIDGET_WRAPPED_METHODS_DECLARATION \ - \ - YOGAWIDGET_WRAPPED_METHODS_DECLARATION \ - QOBJECT_WRAPPED_METHODS_DECLARATION \ - \ - Napi::Value show(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - this->instance->show(); \ - return env.Null(); \ - } \ - Napi::Value resize(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::Number width = info[0].As(); \ - Napi::Number height = info[1].As(); \ - this->instance->resize(width.Int32Value(), height.Int32Value()); \ - return env.Null(); \ - } \ - Napi::Value close(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - bool hasClosed = this->instance->close(); \ - return Napi::Boolean::New(env, hasClosed); \ - } \ - Napi::Value isVisible(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - bool isVisible = this->instance->isVisible(); \ - return Napi::Boolean::New(env, isVisible); \ - } \ - \ - Napi::Value setLayout(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::Object layoutObject = info[0].As(); \ - QLayoutWrap* layoutWrap = \ - Napi::ObjectWrap::Unwrap(layoutObject); \ - this->instance->setLayout(layoutWrap->getInternalInstance()); \ - return env.Null(); \ - } \ - \ - Napi::Value setStyleSheet(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::String text = info[0].As(); \ - std::string style = text.Utf8Value(); \ - this->instance->setStyleSheet(style.c_str()); \ - return env.Null(); \ - } \ - Napi::Value setCursor(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::Number cursor = info[0].As(); \ - this->instance->setCursor( \ - static_cast(cursor.Int32Value())); \ - return env.Null(); \ - } \ - Napi::Value setWindowIcon(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::Object iconObject = info[0].As(); \ - QIconWrap* iconWrap = Napi::ObjectWrap::Unwrap(iconObject); \ - this->instance->setWindowIcon(*iconWrap->getInternalInstance()); \ - return env.Null(); \ - } \ - Napi::Value setWindowState(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::Number state = info[0].As(); \ - this->instance->setWindowState( \ - static_cast(state.Int32Value())); \ - return env.Null(); \ - } \ - Napi::Value setWindowTitle(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::String napiTitle = info[0].As(); \ - std::string title = napiTitle.Utf8Value(); \ - this->instance->setWindowTitle(title.c_str()); \ - return env.Null(); \ - } \ - Napi::Value styleSheet(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - QString stylesheet = this->instance->styleSheet(); \ - return Napi::String::New(env, stylesheet.toStdString()); \ - } \ - Napi::Value hide(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - this->instance->hide(); \ - return env.Null(); \ - } \ - Napi::Value move(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - int x = info[0].As().Int32Value(); \ - int y = info[1].As().Int32Value(); \ - this->instance->move(x, y); \ - return env.Null(); \ - } \ - \ - Napi::Value setMouseTracking(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::Boolean isMouseTracked = info[0].As(); \ - this->instance->setMouseTracking(isMouseTracked.Value()); \ - return env.Null(); \ - } \ - Napi::Value hasMouseTracking(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - bool isMouseTracked = this->instance->hasMouseTracking(); \ - return Napi::Value::From(env, isMouseTracked); \ - } \ - Napi::Value setEnabled(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - Napi::Boolean enabled = info[0].As(); \ - this->instance->setEnabled(enabled.Value()); \ - return env.Null(); \ - } \ - Napi::Value isEnabled(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - bool enabled = this->instance->isEnabled(); \ - return Napi::Value::From(env, enabled); \ - } \ - Napi::Value setFixedSize(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - int width = info[0].As().Int32Value(); \ - int height = info[1].As().Int32Value(); \ - this->instance->setFixedSize(width, height); \ - return env.Null(); \ - } \ - Napi::Value setGeometry(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - int x = info[0].As().Int32Value(); \ - int y = info[1].As().Int32Value(); \ - int width = info[2].As().Int32Value(); \ - int height = info[3].As().Int32Value(); \ - this->instance->setGeometry(x, y, width, height); \ - return env.Null(); \ - } \ - Napi::Value geometry(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - QRect geometry = this->instance->geometry(); \ - Napi::Object geometryObj = Napi::Object::New(env); \ - geometryObj.Set("width", geometry.width()); \ - geometryObj.Set("height", geometry.height()); \ - geometryObj.Set("x", geometry.x()); \ - geometryObj.Set("y", geometry.y()); \ - return geometryObj; \ - } \ - Napi::Value setMaximumSize(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - int width = info[0].As().Int32Value(); \ - int height = info[1].As().Int32Value(); \ - this->instance->setMaximumSize(width, height); \ - return env.Null(); \ - } \ - Napi::Value setMinimumSize(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - int width = info[0].As().Int32Value(); \ - int height = info[1].As().Int32Value(); \ - this->instance->setMinimumSize(width, height); \ - return env.Null(); \ - } \ - Napi::Value repaint(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - this->instance->repaint(); \ - return env.Null(); \ - } \ - Napi::Value update(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - this->instance->update(); \ - return env.Null(); \ - } \ - Napi::Value updateGeometry(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - this->instance->updateGeometry(); \ - return env.Null(); \ - } \ - Napi::Value pos(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - QPoint pos = this->instance->pos(); \ - Napi::Object posObj = Napi::Object::New(env); \ - posObj.Set("x", pos.x()); \ - posObj.Set("y", pos.y()); \ - return posObj; \ - } \ - Napi::Value size(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - QSize size = this->instance->size(); \ - Napi::Object sizeObj = Napi::Object::New(env); \ - sizeObj.Set("width", size.width()); \ - sizeObj.Set("height", size.height()); \ - return sizeObj; \ - } \ - Napi::Value setAttribute(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - int attributeId = info[0].As().Int32Value(); \ - bool switchOn = info[1].As().Value(); \ - this->instance->setAttribute( \ - static_cast(attributeId), switchOn); \ - return env.Null(); \ - } \ - Napi::Value testAttribute(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - int attributeId = info[0].As().Int32Value(); \ - bool isOn = this->instance->testAttribute( \ - static_cast(attributeId)); \ - return Napi::Boolean::New(env, isOn); \ - } \ - Napi::Value setWindowOpacity(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - float opacity = info[0].As().FloatValue(); \ - this->instance->setWindowOpacity(opacity); \ - return env.Null(); \ - } \ - Napi::Value windowOpacity(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - float opacity = this->instance->windowOpacity(); \ - return Napi::Value::From(env, opacity); \ - } \ - Napi::Value setWindowFlag(const Napi::CallbackInfo& info) { \ - Napi::Env env = info.Env(); \ - Napi::HandleScope scope(env); \ - int windowType = info[0].As().Int32Value(); \ - bool switchOn = info[1].As().Value(); \ - this->instance->setWindowFlag(static_cast(windowType), \ - switchOn); \ - return env.Null(); \ +#define QWIDGET_WRAPPED_METHODS_DECLARATION \ + \ + YOGAWIDGET_WRAPPED_METHODS_DECLARATION \ + QOBJECT_WRAPPED_METHODS_DECLARATION \ + \ + Napi::Value show(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + this->instance->show(); \ + return env.Null(); \ + } \ + Napi::Value resize(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Number width = info[0].As(); \ + Napi::Number height = info[1].As(); \ + this->instance->resize(width.Int32Value(), height.Int32Value()); \ + return env.Null(); \ + } \ + Napi::Value close(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + bool hasClosed = this->instance->close(); \ + return Napi::Boolean::New(env, hasClosed); \ + } \ + Napi::Value isVisible(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + bool isVisible = this->instance->isVisible(); \ + return Napi::Boolean::New(env, isVisible); \ + } \ + \ + Napi::Value setLayout(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Object layoutObject = info[0].As(); \ + QLayoutWrap* layoutWrap = \ + Napi::ObjectWrap::Unwrap(layoutObject); \ + this->instance->setLayout(layoutWrap->getInternalInstance()); \ + return env.Null(); \ + } \ + \ + Napi::Value setStyleSheet(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::String text = info[0].As(); \ + std::string style = text.Utf8Value(); \ + this->instance->setStyleSheet(style.c_str()); \ + return env.Null(); \ + } \ + Napi::Value setCursor(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Number cursor = info[0].As(); \ + this->instance->setCursor( \ + static_cast(cursor.Int32Value())); \ + return env.Null(); \ + } \ + Napi::Value setWindowIcon(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Object iconObject = info[0].As(); \ + QIconWrap* iconWrap = Napi::ObjectWrap::Unwrap(iconObject); \ + this->instance->setWindowIcon(*iconWrap->getInternalInstance()); \ + return env.Null(); \ + } \ + Napi::Value setWindowState(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Number state = info[0].As(); \ + this->instance->setWindowState( \ + static_cast(state.Int32Value())); \ + return env.Null(); \ + } \ + Napi::Value setWindowTitle(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::String napiTitle = info[0].As(); \ + std::string title = napiTitle.Utf8Value(); \ + this->instance->setWindowTitle(title.c_str()); \ + return env.Null(); \ + } \ + Napi::Value styleSheet(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + QString stylesheet = this->instance->styleSheet(); \ + return Napi::String::New(env, stylesheet.toStdString()); \ + } \ + Napi::Value hide(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + this->instance->hide(); \ + return env.Null(); \ + } \ + Napi::Value move(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + int x = info[0].As().Int32Value(); \ + int y = info[1].As().Int32Value(); \ + this->instance->move(x, y); \ + return env.Null(); \ + } \ + \ + Napi::Value setMouseTracking(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Boolean isMouseTracked = info[0].As(); \ + this->instance->setMouseTracking(isMouseTracked.Value()); \ + return env.Null(); \ + } \ + Napi::Value hasMouseTracking(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + bool isMouseTracked = this->instance->hasMouseTracking(); \ + return Napi::Value::From(env, isMouseTracked); \ + } \ + Napi::Value setEnabled(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Boolean enabled = info[0].As(); \ + this->instance->setEnabled(enabled.Value()); \ + return env.Null(); \ + } \ + Napi::Value isEnabled(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + bool enabled = this->instance->isEnabled(); \ + return Napi::Value::From(env, enabled); \ + } \ + Napi::Value setFixedSize(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + int width = info[0].As().Int32Value(); \ + int height = info[1].As().Int32Value(); \ + this->instance->setFixedSize(width, height); \ + return env.Null(); \ + } \ + Napi::Value setGeometry(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + int x = info[0].As().Int32Value(); \ + int y = info[1].As().Int32Value(); \ + int width = info[2].As().Int32Value(); \ + int height = info[3].As().Int32Value(); \ + this->instance->setGeometry(x, y, width, height); \ + return env.Null(); \ + } \ + Napi::Value geometry(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + QRect geometry = this->instance->geometry(); \ + Napi::Object geometryObj = Napi::Object::New(env); \ + geometryObj.Set("width", geometry.width()); \ + geometryObj.Set("height", geometry.height()); \ + geometryObj.Set("x", geometry.x()); \ + geometryObj.Set("y", geometry.y()); \ + return geometryObj; \ + } \ + Napi::Value setMaximumSize(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + int width = info[0].As().Int32Value(); \ + int height = info[1].As().Int32Value(); \ + this->instance->setMaximumSize(width, height); \ + return env.Null(); \ + } \ + Napi::Value setMinimumSize(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + int width = info[0].As().Int32Value(); \ + int height = info[1].As().Int32Value(); \ + this->instance->setMinimumSize(width, height); \ + return env.Null(); \ + } \ + Napi::Value repaint(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + this->instance->repaint(); \ + return env.Null(); \ + } \ + Napi::Value update(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + this->instance->update(); \ + return env.Null(); \ + } \ + Napi::Value updateGeometry(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + this->instance->updateGeometry(); \ + return env.Null(); \ + } \ + Napi::Value pos(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + QPoint pos = this->instance->pos(); \ + Napi::Object posObj = Napi::Object::New(env); \ + posObj.Set("x", pos.x()); \ + posObj.Set("y", pos.y()); \ + return posObj; \ + } \ + Napi::Value size(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + QSize size = this->instance->size(); \ + auto sizeWrap = QSizeWrap::constructor.New({Napi::External::New( \ + env, new QSize(size.width(), size.height()))}); \ + return sizeWrap; \ + } \ + Napi::Value setAttribute(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + int attributeId = info[0].As().Int32Value(); \ + bool switchOn = info[1].As().Value(); \ + this->instance->setAttribute( \ + static_cast(attributeId), switchOn); \ + return env.Null(); \ + } \ + Napi::Value testAttribute(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + int attributeId = info[0].As().Int32Value(); \ + bool isOn = this->instance->testAttribute( \ + static_cast(attributeId)); \ + return Napi::Boolean::New(env, isOn); \ + } \ + Napi::Value setWindowOpacity(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + float opacity = info[0].As().FloatValue(); \ + this->instance->setWindowOpacity(opacity); \ + return env.Null(); \ + } \ + Napi::Value windowOpacity(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + float opacity = this->instance->windowOpacity(); \ + return Napi::Value::From(env, opacity); \ + } \ + Napi::Value setWindowFlag(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + int windowType = info[0].As().Int32Value(); \ + bool switchOn = info[1].As().Value(); \ + this->instance->setWindowFlag(static_cast(windowType), \ + switchOn); \ + return env.Null(); \ } #endif // QWIDGET_WRAPPED_METHODS_DECLARATION diff --git a/src/cpp/lib/QtCore/QSize/qsize_wrap.cpp b/src/cpp/lib/QtCore/QSize/qsize_wrap.cpp new file mode 100644 index 000000000..27fa4b637 --- /dev/null +++ b/src/cpp/lib/QtCore/QSize/qsize_wrap.cpp @@ -0,0 +1,86 @@ +#include "QtCore/QSize/qsize_wrap.h" + +#include "Extras/Utils/nutils.h" +#include "QtCore/QVariant/qvariant_wrap.h" + +Napi::FunctionReference QSizeWrap::constructor; + +Napi::Object QSizeWrap::init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + char CLASSNAME[] = "QSize"; + Napi::Function func = DefineClass( + env, CLASSNAME, + {InstanceMethod("setHeight", &QSizeWrap::setHeight), + InstanceMethod("setWidth", &QSizeWrap::setWidth), + InstanceMethod("height", &QSizeWrap::height), + InstanceMethod("width", &QSizeWrap::width), + StaticMethod("fromQVariant", &StaticQSizeWrapMethods::fromQVariant), + COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE}); + constructor = Napi::Persistent(func); + exports.Set(CLASSNAME, func); + return exports; +} + +QSizeWrap::QSizeWrap(const Napi::CallbackInfo& info) + : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + if (info.Length() == 2) { + int width = info[0].As().Int32Value(); + int height = info[1].As().Int32Value(); + this->instance = std::make_unique(width, height); + } else if (info.Length() == 1) { + this->instance = + std::unique_ptr(info[0].As>().Data()); + } else if (info.Length() == 0) { + this->instance = std::make_unique(); + } else { + Napi::TypeError::New(env, "Wrong number of arguments") + .ThrowAsJavaScriptException(); + } + this->rawData = this->getInternalInstance(); +} + +QSizeWrap::~QSizeWrap() { this->instance.reset(); } + +QSize* QSizeWrap::getInternalInstance() { return this->instance.get(); } + +Napi::Value QSizeWrap::setHeight(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + int height = info[0].As().Int32Value(); + this->instance->setHeight(height); + return env.Null(); +} +Napi::Value QSizeWrap::setWidth(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + int width = info[0].As().Int32Value(); + this->instance->setWidth(width); + return env.Null(); +} +Napi::Value QSizeWrap::height(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + return Napi::Value::From(env, this->instance->height()); +} +Napi::Value QSizeWrap::width(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + return Napi::Value::From(env, this->instance->width()); +} + +Napi::Value StaticQSizeWrapMethods::fromQVariant( + 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(); + QSize size = variant->value(); + auto instance = QSizeWrap::constructor.New({Napi::External::New( + env, new QSize(size.width(), size.height()))}); + return instance; +} diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 398046b91..8786ab8f9 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -1,6 +1,7 @@ #include #include "QtCore/QObject/qobject_wrap.h" +#include "QtCore/QSize/qsize_wrap.h" #include "QtCore/QVariant/qvariant_wrap.h" #include "QtGui/QApplication/qapplication_wrap.h" #include "QtGui/QClipboard/qclipboard_wrap.h" @@ -40,6 +41,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) { QApplicationWrap::init(env, exports); QObjectWrap::init(env, exports); QVariantWrap::init(env, exports); + QSizeWrap::init(env, exports); QClipboardWrap::init(env, exports); QWidgetWrap::init(env, exports); QPixmapWrap::init(env, exports); diff --git a/src/index.ts b/src/index.ts index 2de27289d..f9a476851 100644 --- a/src/index.ts +++ b/src/index.ts @@ -40,6 +40,7 @@ export { QShortcut, QShortcutEvents } from './lib/QtWidgets/QShortcut'; // Core export { QObject, NodeObject } from './lib/QtCore/QObject'; export { QVariant } from './lib/QtCore/QVariant'; +export { QSize } from './lib/QtCore/QSize'; // Layouts: export { QGridLayout } from './lib/QtWidgets/QGridLayout'; export { FlexLayout } from './lib/core/FlexLayout'; diff --git a/src/lib/QtCore/QSize.ts b/src/lib/QtCore/QSize.ts new file mode 100644 index 000000000..70a026738 --- /dev/null +++ b/src/lib/QtCore/QSize.ts @@ -0,0 +1,35 @@ +import { NativeElement, Component } from '../core/Component'; +import addon from '../utils/addon'; +import { checkIfNativeElement } from '../utils/helpers'; +import { QVariant } from './QVariant'; + +type argument = number | NativeElement; + +export class QSize extends Component { + native: NativeElement; + constructor(arg?: argument, height?: number) { + super(); + if (!arg) { + this.native = new addon.QSize(); + } else if (checkIfNativeElement(arg)) { + this.native = arg as NativeElement; + } else { + this.native = new addon.QSize(arg, height); + } + } + setWidth(width: number): void { + return this.native.setWidth(width); + } + width(): number { + return this.native.width(); + } + setHeight(height: number): void { + return this.native.setHeight(height); + } + height(): number { + return this.native.height(); + } + static fromQVariant(variant: QVariant): QSize { + return addon.QSize.fromQVariant(variant.native); + } +} diff --git a/src/lib/QtCore/__tests__/QSize.test.ts b/src/lib/QtCore/__tests__/QSize.test.ts new file mode 100644 index 000000000..7adbdd3ec --- /dev/null +++ b/src/lib/QtCore/__tests__/QSize.test.ts @@ -0,0 +1,29 @@ +import { QSize } from '../QSize'; +import { QVariant } from '../QVariant'; + +describe('QSize', () => { + it('initialize empty', () => { + const size = new QSize(); + expect(size).toBeTruthy(); + }); + it('initialize with width and height', () => { + const size = new QSize(300, 200); + expect(size).toBeTruthy(); + }); + it('width', () => { + const size = new QSize(); + size.setWidth(300); + expect(size.width()).toBe(300); + }); + it('height', () => { + const size = new QSize(); + size.setHeight(200); + expect(size.height()).toBe(200); + }); + it('initialize from QVariant', () => { + const size = new QSize(300, 200); + const variant = new QVariant(size); + expect(variant).toBeTruthy(); + expect(QSize.fromQVariant(variant).height()).toBe(size.height()); + }); +}); diff --git a/src/lib/QtCore/__tests__/QVariant.test.ts b/src/lib/QtCore/__tests__/QVariant.test.ts index 6addaf2f3..78b0f8ce3 100644 --- a/src/lib/QtCore/__tests__/QVariant.test.ts +++ b/src/lib/QtCore/__tests__/QVariant.test.ts @@ -3,38 +3,34 @@ import { QPixmap } from '../../QtGui/QPixmap'; import path from 'path'; describe('QVariant', () => { - it('inherits from QVariant', () => { - const variant = new QVariant(); - expect(variant.constructor.name).toEqual('QVariant'); - }); it('initialize empty', () => { const variant = new QVariant(); - expect(variant.constructor.name).toEqual('QVariant'); + expect(variant).toBeTruthy(); }); it('initialize with string', () => { const variant = new QVariant('hello'); - expect(variant.constructor.name).toBe('QVariant'); + expect(variant).toBeTruthy(); expect(variant.toString()).toEqual('hello'); }); it('initialize with int', () => { const variant = new QVariant(123); - expect(variant.constructor.name).toBe('QVariant'); + expect(variant).toBeTruthy(); expect(variant.toInt()).toEqual(123); }); it('initialize with double', () => { const variant = new QVariant(12.33); - expect(variant.constructor.name).toBe('QVariant'); + expect(variant).toBeTruthy(); expect(variant.toDouble()).toEqual(12.33); }); it('initialize with boolean', () => { const variant = new QVariant(true); - expect(variant.constructor.name).toBe('QVariant'); + expect(variant).toBeTruthy(); expect(variant.toBool()).toEqual(true); }); it('initialize with complex objects', () => { const pixmap = new QPixmap(path.resolve(__dirname, 'nodegui.png')); const variant = new QVariant(pixmap); - expect(variant.constructor.name).toBe('QVariant'); + expect(variant).toBeTruthy(); expect(QPixmap.fromQVariant(variant).height()).toBe(pixmap.height()); }); }); diff --git a/src/lib/QtGui/QPixmap.ts b/src/lib/QtGui/QPixmap.ts index 54a3a9a65..63382e1b1 100644 --- a/src/lib/QtGui/QPixmap.ts +++ b/src/lib/QtGui/QPixmap.ts @@ -21,14 +21,13 @@ export class QPixmap extends Component { this.native = new addon.QPixmap(); } } - load = (imageUrl: string): boolean => { + load(imageUrl: string): boolean { return this.native.load(imageUrl); - }; - save = (fileName: string, format?: ReadWriteImageFormats): boolean => { - //TODO: quality argument + } + save(fileName: string, format?: ReadWriteImageFormats): boolean { return format ? this.native.save(fileName, format) : this.native.save(fileName); - }; - scaled = (width: number, height: number, aspectRatioMode?: AspectRatioMode): QPixmap => { + } + scaled(width: number, height: number, aspectRatioMode?: AspectRatioMode): QPixmap { let nativePixmap; if (aspectRatioMode) { nativePixmap = this.native.scaled(width, height, aspectRatioMode); @@ -36,7 +35,7 @@ export class QPixmap extends Component { nativePixmap = this.native.scaled(width, height); } return new QPixmap(nativePixmap); - }; + } height(): number { return this.native.height(); } diff --git a/src/lib/QtGui/__tests__/QPixmap.test.ts b/src/lib/QtGui/__tests__/QPixmap.test.ts new file mode 100644 index 000000000..68596bd9d --- /dev/null +++ b/src/lib/QtGui/__tests__/QPixmap.test.ts @@ -0,0 +1,66 @@ +import { QPixmap } from '../QPixmap'; +import path from 'path'; +import { QVariant } from '../../QtCore/QVariant'; +import { AspectRatioMode } from '../../QtEnums'; +import fs from 'fs'; + +const testImagePath = path.resolve(__dirname, 'assets', 'nodegui.png'); +describe('QPixmap', () => { + it('initialize empty', () => { + const pixmap = new QPixmap(); + expect(pixmap).toBeTruthy(); + }); + it('initialize with string', () => { + const pixmap = new QPixmap(testImagePath); + expect(pixmap).toBeTruthy(); + }); + it('width', () => { + const pixmap = new QPixmap(testImagePath); + expect(pixmap.width()).toBe(1000); + }); + it('height', () => { + const pixmap = new QPixmap(testImagePath); + expect(pixmap.height()).toBe(1083); + }); + it('initialize from QVariant', () => { + const pixmap = new QPixmap(testImagePath); + const variant = new QVariant(pixmap); + expect(variant).toBeTruthy(); + expect(QPixmap.fromQVariant(variant).height()).toBe(pixmap.height()); + }); + it('scaled without aspect ratio', () => { + const pixmap = new QPixmap(testImagePath); + const newPixmap = pixmap.scaled(300, 340, AspectRatioMode.IgnoreAspectRatio); + expect(newPixmap.width()).toBe(300); + expect(newPixmap.height()).toBe(340); + }); + it('scaled with aspect ratio', () => { + const pixmap = new QPixmap(testImagePath); + const newPixmap = pixmap.scaled(100, 100, AspectRatioMode.KeepAspectRatio); + expect(newPixmap.width()).toBe(92); + expect(newPixmap.height()).toBe(100); + }); + it('load from file', () => { + const pixmap = new QPixmap(); + expect(pixmap.height()).toBe(0); + const isLoaded = pixmap.load(testImagePath); + expect(isLoaded).toBe(true); + expect(pixmap.height()).toBe(1083); + }); + it('save to a file', async () => { + const outputFilePath = path.resolve(__dirname, 'assets', 'nodegui_save.png'); + await new Promise(resolve => fs.unlink(outputFilePath, resolve)); + const pixmap = new QPixmap(testImagePath); + pixmap.save(outputFilePath); + const exists = await new Promise(resolve => fs.exists(outputFilePath, resolve)); + expect(exists).toBe(true); + }); + it('save to a file of different format', async () => { + const outputFilePath = path.resolve(__dirname, 'assets', 'nodegui_save.jpg'); + await new Promise(resolve => fs.unlink(outputFilePath, resolve)); + const pixmap = new QPixmap(testImagePath); + pixmap.save(outputFilePath, 'JPG'); + const exists = await new Promise(resolve => fs.exists(outputFilePath, resolve)); + expect(exists).toBe(true); + }); +}); diff --git a/src/lib/QtGui/__tests__/assets/.gitignore b/src/lib/QtGui/__tests__/assets/.gitignore new file mode 100644 index 000000000..3df6667dd --- /dev/null +++ b/src/lib/QtGui/__tests__/assets/.gitignore @@ -0,0 +1,2 @@ +nodegui_save.png +nodegui_save.jpg \ No newline at end of file diff --git a/src/lib/QtGui/__tests__/assets/nodegui.png b/src/lib/QtGui/__tests__/assets/nodegui.png new file mode 100644 index 0000000000000000000000000000000000000000..79d6b33a1d07fbe05029add198b1791b045b8b1c GIT binary patch literal 67511 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%0Du2IdeVYGaZgoE;2sY? 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 { }); it('setFixedSize', () => { view.setFixedSize(10, 12); - expect(view.size()).toEqual({ width: 10, height: 12 }); + const size = view.size(); + expect(size.width()).toBe(10); + expect(size.height()).toBe(12); }); it('setWindowOpacity', () => { view.setWindowOpacity(0.6);