From cf4e221fdfc2c58a167f298f24a6d803dd9fd416 Mon Sep 17 00:00:00 2001 From: feng8848 <40539968+feng8848@users.noreply.github.com> Date: Wed, 25 Mar 2020 03:15:57 +0800 Subject: [PATCH] Add QDoubleSpinBox (#463) Co-authored-by: wuxiaofeng --- CMakeLists.txt | 2 + .../QDoubleSpinBox/ndoublespinbox.hpp | 29 +++++ .../QDoubleSpinBox/qdoublespinbox_wrap.h | 28 +++++ .../QDoubleSpinBox/qdoublespinbox_wrap.cpp | 79 ++++++++++++++ src/cpp/main.cpp | 2 + src/index.ts | 1 + src/lib/QtWidgets/QDoubleSpinBox.ts | 101 ++++++++++++++++++ 7 files changed, 242 insertions(+) create mode 100644 src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/ndoublespinbox.hpp create mode 100644 src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.h create mode 100644 src/cpp/lib/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.cpp create mode 100644 src/lib/QtWidgets/QDoubleSpinBox.ts diff --git a/CMakeLists.txt b/CMakeLists.txt index b8a623a15..a6abbabb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QComboBox/qcombobox_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDateEdit/qdateedit_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDateTimeEdit/qdatetimeedit_wrap.cpp" + "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QFileDialog/qfiledialog_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QFrame/qframe_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QListWidget/qlistwidget_wrap.cpp" @@ -126,6 +127,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDateEdit/ndateedit.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDateTimeEdit/ndatetimeedit.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDial/ndial.hpp" + "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/ndoublespinbox.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QFileDialog/nfiledialog.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QFrame/nframe.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QListWidget/nlistwidget.hpp" diff --git a/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/ndoublespinbox.hpp b/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/ndoublespinbox.hpp new file mode 100644 index 000000000..f1a089f56 --- /dev/null +++ b/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/ndoublespinbox.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "Extras/Export/export.h" +#include "QtWidgets/QAbstractSpinBox/qabstractspinbox_macro.h" +#include "core/NodeWidget/nodewidget.h" +#include "napi.h" + +class DLL_EXPORT NDoubleSpinBox : public QDoubleSpinBox, public NodeWidget { + Q_OBJECT + NODEWIDGET_IMPLEMENTATIONS(QDoubleSpinBox) + public: + using QDoubleSpinBox::QDoubleSpinBox; // inherit all constructors of + // QDoubleSpinBox + + void connectSignalsToEventEmitter() { + QABSTRACTSPINBOX_SIGNALS + // Qt Connects: Implement all signal connects here + QObject::connect( + this, QOverload::of(&QDoubleSpinBox::valueChanged), + [=](double val) { + Napi::Env env = this->emitOnNode.Env(); + Napi::HandleScope scope(env); + this->emitOnNode.Call({Napi::String::New(env, "valueChanged"), + Napi::Number::New(env, val)}); + }); + } +}; diff --git a/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.h b/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.h new file mode 100644 index 000000000..435aa3a2d --- /dev/null +++ b/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include + +#include "Extras/Export/export.h" +#include "QtWidgets/QAbstractSpinBox/qabstractspinbox_macro.h" +#include "ndoublespinbox.hpp" + +class DLL_EXPORT QDoubleSpinBoxWrap + : public Napi::ObjectWrap { + QABSTRACTSPINBOX_WRAPPED_METHODS_DECLARATION + private: + QPointer instance; + + public: + static Napi::Object init(Napi::Env env, Napi::Object exports); + QDoubleSpinBoxWrap(const Napi::CallbackInfo& info); + ~QDoubleSpinBoxWrap(); + NDoubleSpinBox* getInternalInstance(); + // class constructor + static Napi::FunctionReference constructor; + // wrapped methods + Napi::Value setRange(const Napi::CallbackInfo& info); + Napi::Value textFromValue(const Napi::CallbackInfo& info); + Napi::Value valueFromText(const Napi::CallbackInfo& info); +}; diff --git a/src/cpp/lib/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.cpp b/src/cpp/lib/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.cpp new file mode 100644 index 000000000..83ae49cbe --- /dev/null +++ b/src/cpp/lib/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.cpp @@ -0,0 +1,79 @@ +#include "QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.h" + +#include "Extras/Utils/nutils.h" +#include "QtWidgets/QWidget/qwidget_wrap.h" + +Napi::FunctionReference QDoubleSpinBoxWrap::constructor; + +Napi::Object QDoubleSpinBoxWrap::init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + char CLASSNAME[] = "QDoubleSpinBox"; + Napi::Function func = DefineClass( + env, CLASSNAME, + {InstanceMethod("setRange", &QDoubleSpinBoxWrap::setRange), + InstanceMethod("textFromValue", &QDoubleSpinBoxWrap::textFromValue), + InstanceMethod("valueFromText", &QDoubleSpinBoxWrap::valueFromText), + QABSTRACTSPINBOX_WRAPPED_METHODS_EXPORT_DEFINE(QDoubleSpinBoxWrap)}); + constructor = Napi::Persistent(func); + exports.Set(CLASSNAME, func); + return exports; +} + +NDoubleSpinBox* QDoubleSpinBoxWrap::getInternalInstance() { + return this->instance; +} + +QDoubleSpinBoxWrap::QDoubleSpinBoxWrap(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(); + NodeWidgetWrap* parentWidgetWrap = + Napi::ObjectWrap::Unwrap(parentObject); + this->instance = + new NDoubleSpinBox(parentWidgetWrap->getInternalInstance()); + } else if (info.Length() == 0) { + this->instance = new NDoubleSpinBox(); + } else { + Napi::TypeError::New(env, "Wrong number of arguments") + .ThrowAsJavaScriptException(); + } + this->rawData = extrautils::configureQWidget( + this->getInternalInstance(), this->getInternalInstance()->getFlexNode(), + true); +} + +QDoubleSpinBoxWrap::~QDoubleSpinBoxWrap() { + extrautils::safeDelete(this->instance); +} + +Napi::Value QDoubleSpinBoxWrap::setRange(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + double minimum = info[0].As().DoubleValue(); + double maximum = info[1].As().DoubleValue(); + this->instance->setRange(minimum, maximum); + return env.Null(); +} + +Napi::Value QDoubleSpinBoxWrap::textFromValue(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + double value = info[0].As().DoubleValue(); + QString text = this->instance->textFromValue(value); + return Napi::String::New(env, text.toStdString()); +} + +Napi::Value QDoubleSpinBoxWrap::valueFromText(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + std::string napiText = info[0].As().Utf8Value(); + QString text = QString::fromUtf8(napiText.c_str()); + double value = this->instance->valueFromText(text); + return Napi::Number::New(env, value); +} diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 56c5484b9..5ca3ba9f2 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -37,6 +37,7 @@ #include "QtWidgets/QDateTimeEdit/qdatetimeedit_wrap.h" #include "QtWidgets/QDial/qdial_wrap.h" #include "QtWidgets/QDialog/qdialog_wrap.h" +#include "QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.h" #include "QtWidgets/QFileDialog/qfiledialog_wrap.h" #include "QtWidgets/QFrame/qframe_wrap.h" #include "QtWidgets/QGridLayout/qgridlayout_wrap.h" @@ -112,6 +113,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) { QCalendarWidgetWrap::init(env, exports); QColorDialogWrap::init(env, exports); QComboBoxWrap::init(env, exports); + QDoubleSpinBoxWrap::init(env, exports); QBoxLayoutWrap::init(env, exports); QDateEditWrap::init(env, exports); QDateTimeEditWrap::init(env, exports); diff --git a/src/index.ts b/src/index.ts index 21ec9d36a..57f939390 100644 --- a/src/index.ts +++ b/src/index.ts @@ -41,6 +41,7 @@ export { QDateEdit } from './lib/QtWidgets/QDateEdit'; export { QDateTimeEdit, NodeDateTimeEdit, QDateTimeEditSignals } from './lib/QtWidgets/QDateTimeEdit'; export { QLabel, QLabelSignals } from './lib/QtWidgets/QLabel'; export { QDial, QDialSignals } from './lib/QtWidgets/QDial'; +export { QDoubleSpinBox, QDoubleSpinBoxSignals } from './lib/QtWidgets/QDoubleSpinBox'; export { QFileDialog, QFileDialogSignals } from './lib/QtWidgets/QFileDialog'; export { QFrame, QFrameSignals, Shadow, Shape } from './lib/QtWidgets/QFrame'; export { QLineEdit, QLineEditSignals, EchoMode } from './lib/QtWidgets/QLineEdit'; diff --git a/src/lib/QtWidgets/QDoubleSpinBox.ts b/src/lib/QtWidgets/QDoubleSpinBox.ts new file mode 100644 index 000000000..38d08e5a2 --- /dev/null +++ b/src/lib/QtWidgets/QDoubleSpinBox.ts @@ -0,0 +1,101 @@ +import addon from '../utils/addon'; +import { NodeWidget } from './QWidget'; +import { NativeElement } from '../core/Component'; +import { QAbstractSpinBox, QAbstractSpinBoxSignals, StepType } from './QAbstractSpinBox'; + +/** + +> Create and control double spin box widgets. + +* **This class is a JS wrapper around Qt's [QDoubleSpinBox class](https://doc.qt.io/qt-5/qdoublespinbox.html)** + +A `QDoubleSpinBox` provides ability to add and manipulate native double spin box widgets. + +### Example + +```javascript +const { QDoubleSpinBox } = require("@nodegui/nodegui"); + +const doublespinBox = new QDoubleSpinBox(); +``` + */ +export class QDoubleSpinBox extends QAbstractSpinBox { + native: NativeElement; + constructor(); + constructor(parent: NodeWidget); + constructor(parent?: NodeWidget) { + let native; + if (parent) { + native = new addon.QDoubleSpinBox(parent.native); + } else { + native = new addon.QDoubleSpinBox(); + } + super(native); + this.native = native; + parent && this.setNodeParent(parent); + } + cleanText(): string { + return this.property('cleanText').toString(); + } + setDecimals(prec: number): void { + this.setProperty('decimals', prec); + } + decimals(): number { + return this.property('decimals').toInt(); + } + setMaximum(max: number): void { + this.setProperty('maximum', max); + } + maximum(): number { + return this.property('maximum').toDouble(); + } + setMinimum(min: number): void { + this.setProperty('minimum', min); + } + minimum(): number { + return this.property('minimum').toDouble(); + } + setPrefix(prefix: string): void { + this.setProperty('prefix', prefix); + } + prefix(): string { + return this.property('prefix').toString(); + } + setSingleStep(val: number): void { + this.setProperty('singleStep', val); + } + singleStep(): number { + return this.property('singleStep').toDouble(); + } + setStepType(stepType: StepType): void { + this.setProperty('stepType', stepType); + } + stepType(): StepType { + return this.property('stepType').toInt(); + } + setSuffix(suffix: string): void { + this.setProperty('suffix', suffix); + } + suffix(): string { + return this.property('suffix').toString(); + } + setValue(val: number): void { + this.setProperty('value', val); + } + value(): number { + return this.property('value').toDouble(); + } + setRange(minimum: number, maximum: number): void { + this.native.setRange(minimum, maximum); + } + textFromValue(value: number): string { + return this.native.textFromValue(value); + } + valueFromText(text: string): number { + return this.native.valueFromText(text); + } +} + +export interface QDoubleSpinBoxSignals extends QAbstractSpinBoxSignals { + valueChanged: (value: number) => void; +}