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/docs/README.md b/docs/README.md index 25e6be324..664922125 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,6 +53,8 @@ - [FlexLayout](api/FlexLayout.md) - [QPixmap](api/QPixmap.md) - [QIcon](api/QIcon.md) +- [QCursor](api/QCursor.md) +- [QClipboard](api/QClipboard.md) - [Qt Enums](api/QtEnums.md) ### Internal Modules diff --git a/docs/api/QApplication.md b/docs/api/QApplication.md index 907325bf1..52cb53140 100644 --- a/docs/api/QApplication.md +++ b/docs/api/QApplication.md @@ -21,10 +21,14 @@ qApp.quit(); QApplication can access all the static methods defined in [Component](api/Component.md). Additionally it also has the following static methods. -#### `qApp.instance()` +#### `QApplication.instance()` Returns the already initialised QApplication instance. It calls the native method [QApplication: instance](https://doc.qt.io/qt-5/qcoreapplication.html#instance). +#### `QApplication.clipboard()` + +Returns the object for interacting with the clipboard. It calls the native method [QApplication: clipboard](https://doc.qt.io/qt-5/qguiapplication.html#clipboard). See QClipboard. + ### Instance Properties QApplication can access all the instance properties defined in [Component](api/Component.md) diff --git a/docs/api/QClipboard.md b/docs/api/QClipboard.md new file mode 100644 index 000000000..439604b0a --- /dev/null +++ b/docs/api/QClipboard.md @@ -0,0 +1,52 @@ +## Class: QClipboard + +> The QClipboard class provides access to the window system clipboard. + +**This class is a JS wrapper around Qt's [QClipboard class](https://doc.qt.io/qt-5/QClipboard.html)** + +**QClipboard inherits from [Component](api/Component.md)** + +### Example + +```javascript +const { + QClipboard, + QClipboardMode, + QApplication +} = require("@nodegui/nodegui"); + +const clipboard = QApplication.clipboard(); +const text = clipboard.text(QClipboardMode.Clipboard); +``` + +### Static Methods + +QClipboard can access all the static methods defined in [Component](api/Component.md) + +### Instance Properties + +QClipboard can access all the instance properties defined in [Component](api/Component.md) + +### Instance Methods + +QClipboard can access all the instance methods defined in [Component](api/Component.md). Additionally it has: + +### `clipboard.clear(mode)` + +Clear the clipboard contents. It calls the native method [QClipboard: clear](https://doc.qt.io/qt-5/qclipboard.html#clear). + +- `mode` - This enum type is used to control which part of the system clipboard is used. See https://doc.qt.io/qt-5/qclipboard.html#Mode-enum + +### `clipboard.setText(text, mode)` + +Copies text into the clipboard as plain text. It calls the native method [QClipboard: setText](https://doc.qt.io/qt-5/qclipboard.html#setText). + +- `text` - The text you want to copy to clipboard. + +- `mode` - This enum type is used to control which part of the system clipboard is used. See https://doc.qt.io/qt-5/qclipboard.html#Mode-enum + +### `clipboard.text(mode)` + +Returns the clipboard text as plain text, or an empty string if the clipboard does not contain any text. It calls the native method [QClipboard: text](https://doc.qt.io/qt-5/qclipboard.html#text). + +- `mode` - This enum type is used to control which part of the system clipboard is used. See https://doc.qt.io/qt-5/qclipboard.html#Mode-enum diff --git a/docs/api/QPlainTextEdit.md b/docs/api/QPlainTextEdit.md index 3185bb8bd..ad38ae488 100644 --- a/docs/api/QPlainTextEdit.md +++ b/docs/api/QPlainTextEdit.md @@ -54,7 +54,7 @@ Deletes all the text in the text edit.[QPlainTextEdit: clear](https://doc.qt.io/ This property holds the mode QPlainTextEdit will use when wrapping text by words.[QPlainTextEdit: setWordWrapMode](https://doc.qt.io/qt-5/qplaintextedit.html#wordWrapMode-prop). -- mode: WrapMode +- mode: QTextOptionWrapMode #### `plainTextEdit.wordWrapMode()` diff --git a/src/cpp/QtGui/QApplication/qapplication_wrap.cpp b/src/cpp/QtGui/QApplication/qapplication_wrap.cpp index c4ad0d056..7ea729e83 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; @@ -15,6 +16,7 @@ Napi::Object QApplicationWrap::init(Napi::Env env, Napi::Object exports) InstanceMethod("exec", &QApplicationWrap::exec), InstanceMethod("quit", &QApplicationWrap::quit), StaticMethod("instance", &StaticQApplicationWrapMethods::instance), + StaticMethod("clipboard", &StaticQApplicationWrapMethods::clipboard), COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE }); constructor = Napi::Persistent(func); @@ -28,22 +30,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 +91,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/demo.ts b/src/demo.ts index 5dae4c81b..161527dbc 100644 --- a/src/demo.ts +++ b/src/demo.ts @@ -11,11 +11,14 @@ import { QIcon, QDial, QPlainTextEdit, - QTextOptionEnums + QScrollArea, + QPixmap, + CursorShape, + WindowState, + QTextOptionWrapMode, + QApplication, + QClipboardMode } from "./index"; -import { QScrollArea } from "./lib/QtWidgets/QScrollArea"; -import { QPixmap } from "./lib/QtGui/QPixmap"; -import { CursorShape, WindowState } from "./lib/QtEnums"; const path = require("path"); @@ -42,6 +45,11 @@ const button = new QPushButton(); button.setText("Push Push Push!"); button.setObjectName("btn"); button.setFlat(true); +button.addEventListener("clicked", () => { + const clipboard = QApplication.clipboard(); + console.log("clipboard: ", clipboard.text(QClipboardMode.Clipboard)); + clipboard.setText("yooooo", QClipboardMode.Clipboard); +}); const nodeguiLogo = new QIcon( path.resolve(__dirname, "../extras/assets/nodegui.png") @@ -66,7 +74,7 @@ rootView.setLayout(new FlexLayout()); const textEdit = new QPlainTextEdit(); textEdit.setPlainText("Hello"); -textEdit.setWordWrapMode(QTextOptionEnums.WrapMode.NoWrap); +textEdit.setWordWrapMode(QTextOptionWrapMode.NoWrap); const scrollArea = new QScrollArea(); scrollArea.setInlineStyle("flex: 1; width:'100%';"); diff --git a/src/index.ts b/src/index.ts index 5c88e1df6..2dba519f1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,7 +5,8 @@ export { QApplication } from "./lib/QtGui/QApplication"; 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 { QTextOptionWrapMode } 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..e2a871325 --- /dev/null +++ b/src/lib/QtGui/QClipboard/index.ts @@ -0,0 +1,31 @@ +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); + }; + text = (mode: QClipboardMode): string => { + return this.native.text(mode); + }; +} + +export enum QClipboardMode { + Clipboard, + Selection, + FindBuffer +} diff --git a/src/lib/QtGui/QTextOption/index.ts b/src/lib/QtGui/QTextOption/index.ts index ad0a97e03..184df95fd 100644 --- a/src/lib/QtGui/QTextOption/index.ts +++ b/src/lib/QtGui/QTextOption/index.ts @@ -1,3 +1,7 @@ -import * as Enums from "./textOptionEnums"; - -export const QTextOptionEnums = Enums; +export enum QTextOptionWrapMode { + NoWrap, + WordWrap, + ManualWrap, + WrapAnywhere, + WrapAtWordBoundaryOrAnywhere +} diff --git a/src/lib/QtGui/QTextOption/textOptionEnums.ts b/src/lib/QtGui/QTextOption/textOptionEnums.ts deleted file mode 100644 index 077d3102b..000000000 --- a/src/lib/QtGui/QTextOption/textOptionEnums.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum WrapMode { - NoWrap, - WordWrap, - ManualWrap, - WrapAnywhere, - WrapAtWordBoundaryOrAnywhere -} diff --git a/src/lib/QtWidgets/QPlainTextEdit/index.ts b/src/lib/QtWidgets/QPlainTextEdit/index.ts index 0858fe9cc..a7d8c288c 100644 --- a/src/lib/QtWidgets/QPlainTextEdit/index.ts +++ b/src/lib/QtWidgets/QPlainTextEdit/index.ts @@ -3,7 +3,7 @@ import { NodeWidget } from "../QWidget"; import { BaseWidgetEvents } from "../../core/EventWidget"; import { NativeElement } from "../../core/Component"; import { QAbstractScrollArea } from "../QAbstractScrollArea"; -import { WrapMode } from "../../QtGui/QTextOption/textOptionEnums"; +import { QTextOptionWrapMode } from "../../QtGui/QTextOption"; export const QPlainTextEditEvents = Object.freeze({ ...BaseWidgetEvents, @@ -59,10 +59,10 @@ export class QPlainTextEdit extends QAbstractScrollArea { // react:✓ this.native.clear(); } - setWordWrapMode(mode: WrapMode) { + setWordWrapMode(mode: QTextOptionWrapMode) { this.native.setWordWrapMode(mode); } - wordWrapMode(): WrapMode { + wordWrapMode(): QTextOptionWrapMode { return this.native.wordWrapMode(); } setLineWrapMode(mode: LineWrapMode) {