From 2b26ea4ddd790041ef63375c7d7fe6ad154c45ed Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Sat, 26 Jun 2021 18:37:53 +0200 Subject: [PATCH] Extra font and painter related methods and classes (#845) * Add `QPaintEvent` * Add `setStyleName()` to `QFont` * Add `isFixedPitch()` and `styles()` to `QFontDatabase` * Add `drawImage()` to `QPainter` * Add `setFocusPolicy()` to `QWidget` --- CMakeLists.txt | 1 + .../QEvent/QPaintEvent/qpaintevent_wrap.h | 25 ++++++++++ .../include/nodegui/QtGui/QFont/qfont_wrap.h | 1 + .../QtGui/QFontDatabase/qfontdatabase_wrap.h | 2 + .../QtWidgets/QPainter/qpainter_wrap.h | 1 + .../QEvent/QPaintEvent/qpaintevent_wrap.cpp | 49 +++++++++++++++++++ src/cpp/lib/QtGui/QFont/qfont_wrap.cpp | 9 ++++ .../QFontDatabase/qfontdatabase_wrap.cpp | 32 ++++++++++++ .../lib/QtWidgets/QPainter/qpainter_wrap.cpp | 22 +++++++++ src/cpp/main.cpp | 2 + src/index.ts | 1 + src/lib/QtGui/QEvent/QPaintEvent.ts | 13 +++++ src/lib/QtGui/QFont.ts | 3 ++ src/lib/QtGui/QFontDatabase.ts | 6 +++ src/lib/QtWidgets/QPainter.ts | 4 +- src/lib/QtWidgets/QWidget.ts | 5 +- 16 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 src/cpp/include/nodegui/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.h create mode 100644 src/cpp/lib/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.cpp create mode 100644 src/lib/QtGui/QEvent/QPaintEvent.ts diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d1df9e05..246316397 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QMouseEvent/qmouseevent_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QWheelEvent/qwheelevent_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QNativeGestureEvent/qnativegestureevent_wrap.cpp" + "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QTabletEvent/qtabletevent_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QDropEvent/qdropevent_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QDragMoveEvent/qdragmoveevent_wrap.cpp" diff --git a/src/cpp/include/nodegui/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.h b/src/cpp/include/nodegui/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.h new file mode 100644 index 000000000..325ac8a17 --- /dev/null +++ b/src/cpp/include/nodegui/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include + +#include "Extras/Export/export.h" +#include "core/Component/component_macro.h" + +class DLL_EXPORT QPaintEventWrap : public Napi::ObjectWrap { + COMPONENT_WRAPPED_METHODS_DECLARATION + + private: + QPaintEvent* instance; + + public: + static Napi::Object init(Napi::Env env, Napi::Object exports); + QPaintEventWrap(const Napi::CallbackInfo& info); + ~QPaintEventWrap(); + QPaintEvent* getInternalInstance(); + // class constructor + static Napi::FunctionReference constructor; + // wrapped methods + Napi::Value rect(const Napi::CallbackInfo& info); +}; diff --git a/src/cpp/include/nodegui/QtGui/QFont/qfont_wrap.h b/src/cpp/include/nodegui/QtGui/QFont/qfont_wrap.h index 3c719cb4e..c8e511204 100644 --- a/src/cpp/include/nodegui/QtGui/QFont/qfont_wrap.h +++ b/src/cpp/include/nodegui/QtGui/QFont/qfont_wrap.h @@ -32,6 +32,7 @@ class DLL_EXPORT QFontWrap : public Napi::ObjectWrap { Napi::Value weight(const Napi::CallbackInfo& info); Napi::Value setItalic(const Napi::CallbackInfo& info); Napi::Value italic(const Napi::CallbackInfo& info); + Napi::Value setStyleName(const Napi::CallbackInfo& info); Napi::Value toString(const Napi::CallbackInfo& info); COMPONENT_WRAPPED_METHODS_DECLARATION }; diff --git a/src/cpp/include/nodegui/QtGui/QFontDatabase/qfontdatabase_wrap.h b/src/cpp/include/nodegui/QtGui/QFontDatabase/qfontdatabase_wrap.h index 81e4e6d1b..f0367cfd6 100644 --- a/src/cpp/include/nodegui/QtGui/QFontDatabase/qfontdatabase_wrap.h +++ b/src/cpp/include/nodegui/QtGui/QFontDatabase/qfontdatabase_wrap.h @@ -22,7 +22,9 @@ class DLL_EXPORT QFontDatabaseWrap // Wrapped methods Napi::Value bold(const Napi::CallbackInfo& info); Napi::Value families(const Napi::CallbackInfo& info); + Napi::Value isFixedPitch(const Napi::CallbackInfo& info); Napi::Value italic(const Napi::CallbackInfo& info); + Napi::Value styles(const Napi::CallbackInfo& info); Napi::Value weight(const Napi::CallbackInfo& info); }; diff --git a/src/cpp/include/nodegui/QtWidgets/QPainter/qpainter_wrap.h b/src/cpp/include/nodegui/QtWidgets/QPainter/qpainter_wrap.h index beeb5c4bf..a50893550 100644 --- a/src/cpp/include/nodegui/QtWidgets/QPainter/qpainter_wrap.h +++ b/src/cpp/include/nodegui/QtWidgets/QPainter/qpainter_wrap.h @@ -22,6 +22,7 @@ class DLL_EXPORT QPainterWrap : public Napi::ObjectWrap { // wrapped methods Napi::Value drawArc(const Napi::CallbackInfo& info); Napi::Value drawText(const Napi::CallbackInfo& info); + Napi::Value drawImage(const Napi::CallbackInfo& info); Napi::Value drawPath(const Napi::CallbackInfo& info); Napi::Value strokePath(const Napi::CallbackInfo& info); Napi::Value begin(const Napi::CallbackInfo& info); diff --git a/src/cpp/lib/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.cpp b/src/cpp/lib/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.cpp new file mode 100644 index 000000000..c13e81869 --- /dev/null +++ b/src/cpp/lib/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.cpp @@ -0,0 +1,49 @@ +#include "QtGui/QEvent/QPaintEvent/qpaintevent_wrap.h" + +#include + +#include "Extras/Utils/nutils.h" +#include "QtCore/QRect/qrect_wrap.h" + +Napi::FunctionReference QPaintEventWrap::constructor; + +Napi::Object QPaintEventWrap::init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + char CLASSNAME[] = "QPaintEvent"; + Napi::Function func = + DefineClass(env, CLASSNAME, + {InstanceMethod("rect", &QPaintEventWrap::rect), + COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE(QPaintEventWrap)}); + constructor = Napi::Persistent(func); + exports.Set(CLASSNAME, func); + return exports; +} + +QPaintEvent* QPaintEventWrap::getInternalInstance() { return this->instance; } + +QPaintEventWrap::QPaintEventWrap(const Napi::CallbackInfo& info) + : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + if (info.Length() == 1) { + Napi::External eventObject = + info[0].As>(); + this->instance = static_cast(eventObject.Data()); + } else { + Napi::TypeError::New(env, "Wrong number of arguments") + .ThrowAsJavaScriptException(); + } + this->rawData = extrautils::configureComponent(this->getInternalInstance()); +} + +QPaintEventWrap::~QPaintEventWrap() { + // Do not destroy instance here. It will be done by Qt Event loop. +} + +Napi::Value QPaintEventWrap::rect(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + QRect ret = this->instance->rect(); + auto instance = QRectWrap::constructor.New( + {Napi::External::New(env, new QRect(ret))}); + return instance; +} diff --git a/src/cpp/lib/QtGui/QFont/qfont_wrap.cpp b/src/cpp/lib/QtGui/QFont/qfont_wrap.cpp index d1b95de71..db7264621 100644 --- a/src/cpp/lib/QtGui/QFont/qfont_wrap.cpp +++ b/src/cpp/lib/QtGui/QFont/qfont_wrap.cpp @@ -25,6 +25,7 @@ Napi::Object QFontWrap::init(Napi::Env env, Napi::Object exports) { InstanceMethod("weight", &QFontWrap::weight), InstanceMethod("setItalic", &QFontWrap::setItalic), InstanceMethod("italic", &QFontWrap::italic), + InstanceMethod("setStyleName", &QFontWrap::setStyleName), InstanceMethod("toString", &QFontWrap::toString), StaticMethod("fromQVariant", &StaticQFontWrapMethods::fromQVariant), COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE(QFontWrap)}); @@ -163,6 +164,14 @@ Napi::Value QFontWrap::italic(const Napi::CallbackInfo& info) { return Napi::Value::From(env, this->instance->italic()); } +Napi::Value QFontWrap::setStyleName(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + std::string styleName = info[0].As().Utf8Value(); + this->instance->setStyleName(QString::fromStdString(styleName.c_str())); + return env.Null(); +} + Napi::Value QFontWrap::toString(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); Napi::HandleScope scope(env); diff --git a/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp b/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp index 139fe90eb..0dc07d22e 100644 --- a/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp +++ b/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp @@ -10,7 +10,9 @@ Napi::Object QFontDatabaseWrap::init(Napi::Env env, Napi::Object exports) { Napi::Function func = DefineClass( env, CLASSNAME, {InstanceMethod("bold", &QFontDatabaseWrap::bold), + InstanceMethod("isFixedPitch", &QFontDatabaseWrap::isFixedPitch), InstanceMethod("italic", &QFontDatabaseWrap::italic), + InstanceMethod("styles", &QFontDatabaseWrap::styles), InstanceMethod("weight", &QFontDatabaseWrap::weight), InstanceMethod("families", &QFontDatabaseWrap::families), StaticMethod("addApplicationFont", @@ -61,6 +63,23 @@ Napi::Value QFontDatabaseWrap::bold(const Napi::CallbackInfo& info) { return Napi::Value::From(env, result); } +Napi::Value QFontDatabaseWrap::isFixedPitch(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + std::string family = info[0].As().Utf8Value(); + + QString qstyle; + if (!info[1].IsNull()) { + std::string style = info[1].As().Utf8Value(); + qstyle = QString::fromUtf8(style.c_str()); + } + + bool result = + this->instance->isFixedPitch(QString::fromUtf8(family.c_str()), qstyle); + return Napi::Value::From(env, result); +} + Napi::Value QFontDatabaseWrap::italic(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); Napi::HandleScope scope(env); @@ -71,6 +90,19 @@ Napi::Value QFontDatabaseWrap::italic(const Napi::CallbackInfo& info) { return Napi::Value::From(env, result); } +Napi::Value QFontDatabaseWrap::styles(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + std::string family = info[0].As().Utf8Value(); + QStringList styles = + this->instance->styles(QString::fromUtf8(family.c_str())); + Napi::Array stylesNapi = Napi::Array::New(env, styles.size()); + for (int i = 0; i < styles.size(); i++) { + stylesNapi[i] = Napi::String::New(env, styles[i].toStdString()); + } + return stylesNapi; +} + Napi::Value QFontDatabaseWrap::weight(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); Napi::HandleScope scope(env); diff --git a/src/cpp/lib/QtWidgets/QPainter/qpainter_wrap.cpp b/src/cpp/lib/QtWidgets/QPainter/qpainter_wrap.cpp index 012c3e2f1..a3c1f0891 100644 --- a/src/cpp/lib/QtWidgets/QPainter/qpainter_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QPainter/qpainter_wrap.cpp @@ -22,6 +22,7 @@ Napi::Object QPainterWrap::init(Napi::Env env, Napi::Object exports) { InstanceMethod("drawPath", &QPainterWrap::drawPath), InstanceMethod("drawPie", &QPainterWrap::drawPie), InstanceMethod("drawEllipse", &QPainterWrap::drawEllipse), + InstanceMethod("drawImage", &QPainterWrap::drawImage), InstanceMethod("strokePath", &QPainterWrap::strokePath), InstanceMethod("begin", &QPainterWrap::begin), InstanceMethod("end", &QPainterWrap::end), @@ -196,6 +197,27 @@ Napi::Value QPainterWrap::drawEllipse(const Napi::CallbackInfo& info) { return env.Null(); } + +Napi::Value QPainterWrap::drawImage(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(); + + Napi::Object imageObject = info[2].As(); + QImageWrap* imageWrap = Napi::ObjectWrap::Unwrap(imageObject); + QImage* image = imageWrap->getInternalInstance(); + + int sx = info[3].As().Int32Value(); + int sy = info[4].As().Int32Value(); + int sw = info[5].As().Int32Value(); + int sh = info[6].As().Int32Value(); + this->instance->drawImage(x, y, *image, sx, sy, sw, sh); + + return env.Null(); +} + Napi::Value QPainterWrap::drawPie(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); Napi::HandleScope scope(env); diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 976333bae..1f746c856 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -27,6 +27,7 @@ #include "QtGui/QEvent/QKeyEvent/qkeyevent_wrap.h" #include "QtGui/QEvent/QMouseEvent/qmouseevent_wrap.h" #include "QtGui/QEvent/QNativeGestureEvent/qnativegestureevent_wrap.h" +#include "QtGui/QEvent/QPaintEvent/qpaintevent_wrap.h" #include "QtGui/QEvent/QTabletEvent/qtabletevent_wrap.h" #include "QtGui/QEvent/QWheelEvent/qwheelevent_wrap.h" #include "QtGui/QFont/qfont_wrap.h" @@ -216,6 +217,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) { QStandardItemWrap::init(env, exports); QSvgWidgetWrap::init(env, exports); QDesktopWidgetWrap::init(env, exports); + QPaintEventWrap::init(env, exports); return exports; } diff --git a/src/index.ts b/src/index.ts index a78efc30c..4e90b8a25 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,6 +29,7 @@ export { QDrag } from './lib/QtGui/QDrag'; export { QDropEvent } from './lib/QtGui/QEvent/QDropEvent'; export { QDragMoveEvent } from './lib/QtGui/QEvent/QDragMoveEvent'; export { QDragLeaveEvent } from './lib/QtGui/QEvent/QDragLeaveEvent'; +export { QPaintEvent } from './lib/QtGui/QEvent/QPaintEvent'; export { WidgetEventTypes } from './lib/core/EventWidget'; // Abstract: export { NodeWidget, QWidget, QWidgetSignals } from './lib/QtWidgets/QWidget'; diff --git a/src/lib/QtGui/QEvent/QPaintEvent.ts b/src/lib/QtGui/QEvent/QPaintEvent.ts new file mode 100644 index 000000000..1c22c057d --- /dev/null +++ b/src/lib/QtGui/QEvent/QPaintEvent.ts @@ -0,0 +1,13 @@ +import addon from '../../utils/addon'; +import { NativeElement, NativeRawPointer } from '../../core/Component'; +import { QRect } from '../../..'; + +export class QPaintEvent { + native: NativeElement; + constructor(event: NativeRawPointer<'QEvent'>) { + this.native = new addon.QPaintEvent(event); + } + rect(): QRect { + return this.native.rect(); + } +} diff --git a/src/lib/QtGui/QFont.ts b/src/lib/QtGui/QFont.ts index 54afaa6ce..cde625b43 100644 --- a/src/lib/QtGui/QFont.ts +++ b/src/lib/QtGui/QFont.ts @@ -63,6 +63,9 @@ export class QFont extends Component { italic(): boolean { return this.native.italic(); } + setStyleName(style: string): void { + this.native.setStyleName(style); + } toString(): string { return this.native.toString(); } diff --git a/src/lib/QtGui/QFontDatabase.ts b/src/lib/QtGui/QFontDatabase.ts index 31c7a4c87..6cbd572f0 100644 --- a/src/lib/QtGui/QFontDatabase.ts +++ b/src/lib/QtGui/QFontDatabase.ts @@ -51,9 +51,15 @@ export class QFontDatabase extends Component { bold(family: string, style: string): boolean { return this.native.bold(family, style); } + isFixedPitch(family: string, style: string | null = null): boolean { + return this.native.isFixedPitch(family, style); + } italic(family: string, style: string): boolean { return this.native.italic(family, style); } + styles(family: string): string[] { + return this.native.styles(family); + } weight(family: string, style: string): number { return this.native.weight(family, style); } diff --git a/src/lib/QtWidgets/QPainter.ts b/src/lib/QtWidgets/QPainter.ts index 2b902cdfa..3dc2cec93 100644 --- a/src/lib/QtWidgets/QPainter.ts +++ b/src/lib/QtWidgets/QPainter.ts @@ -61,7 +61,9 @@ export class QPainter extends Component { drawArc(x: number, y: number, width: number, height: number, startAngle: number, spanAngle: number): void { this.native.drawArc(x, y, width, height, startAngle, spanAngle); } - + drawImage(x: number, y: number, image: QImage, sx = 0, sy = 0, sw = -1, sh = -1): void { + this.native.drawImage(x, y, image.native, sx, sy, sw, sh); + } drawText(x: number, y: number, text: string): void { return this.native.drawText(x, y, text); } diff --git a/src/lib/QtWidgets/QWidget.ts b/src/lib/QtWidgets/QWidget.ts index 63793a1cc..3b385ac17 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, ContextMenuPolicy, FocusReason } from '../QtEnums'; +import { WidgetAttribute, WindowType, ContextMenuPolicy, FocusReason, FocusPolicy } from '../QtEnums'; import { QIcon } from '../QtGui/QIcon'; import { QCursor } from '../QtGui/QCursor'; import { CursorShape, WindowState } from '../QtEnums'; @@ -236,6 +236,9 @@ export abstract class NodeWidget extends YogaWid setContextMenuPolicy(contextMenuPolicy: ContextMenuPolicy): void { this.setProperty('contextMenuPolicy', contextMenuPolicy); } + setFocusPolicy(policy: FocusPolicy): void { + this.setProperty('focusPolicy', policy); + } showFullScreen(): void { this.native.showFullScreen(); }