Merge pull request #85 from nodegui/feature/clipboard

Add QClipboard support
This commit is contained in:
Atul R 2019-09-06 00:19:47 +02:00 committed by GitHub
commit b4420091e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 226 additions and 28 deletions

View File

@ -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",

View File

@ -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

View File

@ -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)

52
docs/api/QClipboard.md Normal file
View File

@ -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

View File

@ -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()`

View File

@ -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<QApplication>(info[0].As<Napi::External<QApplication>>().Data());
this->instance = info[0].As<Napi::External<QApplication>>().Data();
} else if (info.Length() == 0){
this->instance = std::make_unique<QApplication>(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<QApplication>::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<QClipboard>::New(env, clipboard) });
}

View File

@ -1,15 +1,15 @@
#pragma once
#include <napi.h>
#include <stdlib.h>
#include <QApplication>
class QApplicationWrap : public Napi::ObjectWrap<QApplicationWrap> {
private:
std::unique_ptr<QApplication> 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);
}

View File

@ -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<QClipboardWrap>(info)
{
Napi::Env env = info.Env();
Napi::HandleScope scope(env);
if (info[0].IsExternal()) {
this->instance = info[0].As<Napi::External<QClipboard>>().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<Napi::Number>();
this->instance->clear(static_cast<QClipboard::Mode>(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::String>();
Napi::Number mode = info[1].As<Napi::Number>();
QString clipboardText = text.Utf8Value().c_str();
this->instance->setText(clipboardText, static_cast<QClipboard::Mode>(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<Napi::Number>();
QString text = this->instance->text(static_cast<QClipboard::Mode>(mode.Int32Value()));
return Napi::Value::From(env, text.toStdString());
}

View File

@ -0,0 +1,20 @@
#pragma once
#include <napi.h>
#include <QClipboard>
#include "src/cpp/core/Component/component_macro.h"
class QClipboardWrap : public Napi::ObjectWrap<QClipboardWrap>
{
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);
};

View File

@ -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);

View File

@ -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%';");

View File

@ -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";

View File

@ -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();
};

View File

@ -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
}

View File

@ -1,3 +1,7 @@
import * as Enums from "./textOptionEnums";
export const QTextOptionEnums = Enums;
export enum QTextOptionWrapMode {
NoWrap,
WordWrap,
ManualWrap,
WrapAnywhere,
WrapAtWordBoundaryOrAnywhere
}

View File

@ -1,7 +0,0 @@
export enum WrapMode {
NoWrap,
WordWrap,
ManualWrap,
WrapAnywhere,
WrapAtWordBoundaryOrAnywhere
}

View File

@ -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) {