diff --git a/src/cpp/include/nodegui/QtGui/QIcon/qicon_wrap.h b/src/cpp/include/nodegui/QtGui/QIcon/qicon_wrap.h index 839a970d6..d7339d43a 100644 --- a/src/cpp/include/nodegui/QtGui/QIcon/qicon_wrap.h +++ b/src/cpp/include/nodegui/QtGui/QIcon/qicon_wrap.h @@ -20,10 +20,18 @@ class DLL_EXPORT QIconWrap : public Napi::ObjectWrap { ~QIconWrap(); QIcon* getInternalInstance(); // Wrapped methods + Napi::Value actualSize(const Napi::CallbackInfo& info); + Napi::Value addFile(const Napi::CallbackInfo& info); + Napi::Value addPixmap(const Napi::CallbackInfo& info); + Napi::Value availableSizes(const Napi::CallbackInfo& info); Napi::Value pixmap(const Napi::CallbackInfo& info); Napi::Value isMask(const Napi::CallbackInfo& info); + Napi::Value isNull(const Napi::CallbackInfo& info); + Napi::Value name(const Napi::CallbackInfo& info); + Napi::Value paint(const Napi::CallbackInfo& info); Napi::Value setIsMask(const Napi::CallbackInfo& info); Napi::Value cacheKey(const Napi::CallbackInfo& info); + Napi::Value swap(const Napi::CallbackInfo& info); }; namespace StaticQIconWrapMethods { diff --git a/src/cpp/lib/QtGui/QIcon/qicon_wrap.cpp b/src/cpp/lib/QtGui/QIcon/qicon_wrap.cpp index 70ab26362..e668a1320 100644 --- a/src/cpp/lib/QtGui/QIcon/qicon_wrap.cpp +++ b/src/cpp/lib/QtGui/QIcon/qicon_wrap.cpp @@ -1,8 +1,10 @@ #include "QtGui/QIcon/qicon_wrap.h" #include "Extras/Utils/nutils.h" +#include "QtCore/QSize/qsize_wrap.h" #include "QtCore/QVariant/qvariant_wrap.h" #include "QtGui/QPixmap/qpixmap_wrap.h" +#include "QtWidgets/QPainter/qpainter_wrap.h" Napi::FunctionReference QIconWrap::constructor; @@ -11,9 +13,18 @@ Napi::Object QIconWrap::init(Napi::Env env, Napi::Object exports) { char CLASSNAME[] = "QIcon"; Napi::Function func = DefineClass( env, CLASSNAME, - {InstanceMethod("pixmap", &QIconWrap::pixmap), + { + InstanceMethod("actualSize", &QIconWrap::actualSize), + InstanceMethod("addFile", &QIconWrap::addFile), + InstanceMethod("addPixmap", &QIconWrap::addPixmap), + InstanceMethod("availableSizes", &QIconWrap::availableSizes), + InstanceMethod("pixmap", &QIconWrap::pixmap), InstanceMethod("isMask", &QIconWrap::isMask), + InstanceMethod("isNull", &QIconWrap::isNull), + InstanceMethod("name", &QIconWrap::name), + InstanceMethod("paint", &QIconWrap::paint), InstanceMethod("setIsMask", &QIconWrap::setIsMask), + InstanceMethod("swap", &QIconWrap::swap), InstanceMethod("cacheKey", &QIconWrap::cacheKey), StaticMethod("fromQVariant", &StaticQIconWrapMethods::fromQVariant), COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE(QIconWrap)}); @@ -30,9 +41,15 @@ QIconWrap::QIconWrap(const Napi::CallbackInfo& info) this->instance = std::unique_ptr(info[0].As>().Data()); } else { - Napi::String url = info[0].As(); - QString imageUrl = QString::fromUtf8(url.Utf8Value().c_str()); - this->instance = std::make_unique(imageUrl); + if (info[0].IsString()) { + Napi::String url = info[0].As(); + QString imageUrl = QString::fromUtf8(url.Utf8Value().c_str()); + this->instance = std::make_unique(imageUrl); + } else { + QPixmapWrap* pixmapWrap = Napi::ObjectWrap::Unwrap(info[0].As()); + QPixmap* pixmap = pixmapWrap->getInternalInstance(); + this->instance = std::make_unique(*pixmap); + } } } else if (info.Length() == 0) { this->instance = std::make_unique(); @@ -47,6 +64,53 @@ QIconWrap::~QIconWrap() { this->instance.reset(); } QIcon* QIconWrap::getInternalInstance() { return this->instance.get(); } +Napi::Value QIconWrap::actualSize(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + QSizeWrap* sizeWrap = Napi::ObjectWrap::Unwrap(info[0].As()); + QSize* size = sizeWrap->getInternalInstance(); + QIcon::Mode mode = static_cast(info[1].As().Int32Value()); + QIcon::State state = static_cast(info[2].As().Int32Value()); + QSize result = this->instance->actualSize(*size, mode, state); + auto resultInstance = QSizeWrap::constructor.New( + {Napi::External::New(env, new QSize(result))}); + return resultInstance; +} + +Napi::Value QIconWrap::addFile(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + std::string fileNameNapiText = info[0].As().Utf8Value(); + QString fileName = QString::fromUtf8(fileNameNapiText.c_str()); + QSizeWrap* sizeWrap = Napi::ObjectWrap::Unwrap(info[1].As()); + QSize* size = sizeWrap->getInternalInstance(); + QIcon::Mode mode = static_cast(info[2].As().Int32Value()); + QIcon::State state = static_cast(info[3].As().Int32Value()); + this->instance->addFile(fileName, *size, mode, state); + return env.Null(); +} + +Napi::Value QIconWrap::addPixmap(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + QPixmapWrap* pixmapWrap = Napi::ObjectWrap::Unwrap(info[0].As()); + QPixmap* pixmap = pixmapWrap->getInternalInstance(); + QIcon::Mode mode = static_cast(info[1].As().Int32Value()); + QIcon::State state = static_cast(info[2].As().Int32Value()); + this->instance->addPixmap(*pixmap, mode, state); + return env.Null(); +} + +Napi::Value QIconWrap::availableSizes(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + QIcon::Mode mode = static_cast(info[0].As().Int32Value()); + QIcon::State state = static_cast(info[1].As().Int32Value()); + QList result = this->instance->availableSizes(mode, state); + Napi::Array resultArrayNapi = Napi::Array::New(env, result.size()); + for (int i = 0; i < result.size(); i++) { + resultArrayNapi[i] = QSizeWrap::constructor.New( + {Napi::External::New(env, new QSize(result[i]))}); + } + return resultArrayNapi; +} + Napi::Value QIconWrap::pixmap(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); Napi::Number widthValue = info[0].As(); @@ -73,6 +137,33 @@ Napi::Value QIconWrap::pixmap(const Napi::CallbackInfo& info) { return instance; } +Napi::Value QIconWrap::isNull(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + bool result = this->instance->isNull(); + return Napi::Boolean::New(env, result); +} + +Napi::Value QIconWrap::name(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + QString result = this->instance->name(); + return Napi::String::New(env, result.toStdString()); +} + +Napi::Value QIconWrap::paint(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + QPainterWrap* painterWrap = Napi::ObjectWrap::Unwrap(info[0].As()); + QPainter* painter = painterWrap->getInternalInstance(); + int x = info[1].As().Int32Value(); + int y = info[2].As().Int32Value(); + int w = info[3].As().Int32Value(); + int h = info[4].As().Int32Value(); + Qt::Alignment alignment = static_cast(info[5].As().Int32Value()); + QIcon::Mode mode = static_cast(info[6].As().Int32Value()); + QIcon::State state = static_cast(info[7].As().Int32Value()); + this->instance->paint(painter, x, y, w, h, alignment, mode, state); + return env.Null(); +} + Napi::Value QIconWrap::isMask(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); return Napi::Boolean::New(env, this->instance->isMask()); @@ -95,6 +186,14 @@ Napi::Value QIconWrap::cacheKey(const Napi::CallbackInfo& info) { return Napi::Value::From(env, this->instance->cacheKey()); } +Napi::Value QIconWrap::swap(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + QIconWrap* qiconWrap = Napi::ObjectWrap::Unwrap(info[0].As()); + QIcon* other = qiconWrap->getInternalInstance(); + this->instance->swap(*other); + return env.Null(); +} + Napi::Value StaticQIconWrapMethods::fromQVariant( const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); @@ -107,3 +206,4 @@ Napi::Value StaticQIconWrapMethods::fromQVariant( {Napi::External::New(env, new QIcon(icon))}); return instance; } + diff --git a/src/lib/QtGui/QIcon.ts b/src/lib/QtGui/QIcon.ts index bc074f0bb..c9d9b68ba 100644 --- a/src/lib/QtGui/QIcon.ts +++ b/src/lib/QtGui/QIcon.ts @@ -3,9 +3,12 @@ import { Component, NativeElement } from '../core/Component'; import { QPixmap } from './QPixmap'; import { QVariant } from '../QtCore/QVariant'; import { checkIfNativeElement } from '../utils/helpers'; +import { QSize } from '../QtCore/QSize'; +import { AlignmentFlag } from '../QtEnums/AlignmentFlag'; +import { QPainter } from '../QtWidgets/QPainter'; /** - + > The QIcon class provides scalable icons in different modes and states. * **This class is a JS wrapper around Qt's [QIcon class](https://doc.qt.io/qt-5/qicon.html)** @@ -23,11 +26,14 @@ export class QIcon extends Component { constructor(); constructor(native: NativeElement); constructor(filePath: string); - constructor(arg?: string | NativeElement) { + constructor(pixmap: QPixmap); + constructor(arg?: string | NativeElement | QPixmap) { let native: NativeElement; if (typeof arg === 'string') { const imagePath = arg; native = new addon.QIcon(imagePath); + } else if (arg instanceof QPixmap) { + native = new addon.QIcon(arg.native); } else if (checkIfNativeElement(arg)) { native = arg as NativeElement; } else { @@ -35,26 +41,61 @@ export class QIcon extends Component { } super(native); } - pixmap(width: number, height: number, mode?: QIconMode, state?: QIconState): QPixmap { - let nativePixmap; - if (mode && state) { - nativePixmap = this.native.pixmap(width, height, mode, state); - } else if (mode) { - nativePixmap = this.native.pixmap(width, height, mode); - } else { - nativePixmap = this.native.pixmap(width, height); - } - return new QPixmap(nativePixmap); + + // *** Public Functions *** + actualSize(size: QSize = null, mode = QIconMode.Normal, state = QIconState.Off): QSize { + return new QSize(this.native.actualSize(size ?? new QSize(), mode, state)); } - isMask(): boolean { - return this.native.isMask(); + // TODO: QSize actualSize(QWindow *window, const QSize &size, QIcon::Mode mode = Normal, QIcon::State state = Off) const + addFile(fileName: string, size: QSize = null, mode = QIconMode.Normal, state = QIconState.Off): void { + this.native.addFile(fileName, (size ?? new QSize()).native, mode, state); } - setIsMask(isMask: boolean): void { - this.native.setIsMask(isMask); + addPixmap(pixmap: QPixmap, mode = QIconMode.Normal, state = QIconState.Off): void { + this.native.addPixmap(pixmap.native, mode, state); + } + availableSizes(mode = QIconMode.Normal, state = QIconState.Off): QSize[] { + const methodResult = this.native.availableSizes(mode, state); + return methodResult.map((item: any) => new QSize(item)); } cacheKey(): number { return this.native.cacheKey(); } + isMask(): boolean { + return this.native.isMask(); + } + isNull(): boolean { + return this.native.isNull(); + } + name(): string { + return this.native.name(); + } + // TODO: void paint(QPainter *painter, const QRect &rect, Qt::Alignment alignment = Qt::AlignCenter, QIcon::Mode mode = Normal, QIcon::State state = Off) const + paint( + painter: QPainter, + x: number, + y: number, + w: number, + h: number, + alignment = AlignmentFlag.AlignCenter, + mode = QIconMode.Normal, + state = QIconState.Off, + ): void { + this.native.paint(painter.native, x, y, w, h, alignment, mode, state); + } + // TODO: QPixmap pixmap(const QSize &size, QIcon::Mode mode = Normal, QIcon::State state = Off) const + pixmap(width: number, height: number, mode = QIconMode.Normal, state = QIconState.Off): QPixmap { + const nativePixmap = this.native.pixmap(width, height, mode, state); + return new QPixmap(nativePixmap); + } + // TODO: QPixmap pixmap(int extent, QIcon::Mode mode = Normal, QIcon::State state = Off) const + // TODO: QPixmap pixmap(QWindow *window, const QSize &size, QIcon::Mode mode = Normal, QIcon::State state = Off) const + setIsMask(isMask: boolean): void { + this.native.setIsMask(isMask); + } + swap(other: QIcon): void { + this.native.swap(other.native); + } + // TODO: QVariant operator QVariant() const static fromQVariant(variant: QVariant): QIcon { return new QIcon(addon.QIcon.fromQVariant(variant.native)); }