diff --git a/config/application.gypi b/config/application.gypi index b3a835dab..69cb3c80b 100644 --- a/config/application.gypi +++ b/config/application.gypi @@ -11,6 +11,7 @@ "../src/cpp/core/YogaWidget/yogawidget.cpp", # wrapped cpps. Move non wrapped ones to shared gypi "../src/cpp/QtGui/QApplication/qapplication_wrap.cpp", + "../src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp", "../src/cpp/QtGui/QEvent/QKeyEvent/qkeyevent_wrap.cpp", "../src/cpp/QtGui/QPixmap/qpixmap_wrap.cpp", "../src/cpp/QtGui/QIcon/qicon_wrap.cpp", diff --git a/src/cpp/QtGui/QApplication/qapplication_wrap.cpp b/src/cpp/QtGui/QApplication/qapplication_wrap.cpp index c4ad0d056..144226fd2 100644 --- a/src/cpp/QtGui/QApplication/qapplication_wrap.cpp +++ b/src/cpp/QtGui/QApplication/qapplication_wrap.cpp @@ -1,6 +1,7 @@ #include "qapplication_wrap.h" #include "src/cpp/core/Component/component_macro.h" #include "src/cpp/Extras/Utils/nutils.h" +#include "src/cpp/QtGui/QClipboard/qclipboard_wrap.h" Napi::FunctionReference QApplicationWrap::constructor; int QApplicationWrap::argc = 0; @@ -28,22 +29,24 @@ QApplicationWrap::QApplicationWrap(const Napi::CallbackInfo& info) Napi::Env env = info.Env(); Napi::HandleScope scope(env); if(info.Length() == 1) { - this->instance = std::unique_ptr(info[0].As>().Data()); + this->instance = info[0].As>().Data(); } else if (info.Length() == 0){ - this->instance = std::make_unique(this->argc, this->argv); + this->instance = new QApplication(this->argc, this->argv); + this->_wasManuallyCreated = true; } else { Napi::TypeError::New(env, "Wrong number of arguments").ThrowAsJavaScriptException(); } } - QApplicationWrap::~QApplicationWrap() { - this->instance.reset(); + if(this->_wasManuallyCreated){ + delete this->instance; + } } QApplication* QApplicationWrap::getInternalInstance() { - return this->instance.get(); + return this->instance; } Napi::Value QApplicationWrap::processEvents(const Napi::CallbackInfo& info) @@ -87,3 +90,11 @@ Napi::Value StaticQApplicationWrapMethods::instance(const Napi::CallbackInfo& in Napi::Object instance = QApplicationWrap::constructor.New({ Napi::External::New(env, app) }); return instance; } + +Napi::Value StaticQApplicationWrapMethods::clipboard(const Napi::CallbackInfo& info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + QClipboard* clipboard = QApplication::clipboard(); + return QClipboardWrap::constructor.New({ Napi::External::New(env, clipboard) }); +} diff --git a/src/cpp/QtGui/QApplication/qapplication_wrap.h b/src/cpp/QtGui/QApplication/qapplication_wrap.h index 114172fca..a5850f007 100644 --- a/src/cpp/QtGui/QApplication/qapplication_wrap.h +++ b/src/cpp/QtGui/QApplication/qapplication_wrap.h @@ -1,15 +1,15 @@ #pragma once #include -#include #include class QApplicationWrap : public Napi::ObjectWrap { private: - std::unique_ptr instance; + QApplication* instance; static int argc; static char** argv; + bool _wasManuallyCreated = false; public: static Napi::FunctionReference constructor; @@ -26,4 +26,5 @@ public: namespace StaticQApplicationWrapMethods { Napi::Value instance(const Napi::CallbackInfo& info); + Napi::Value clipboard(const Napi::CallbackInfo& info); } \ No newline at end of file diff --git a/src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp b/src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp new file mode 100644 index 000000000..48d56e993 --- /dev/null +++ b/src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp @@ -0,0 +1,63 @@ +#include "qclipboard_wrap.h" +#include "src/cpp/Extras/Utils/nutils.h" +#include "deps/spdlog/spdlog.h" + +Napi::FunctionReference QClipboardWrap::constructor; + +Napi::Object QClipboardWrap::init(Napi::Env env, Napi::Object exports) +{ + Napi::HandleScope scope(env); + char CLASSNAME[] = "QClipboard"; + Napi::Function func = DefineClass(env, CLASSNAME, { + InstanceMethod("clear", &QClipboardWrap::clear), + InstanceMethod("setText", &QClipboardWrap::setText), + InstanceMethod("text", &QClipboardWrap::text), + COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE + }); + constructor = Napi::Persistent(func); + exports.Set(CLASSNAME, func); + return exports; +} + +QClipboardWrap::QClipboardWrap(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) +{ + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + if (info[0].IsExternal()) { + this->instance = info[0].As>().Data(); + } + else { + Napi::TypeError::New(env, "Incorrect initialization of QClipboardWrap").ThrowAsJavaScriptException(); + } +} + +QClipboard *QClipboardWrap::getInternalInstance() +{ + return this->instance; +} + +Napi::Value QClipboardWrap::clear(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::Number mode = info[0].As(); + this->instance->clear(static_cast(mode.Int32Value())); + return env.Null(); +} + +Napi::Value QClipboardWrap::setText(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::String text = info[0].As(); + Napi::Number mode = info[1].As(); + QString clipboardText = text.Utf8Value().c_str(); + this->instance->setText(clipboardText, static_cast(mode.Int32Value())); + return env.Null(); +} + +Napi::Value QClipboardWrap::text(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + Napi::Number mode = info[0].As(); + QString text = this->instance->text(static_cast(mode.Int32Value())); + return Napi::Value::From(env, text.toStdString()); +} \ No newline at end of file diff --git a/src/cpp/QtGui/QClipboard/qclipboard_wrap.h b/src/cpp/QtGui/QClipboard/qclipboard_wrap.h new file mode 100644 index 000000000..386a0e98d --- /dev/null +++ b/src/cpp/QtGui/QClipboard/qclipboard_wrap.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include "src/cpp/core/Component/component_macro.h" + +class QClipboardWrap : public Napi::ObjectWrap +{ +private: + QClipboard* instance; +public: + static Napi::FunctionReference constructor; + static Napi::Object init(Napi::Env env, Napi::Object exports); + QClipboardWrap(const Napi::CallbackInfo &info); + QClipboard *getInternalInstance(); + // Wrapped methods + Napi::Value clear(const Napi::CallbackInfo& info); + Napi::Value setText(const Napi::CallbackInfo& info); + Napi::Value text(const Napi::CallbackInfo& info); +}; diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 3ff51c7e5..815ca704b 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -1,4 +1,5 @@ #include "src/cpp/QtGui/QApplication/qapplication_wrap.h" +#include "src/cpp/QtGui/QClipboard/qclipboard_wrap.h" #include "src/cpp/QtWidgets/QWidget/qwidget_wrap.h" #include "src/cpp/QtGui/QPixmap/qpixmap_wrap.h" #include "src/cpp/QtGui/QIcon/qicon_wrap.h" @@ -27,6 +28,7 @@ void InitPrivateHelpers(Napi::Env env){ Napi::Object Main(Napi::Env env, Napi::Object exports) { InitPrivateHelpers(env); QApplicationWrap::init(env, exports); + QClipboardWrap::init(env, exports); QWidgetWrap::init(env, exports); QPixmapWrap::init(env, exports); QIconWrap::init(env, exports); diff --git a/src/index.ts b/src/index.ts index 5c88e1df6..dd09a5ec8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ export { QPixmap } from "./lib/QtGui/QPixmap"; export { QIcon } from "./lib/QtGui/QIcon"; export { QCursor } from "./lib/QtGui/QCursor"; export { QTextOptionEnums } from "./lib/QtGui/QTextOption"; +export { QClipboard, QClipboardMode } from "./lib/QtGui/QClipboard"; // Events: Maybe a separate module ? export { QKeyEvent } from "./lib/QtGui/QEvent/QKeyEvent"; export { NativeEvent } from "./lib/core/EventWidget"; diff --git a/src/lib/QtGui/QApplication/index.ts b/src/lib/QtGui/QApplication/index.ts index 67ed6a616..cca01ed5c 100644 --- a/src/lib/QtGui/QApplication/index.ts +++ b/src/lib/QtGui/QApplication/index.ts @@ -1,6 +1,7 @@ import addon from "../../core/addon"; import { Component, NativeElement } from "../../core/Component"; import { checkIfNativeElement } from "../../utils"; +import { QClipboard } from "../QClipboard"; type arg = NativeElement; export class QApplication extends Component { @@ -13,6 +14,9 @@ export class QApplication extends Component { this.native = new addon.QApplication(); } } + static clipboard = (): QClipboard => { + return new QClipboard(addon.QApplication.clipboard()); + }; processEvents = () => { this.native.processEvents(); }; diff --git a/src/lib/QtGui/QClipboard/index.ts b/src/lib/QtGui/QClipboard/index.ts new file mode 100644 index 000000000..7e048d9cb --- /dev/null +++ b/src/lib/QtGui/QClipboard/index.ts @@ -0,0 +1,28 @@ +import { Component, NativeElement } from "../../core/Component"; +import { checkIfNativeElement } from "../../utils"; + +export class QClipboard extends Component { + native: NativeElement; + constructor(native: NativeElement) { + super(); + if (checkIfNativeElement(native)) { + this.native = native; + } else { + throw new Error( + "QClipboard cannot be initialised this way. Use QApplication::clipboard()" + ); + } + } + clear = (mode: QClipboardMode) => { + this.native.clear(mode); + }; + setText = (text: string, mode: QClipboardMode) => { + this.native.setText(text, mode); + }; +} + +export enum QClipboardMode { + Clipboard, + Selection, + FindBuffer +}