Merge pull request #85 from nodegui/feature/clipboard
Add QClipboard support
This commit is contained in:
commit
b4420091e1
@ -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",
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
52
docs/api/QClipboard.md
Normal 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
|
||||
@ -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()`
|
||||
|
||||
|
||||
@ -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) });
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
63
src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp
Normal file
63
src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp
Normal 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());
|
||||
}
|
||||
20
src/cpp/QtGui/QClipboard/qclipboard_wrap.h
Normal file
20
src/cpp/QtGui/QClipboard/qclipboard_wrap.h
Normal 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);
|
||||
};
|
||||
@ -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);
|
||||
|
||||
18
src/demo.ts
18
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%';");
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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();
|
||||
};
|
||||
|
||||
31
src/lib/QtGui/QClipboard/index.ts
Normal file
31
src/lib/QtGui/QClipboard/index.ts
Normal 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
|
||||
}
|
||||
@ -1,3 +1,7 @@
|
||||
import * as Enums from "./textOptionEnums";
|
||||
|
||||
export const QTextOptionEnums = Enums;
|
||||
export enum QTextOptionWrapMode {
|
||||
NoWrap,
|
||||
WordWrap,
|
||||
ManualWrap,
|
||||
WrapAnywhere,
|
||||
WrapAtWordBoundaryOrAnywhere
|
||||
}
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
export enum WrapMode {
|
||||
NoWrap,
|
||||
WordWrap,
|
||||
ManualWrap,
|
||||
WrapAnywhere,
|
||||
WrapAtWordBoundaryOrAnywhere
|
||||
}
|
||||
@ -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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user