From 6926bf940ae06d37c830c0c15420d4e17f16a071 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 10:44:19 +0200
Subject: [PATCH 01/49] Adds plain text edit methods and signals
---
.../QtWidgets/QPlainTextEdit/nplaintextedit.h | 35 +++++++++++++++++++
.../QPlainTextEdit/qplaintextedit_wrap.cpp | 34 ++++++++++++++++++
.../QPlainTextEdit/qplaintextedit_wrap.h | 4 +++
src/demo.ts | 6 ++--
src/index.ts | 4 ++-
src/lib/QtGui/QTextOption/index.ts | 3 ++
src/lib/QtGui/QTextOption/textOptionEnums.ts | 7 ++++
src/lib/QtWidgets/QPlainTextEdit/index.ts | 32 +++++++++++++++--
8 files changed, 120 insertions(+), 5 deletions(-)
create mode 100644 src/lib/QtGui/QTextOption/index.ts
create mode 100644 src/lib/QtGui/QTextOption/textOptionEnums.ts
diff --git a/src/cpp/QtWidgets/QPlainTextEdit/nplaintextedit.h b/src/cpp/QtWidgets/QPlainTextEdit/nplaintextedit.h
index b1da3ec04..2b5d5d911 100644
--- a/src/cpp/QtWidgets/QPlainTextEdit/nplaintextedit.h
+++ b/src/cpp/QtWidgets/QPlainTextEdit/nplaintextedit.h
@@ -17,5 +17,40 @@ public:
Napi::HandleScope scope(env);
this->emitOnNode.Call({Napi::String::New(env, "textChanged")});
});
+ QObject::connect(this, &QPlainTextEdit::blockCountChanged, [=](int newBlockCount) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({Napi::String::New(env, "blockCountChanged"), Napi::Value::From(env, newBlockCount)});
+ });
+ QObject::connect(this, &QPlainTextEdit::copyAvailable, [=](bool yes) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({Napi::String::New(env, "copyAvailable"), Napi::Value::From(env, yes)});
+ });
+ QObject::connect(this, &QPlainTextEdit::cursorPositionChanged, [=]() {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({Napi::String::New(env, "cursorPositionChanged")});
+ });
+ QObject::connect(this, &QPlainTextEdit::modificationChanged, [=](bool charged) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({Napi::String::New(env, "modificationChanged"), Napi::Value::From(env, charged)});
+ });
+ QObject::connect(this, &QPlainTextEdit::redoAvailable, [=](bool available) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({Napi::String::New(env, "redoAvailable"), Napi::Value::From(env, available)});
+ });
+ QObject::connect(this, &QPlainTextEdit::selectionChanged, [=]() {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({Napi::String::New(env, "selectionChanged")});
+ });
+ QObject::connect(this, &QPlainTextEdit::undoAvailable, [=](bool available) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({Napi::String::New(env, "undoAvailable"), Napi::Value::From(env, available)});
+ });
}
};
diff --git a/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp b/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp
index 797dc031a..c8b7f6af8 100644
--- a/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp
+++ b/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp
@@ -15,6 +15,10 @@ Napi::Object QPlainTextEditWrap::init(Napi::Env env, Napi::Object exports) {
InstanceMethod("toPlainText",&QPlainTextEditWrap::toPlainText),
InstanceMethod("setReadOnly", &QPlainTextEditWrap::setReadOnly),
InstanceMethod("clear", &QPlainTextEditWrap::clear),
+ InstanceMethod("setWordWrapMode", &QPlainTextEditWrap::setWordWrapMode),
+ InstanceMethod("wordWrapMode", &QPlainTextEditWrap::wordWrapMode),
+ InstanceMethod("setLineWrapMode", &QPlainTextEditWrap::setLineWrapMode),
+ InstanceMethod("lineWrapMode", &QPlainTextEditWrap::lineWrapMode),
QWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(QPlainTextEditWrap)
QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(QPlainTextEditWrap)
});
@@ -77,3 +81,33 @@ Napi::Value QPlainTextEditWrap::clear(const Napi::CallbackInfo &info){
this->instance->clear();
return env.Null();
}
+
+Napi::Value QPlainTextEditWrap::setWordWrapMode(const Napi::CallbackInfo &info){
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ Napi::Number mode = info[0].As();
+ this->instance->setWordWrapMode(static_cast(mode.Int32Value()));
+ return env.Null();
+}
+
+Napi::Value QPlainTextEditWrap::wordWrapMode(const Napi::CallbackInfo &info){
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ int value = static_cast(this->instance->wordWrapMode());
+ return Napi::Number::From(env, value);
+}
+
+Napi::Value QPlainTextEditWrap::setLineWrapMode(const Napi::CallbackInfo &info){
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ Napi::Number mode = info[0].As();
+ this->instance->setLineWrapMode(static_cast(mode.Int32Value()));
+ return env.Null();
+}
+
+Napi::Value QPlainTextEditWrap::lineWrapMode(const Napi::CallbackInfo &info){
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ int value = static_cast(this->instance->lineWrapMode());
+ return Napi::Number::From(env, value);
+}
\ No newline at end of file
diff --git a/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h b/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h
index b9ff9c6ce..0081d327f 100644
--- a/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h
+++ b/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h
@@ -23,5 +23,9 @@ class QPlainTextEditWrap : public Napi::ObjectWrap{
Napi::Value toPlainText(const Napi::CallbackInfo &info);
Napi::Value setReadOnly(const Napi::CallbackInfo &info);
Napi::Value clear(const Napi::CallbackInfo &info);
+ Napi::Value setWordWrapMode(const Napi::CallbackInfo &info);
+ Napi::Value wordWrapMode(const Napi::CallbackInfo &info);
+ Napi::Value setLineWrapMode(const Napi::CallbackInfo &info);
+ Napi::Value lineWrapMode(const Napi::CallbackInfo &info);
};
diff --git a/src/demo.ts b/src/demo.ts
index 4352000d0..5dae4c81b 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -10,11 +10,12 @@ import {
QWidget,
QIcon,
QDial,
- QPlainTextEdit
+ QPlainTextEdit,
+ QTextOptionEnums
} from "./index";
import { QScrollArea } from "./lib/QtWidgets/QScrollArea";
import { QPixmap } from "./lib/QtGui/QPixmap";
-import { CursorShape, WindowState } from "./lib/QtEnums"
+import { CursorShape, WindowState } from "./lib/QtEnums";
const path = require("path");
@@ -65,6 +66,7 @@ rootView.setLayout(new FlexLayout());
const textEdit = new QPlainTextEdit();
textEdit.setPlainText("Hello");
+textEdit.setWordWrapMode(QTextOptionEnums.WrapMode.NoWrap);
const scrollArea = new QScrollArea();
scrollArea.setInlineStyle("flex: 1; width:'100%';");
diff --git a/src/index.ts b/src/index.ts
index 2b5734886..5c88e1df6 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -5,6 +5,7 @@ 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";
// Events: Maybe a separate module ?
export { QKeyEvent } from "./lib/QtGui/QEvent/QKeyEvent";
export { NativeEvent } from "./lib/core/EventWidget";
@@ -26,7 +27,8 @@ export { QSpinBox, QSpinBoxEvents } from "./lib/QtWidgets/QSpinBox";
export { QRadioButton, QRadioButtonEvents } from "./lib/QtWidgets/QRadioButton";
export {
QPlainTextEdit,
- QPlainTextEditEvents
+ QPlainTextEditEvents,
+ LineWrapMode
} from "./lib/QtWidgets/QPlainTextEdit";
export { QScrollArea, QScrollAreaEvents } from "./lib/QtWidgets/QScrollArea";
// Layouts:
diff --git a/src/lib/QtGui/QTextOption/index.ts b/src/lib/QtGui/QTextOption/index.ts
new file mode 100644
index 000000000..ad0a97e03
--- /dev/null
+++ b/src/lib/QtGui/QTextOption/index.ts
@@ -0,0 +1,3 @@
+import * as Enums from "./textOptionEnums";
+
+export const QTextOptionEnums = Enums;
diff --git a/src/lib/QtGui/QTextOption/textOptionEnums.ts b/src/lib/QtGui/QTextOption/textOptionEnums.ts
new file mode 100644
index 000000000..077d3102b
--- /dev/null
+++ b/src/lib/QtGui/QTextOption/textOptionEnums.ts
@@ -0,0 +1,7 @@
+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 b87994b01..0858fe9cc 100644
--- a/src/lib/QtWidgets/QPlainTextEdit/index.ts
+++ b/src/lib/QtWidgets/QPlainTextEdit/index.ts
@@ -3,12 +3,24 @@ import { NodeWidget } from "../QWidget";
import { BaseWidgetEvents } from "../../core/EventWidget";
import { NativeElement } from "../../core/Component";
import { QAbstractScrollArea } from "../QAbstractScrollArea";
+import { WrapMode } from "../../QtGui/QTextOption/textOptionEnums";
export const QPlainTextEditEvents = Object.freeze({
...BaseWidgetEvents,
- textChanged: "textChanged"
+ textChanged: "textChanged",
+ blockCountChanged: "blockCountChanged",
+ copyAvailable: "copyAvailable",
+ cursorPositionChanged: "cursorPositionChanged",
+ modificationChanged: "modificationChanged",
+ redoAvailable: "redoAvailable",
+ selectionChanged: "selectionChanged",
+ undoAvailable: "undoAvailable"
});
+export enum LineWrapMode {
+ NoWrap,
+ WidgetWidth
+}
export class QPlainTextEdit extends QAbstractScrollArea {
native: NativeElement;
constructor(parent?: NodeWidget) {
@@ -26,12 +38,16 @@ export class QPlainTextEdit extends QAbstractScrollArea {
this.toPlainText.bind(this);
this.setReadOnly.bind(this);
this.clear.bind(this);
+ this.setWordWrapMode.bind(this);
+ this.wordWrapMode.bind(this);
+ this.setLineWrapMode.bind(this);
+ this.lineWrapMode.bind(this);
}
setPlainText(text: string | number) {
// react:✓
this.native.setPlainText(`${text}`);
}
- toPlainText() {
+ toPlainText(): string {
// react:✓
return this.native.toPlainText();
}
@@ -43,4 +59,16 @@ export class QPlainTextEdit extends QAbstractScrollArea {
// react:✓
this.native.clear();
}
+ setWordWrapMode(mode: WrapMode) {
+ this.native.setWordWrapMode(mode);
+ }
+ wordWrapMode(): WrapMode {
+ return this.native.wordWrapMode();
+ }
+ setLineWrapMode(mode: LineWrapMode) {
+ this.native.setLineWrapMode(mode);
+ }
+ lineWrapMode(): LineWrapMode {
+ return this.native.lineWrapMode();
+ }
}
From 179c48a28d6fc6bd0a677a70663a0b80c4e3cdc6 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 10:52:47 +0200
Subject: [PATCH 02/49] Adds docs
---
docs/api/QPlainTextEdit.md | 36 ++++++++++++++++++++++++++++--------
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/docs/api/QPlainTextEdit.md b/docs/api/QPlainTextEdit.md
index 0a820a80d..3185bb8bd 100644
--- a/docs/api/QPlainTextEdit.md
+++ b/docs/api/QPlainTextEdit.md
@@ -32,20 +32,40 @@ QPlainTextEdit can access all the instance properties defined in [NodeWidget](ap
QPlainTextEdit can access all the instance methods defined in [NodeWidget](api/NodeWidget.md).
-#### [`plainTextEdit.setPlainText(text)`](https://doc.qt.io/qt-5/qplaintextedit.html#setPlainText)
+#### `plainTextEdit.setPlainText(text)`
-Sets the given text to the plainTextEdit.
+Sets the given text to the plainTextEdit. It calls the native method [QPlainTextEdit: setPlainText](https://doc.qt.io/qt-5/qplaintextedit.html#setPlainText).
- `text` string
-#### [`plainTextEdit.toPlainText()`](https://doc.qt.io/qt-5/qplaintextedit.html#toPlainText)
+#### `plainTextEdit.toPlainText()`
-Returns the text of the text edit as plain text.
+Returns the text of the text edit as plain text. [QPlainTextEdit: toPlainText](https://doc.qt.io/qt-5/qplaintextedit.html#toPlainText).
-#### [`plainTextEdit.setReadOnly(isReadOnly)`](https://doc.qt.io/qt-5/qplaintextedit.html#readOnly-prop)
+#### `plainTextEdit.setReadOnly(isReadOnly)`
-Sets the plainTextEdit to be read only.
+Sets the plainTextEdit to be read only. [QPlainTextEdit: isReadOnly](https://doc.qt.io/qt-5/qplaintextedit.html#readOnly-prop).
-#### [`plainTextEdit.clear()`](https://doc.qt.io/qt-5/qplaintextedit.html#clear)
+#### `plainTextEdit.clear()`
-Deletes all the text in the text edit.
+Deletes all the text in the text edit.[QPlainTextEdit: clear](https://doc.qt.io/qt-5/qplaintextedit.html#clear).
+
+#### `plainTextEdit.setWordWrapMode(mode)`
+
+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
+
+#### `plainTextEdit.wordWrapMode()`
+
+returns word wrap mode. [QPlainTextEdit: wordWrapMode](https://doc.qt.io/qt-5/qplaintextedit.html#wordWrapMode-prop).
+
+#### `plainTextEdit.setLineWrapMode(mode)`
+
+This property holds the line wrap mode. [QPlainTextEdit: setLineWrapMode](https://doc.qt.io/qt-5/qplaintextedit.html#lineWrapMode-prop).
+
+- mode: LineWrapMode
+
+#### `plainTextEdit.lineWrapMode()`
+
+returns line wrap mode. [QPlainTextEdit: setLineWrapMode](https://doc.qt.io/qt-5/qplaintextedit.html#lineWrapMode-prop).
From 0ff2c8d2a9cee0d9ab076f27039694291a2c1755 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 19:36:31 +0200
Subject: [PATCH 03/49] Adds qclipboard
---
config/application.gypi | 1 +
.../QtGui/QApplication/qapplication_wrap.cpp | 21 +++++--
.../QtGui/QApplication/qapplication_wrap.h | 5 +-
src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp | 63 +++++++++++++++++++
src/cpp/QtGui/QClipboard/qclipboard_wrap.h | 20 ++++++
src/cpp/main.cpp | 2 +
src/index.ts | 1 +
src/lib/QtGui/QApplication/index.ts | 4 ++
src/lib/QtGui/QClipboard/index.ts | 28 +++++++++
9 files changed, 138 insertions(+), 7 deletions(-)
create mode 100644 src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp
create mode 100644 src/cpp/QtGui/QClipboard/qclipboard_wrap.h
create mode 100644 src/lib/QtGui/QClipboard/index.ts
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
+}
From 97f4fdca28af0b481c8d8eee8722a76d8aa55ca2 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 19:54:55 +0200
Subject: [PATCH 04/49] Adds QClipboard docs
---
docs/README.md | 2 ++
docs/api/QApplication.md | 6 +++-
docs/api/QClipboard.md | 52 +++++++++++++++++++++++++++++++
src/lib/QtGui/QClipboard/index.ts | 3 ++
4 files changed, 62 insertions(+), 1 deletion(-)
create mode 100644 docs/api/QClipboard.md
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/src/lib/QtGui/QClipboard/index.ts b/src/lib/QtGui/QClipboard/index.ts
index 7e048d9cb..622cedcb3 100644
--- a/src/lib/QtGui/QClipboard/index.ts
+++ b/src/lib/QtGui/QClipboard/index.ts
@@ -19,6 +19,9 @@ export class QClipboard extends Component {
setText = (text: string, mode: QClipboardMode) => {
this.native.setText(text, mode);
};
+ text = (mode: QClipboardMode) => {
+ return this.native.text(mode);
+ };
}
export enum QClipboardMode {
From 6120679bf1d9915a808d5a5092b28ce92613fdd5 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 20:02:42 +0200
Subject: [PATCH 05/49] Fixes weird way of exporting textoptions
---
docs/api/QPlainTextEdit.md | 2 +-
src/demo.ts | 6 +++---
src/index.ts | 2 +-
src/lib/QtGui/QTextOption/index.ts | 10 +++++++---
src/lib/QtGui/QTextOption/textOptionEnums.ts | 7 -------
src/lib/QtWidgets/QPlainTextEdit/index.ts | 6 +++---
6 files changed, 15 insertions(+), 18 deletions(-)
delete mode 100644 src/lib/QtGui/QTextOption/textOptionEnums.ts
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/demo.ts b/src/demo.ts
index 5dae4c81b..8d72d81b8 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -10,12 +10,12 @@ import {
QWidget,
QIcon,
QDial,
- QPlainTextEdit,
- QTextOptionEnums
+ QPlainTextEdit
} from "./index";
import { QScrollArea } from "./lib/QtWidgets/QScrollArea";
import { QPixmap } from "./lib/QtGui/QPixmap";
import { CursorShape, WindowState } from "./lib/QtEnums";
+import { QTextOptionWrapMode } from "./lib/QtGui/QTextOption";
const path = require("path");
@@ -66,7 +66,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 dd09a5ec8..2dba519f1 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -5,7 +5,7 @@ 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";
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) {
From 34fc9c56214efc5c5cf1baae48341a007c60bf24 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 20:26:02 +0200
Subject: [PATCH 06/49] Adds clipboard demo
---
.../QtGui/QApplication/qapplication_wrap.cpp | 1 +
src/demo.ts | 18 +++++++++++++-----
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/src/cpp/QtGui/QApplication/qapplication_wrap.cpp b/src/cpp/QtGui/QApplication/qapplication_wrap.cpp
index 144226fd2..7ea729e83 100644
--- a/src/cpp/QtGui/QApplication/qapplication_wrap.cpp
+++ b/src/cpp/QtGui/QApplication/qapplication_wrap.cpp
@@ -16,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);
diff --git a/src/demo.ts b/src/demo.ts
index 8d72d81b8..161527dbc 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -10,12 +10,15 @@ import {
QWidget,
QIcon,
QDial,
- QPlainTextEdit
+ QPlainTextEdit,
+ 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";
-import { QTextOptionWrapMode } from "./lib/QtGui/QTextOption";
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")
From 3b72f4d94986a954044ffc38141c6ceef6891d84 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 20:28:28 +0200
Subject: [PATCH 07/49] adds return type
---
src/lib/QtGui/QClipboard/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lib/QtGui/QClipboard/index.ts b/src/lib/QtGui/QClipboard/index.ts
index 622cedcb3..e2a871325 100644
--- a/src/lib/QtGui/QClipboard/index.ts
+++ b/src/lib/QtGui/QClipboard/index.ts
@@ -19,7 +19,7 @@ export class QClipboard extends Component {
setText = (text: string, mode: QClipboardMode) => {
this.native.setText(text, mode);
};
- text = (mode: QClipboardMode) => {
+ text = (mode: QClipboardMode): string => {
return this.native.text(mode);
};
}
From 2153e14745f80b55aaec4ebb3e5eac58d1fba36e Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 21:08:56 +0200
Subject: [PATCH 08/49] Update README.md
---
README.md | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index a5ab523f7..45bed8d5c 100644
--- a/README.md
+++ b/README.md
@@ -70,15 +70,21 @@ Looking to contribute? If you wish to implement a new widget/add more features a
`npm run build [--qt_home_dir=/path/to/qt]`
+## Funding
+
+NodeGUI is an open source project. If you like this project, please consider support my work with Ko-fi.
+
+[](https://ko-fi.com/E1E510AV9)
+
+or
+
+Issues on NodeGui can be funded by anyone and the money will be distributed to respective contributors.
+[](https://issuehunt.io/r/nodegui/nodegui)
+
### LICENSE
MIT
-## Note
-
-> Since we do not in any way modify the code of Qt and only link to it dynamically, I believe we are in compliance with the LGPL license requirements of QT. And hence this library can be licensed under its own License (for which we have chosen MIT License).
-> The links to QT source code and appropriate license notices are attached. We try our best to abide by the software licenses and any non compliance is not by will. If there is some discrepancy please let us know in the issues and we will try and fix it up.
-> If you follow the recommended build steps and do not statically link QT libraries on your own you are safe to use this library for commerical purposes (provided you abide by MIT License).
## Maintainers ✨
@@ -91,6 +97,7 @@ People maintaining this project.
+
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
From 92eddb5bf0d656be451e5fdef8591f179d1e3ff5 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 21:13:05 +0200
Subject: [PATCH 09/49] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 45bed8d5c..0ef105e07 100644
--- a/README.md
+++ b/README.md
@@ -76,9 +76,10 @@ NodeGUI is an open source project. If you like this project, please consider sup
[](https://ko-fi.com/E1E510AV9)
-or
+or
Issues on NodeGui can be funded by anyone and the money will be distributed to respective contributors.
+
[](https://issuehunt.io/r/nodegui/nodegui)
### LICENSE
From b90876f778b31deb37d135f41ba33b633215acbf Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 21:25:49 +0200
Subject: [PATCH 10/49] Update README.md
---
README.md | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index 0ef105e07..2e915e3c1 100644
--- a/README.md
+++ b/README.md
@@ -72,15 +72,12 @@ Looking to contribute? If you wish to implement a new widget/add more features a
## Funding
-NodeGUI is an open source project. If you like this project, please consider support my work with Ko-fi.
+NodeGUI is an open source project and requires your support. If you like this project, please consider supporting my work with Ko-fi. Alternatively, Issues on NodeGui can be funded by anyone via Issuehunt and the amount will be distributed to respective contributors.
-[](https://ko-fi.com/E1E510AV9)
-
-or
-
-Issues on NodeGui can be funded by anyone and the money will be distributed to respective contributors.
-
-[](https://issuehunt.io/r/nodegui/nodegui)
+
+
+
+
### LICENSE
From 5fb64dece8d9a7644b3c0a59f83d3bb4d374316a Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 21:31:35 +0200
Subject: [PATCH 11/49] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 2e915e3c1..60e77a050 100644
--- a/README.md
+++ b/README.md
@@ -75,7 +75,7 @@ Looking to contribute? If you wish to implement a new widget/add more features a
NodeGUI is an open source project and requires your support. If you like this project, please consider supporting my work with Ko-fi. Alternatively, Issues on NodeGui can be funded by anyone via Issuehunt and the amount will be distributed to respective contributors.
-
+
From 5b7a06a19e50855b4976bcc7693e48ae620453a6 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 5 Sep 2019 21:32:57 +0200
Subject: [PATCH 12/49] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 60e77a050..803b81ef7 100644
--- a/README.md
+++ b/README.md
@@ -74,7 +74,7 @@ Looking to contribute? If you wish to implement a new widget/add more features a
NodeGUI is an open source project and requires your support. If you like this project, please consider supporting my work with Ko-fi. Alternatively, Issues on NodeGui can be funded by anyone via Issuehunt and the amount will be distributed to respective contributors.
-
+
From 1ecd37622e2c4e65fc99946cc5dcfdd4c617d82f Mon Sep 17 00:00:00 2001
From: Atul R
Date: Fri, 6 Sep 2019 00:35:46 +0200
Subject: [PATCH 13/49] now automoc runs with qode qt env
---
scripts/automoc.js | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/scripts/automoc.js b/scripts/automoc.js
index 432c5b483..1805095af 100644
--- a/scripts/automoc.js
+++ b/scripts/automoc.js
@@ -1,6 +1,7 @@
const path = require("path");
const fs = require("fs");
const childProcess = require("child_process");
+const { qtHome } = require("@nodegui/qode");
const ROOT_DIR = path.resolve(__dirname, "../");
const MOC_AUTOGEN_DIR = path.resolve(ROOT_DIR, "src/cpp/autogen");
@@ -50,13 +51,22 @@ const main = () => {
eachHeaderPath,
includeFilePath
);
- console.log(command);
- childProcess.exec(command, {}, error => {
- if (error) {
- console.error(`exec error: ${error}`);
- return;
+ const mocPath = path.resolve(process.env.QT_INSTALL_DIR || qtHome, "bin");
+ childProcess.exec(
+ command,
+ {
+ env: {
+ ...process.env,
+ PATH: `${mocPath}${path.delimiter}${process.env.PATH}`
+ }
+ },
+ error => {
+ if (error) {
+ console.error(`exec error: ${error}`);
+ return;
+ }
}
- });
+ );
return outfilePath;
});
generateMocGypiFile(outFiles);
From bf1aecfa8b7eb80c7c68f7cf5b436e8b690215b7 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sat, 7 Sep 2019 08:12:41 +0200
Subject: [PATCH 14/49] fixes all flex layout issues
---
src/cpp/QtWidgets/QMainWindow/nmainwindow.h | 19 ---------------
src/cpp/QtWidgets/QWidget/nwidget.h | 16 ++++++-------
src/cpp/core/FlexLayout/flexlayout.cpp | 26 ++++++++++++++++-----
src/cpp/core/FlexLayout/flexlayout.h | 1 +
src/demo.ts | 7 +++++-
5 files changed, 35 insertions(+), 34 deletions(-)
diff --git a/src/cpp/QtWidgets/QMainWindow/nmainwindow.h b/src/cpp/QtWidgets/QMainWindow/nmainwindow.h
index dbcb5b947..0d62b5500 100644
--- a/src/cpp/QtWidgets/QMainWindow/nmainwindow.h
+++ b/src/cpp/QtWidgets/QMainWindow/nmainwindow.h
@@ -9,25 +9,6 @@ class NMainWindow: public QMainWindow, public NodeWidget
NODEWIDGET_IMPLEMENTATIONS(QMainWindow)
public:
using QMainWindow::QMainWindow; //inherit all constructors of QMainWindow
-private:
- void calculateLayout(){
- YGDirection direction = YGNodeStyleGetDirection(this->getFlexNode());
- YGNodeCalculateLayout(this->getFlexNode(),width(),height(),direction);
- }
- bool eventFilter(QObject *object, QEvent *event) { // This will be installed on mainwidgetwrap
- switch(event->type()) {
- case QEvent::LayoutRequest:
- case QEvent::ChildRemoved: {
- calculateLayout(); break;
- }
- default: ; // do nothing
- }
- return QMainWindow::eventFilter(object, event);
- }
- void resizeEvent(QResizeEvent * event){
- calculateLayout();
- QMainWindow::resizeEvent(event);
- }
};
diff --git a/src/cpp/QtWidgets/QWidget/nwidget.h b/src/cpp/QtWidgets/QWidget/nwidget.h
index e1d29cf7b..a538868af 100644
--- a/src/cpp/QtWidgets/QWidget/nwidget.h
+++ b/src/cpp/QtWidgets/QWidget/nwidget.h
@@ -11,14 +11,14 @@ class NWidget: public QWidget, public NodeWidget
public:
using QWidget::QWidget;
// https://doc.qt.io/qt-5/stylesheet-reference.html
- void paintEvent(QPaintEvent *e)
- {
- QStyleOption opt;
- opt.init(this);
- QPainter p(this);
- style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
- QWidget::paintEvent(e);
- }
+ // void paintEvent(QPaintEvent *e)
+ // {
+ // QStyleOption opt;
+ // opt.init(this);
+ // QPainter p(this);
+ // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+ // QWidget::paintEvent(e);
+ // }
};
diff --git a/src/cpp/core/FlexLayout/flexlayout.cpp b/src/cpp/core/FlexLayout/flexlayout.cpp
index ad87c0ded..e2fd8363e 100644
--- a/src/cpp/core/FlexLayout/flexlayout.cpp
+++ b/src/cpp/core/FlexLayout/flexlayout.cpp
@@ -4,7 +4,7 @@
#include "spdlog/spdlog.h"
#include "src/cpp/core/YogaWidget/yogawidget.h"
-FlexLayout::NodeContext *FlexLayout::getNodeContext(YGNodeRef node)
+FlexLayout::NodeContext* FlexLayout::getNodeContext(YGNodeRef node)
{
if(!node){
return nullptr;
@@ -16,7 +16,6 @@ FlexLayout::NodeContext *FlexLayout::getNodeContext(YGNodeRef node)
FlexLayout::FlexLayout(QWidget *parentWidget, YGNodeRef parentNode): QLayout(parentWidget)
{
- // spdlog::set_level(spdlog::level::off);
this->node = parentNode;
}
@@ -58,7 +57,6 @@ QLayoutItem *FlexLayout::itemAt(int index) const
YGNodeRef childNode = YGNodeGetChild(this->node, static_cast(index));
NodeContext *ctx = getNodeContext(childNode);
if(!ctx){
- // spdlog::info("flexlayout: itemAt null context {}",index);
return nullptr;
}
return ctx->item;
@@ -91,14 +89,13 @@ void FlexLayout::addWidget(QWidget* childWidget, YGNodeRef childNode)
spdlog::warn("Flex layout's parent yoga node not set yet. Set it using setFlexNode. Child widget will not be added to Flex Layout");
return;
}
- // spdlog::info("flexlayout: addWidget Object: {}",childWidget->metaObject()->className());
-
uint count = YGNodeGetChildCount(this->node);
YGNodeInsertChild(this->node,childNode, count);
QLayoutItem* layoutItem = new QWidgetItem(childWidget);
NodeContext* childContext = new NodeContext(layoutItem);
YGNodeSetContext(childNode, static_cast(childContext));
QLayout::addWidget(childWidget);
+ this->invalidate();
}
void FlexLayout::removeWidget(QWidget* childWidget, YGNodeRef childNode)
@@ -114,6 +111,7 @@ void FlexLayout::removeWidget(QWidget* childWidget, YGNodeRef childNode)
}
YGNodeRemoveChild(this->node, childNode);
QLayout::removeWidget(childWidget);
+ this->invalidate();
}
void FlexLayout::insertChildBefore(QWidget* childWidget, YGNodeRef beforeChildNode, YGNodeRef childNode)
@@ -135,14 +133,30 @@ void FlexLayout::insertChildBefore(QWidget* childWidget, YGNodeRef beforeChildNo
NodeContext* childContext = new NodeContext(layoutItem);
YGNodeSetContext(childNode, static_cast(childContext));
QLayout::addWidget(childWidget);
+ this->invalidate();
}
+
+YGNodeRef FlexLayout::getRootNode(YGNodeRef node){
+ YGNodeRef parent = node->getOwner();
+ if(!parent){
+ return node;
+ }else {
+ return getRootNode(parent);
+ }
+}
+
+
void FlexLayout::setGeometry(const QRect &rect)
{
if(!this->node){
return;
}
-
+ YGNodeRef rootNode = getRootNode(this->node);
+ QWidget* parentWidget = this->parentWidget();
+ QWidget* window = parentWidget->window();
+ YGDirection direction = YGNodeStyleGetDirection(rootNode);
+ YGNodeCalculateLayout(rootNode,window->width(),window->height(),direction);
uint count = YGNodeGetChildCount(this->node);
for (uint i = 0; i < count; ++i) {
diff --git a/src/cpp/core/FlexLayout/flexlayout.h b/src/cpp/core/FlexLayout/flexlayout.h
index ab35ef896..bdcaf46ae 100644
--- a/src/cpp/core/FlexLayout/flexlayout.h
+++ b/src/cpp/core/FlexLayout/flexlayout.h
@@ -24,6 +24,7 @@ class FlexLayout: public QLayout
{
private:
YGNodeRef node;
+ YGNodeRef getRootNode(YGNodeRef node);
public:
struct NodeContext
{
diff --git a/src/demo.ts b/src/demo.ts
index 161527dbc..13e88495f 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -49,6 +49,11 @@ button.addEventListener("clicked", () => {
const clipboard = QApplication.clipboard();
console.log("clipboard: ", clipboard.text(QClipboardMode.Clipboard));
clipboard.setText("yooooo", QClipboardMode.Clipboard);
+ if (rootView.layout) {
+ (rootView.layout as FlexLayout).removeWidget(dial);
+ rootView.layout.invalidate();
+ // rootView.update();
+ }
});
const nodeguiLogo = new QIcon(
@@ -111,7 +116,7 @@ win.setStyleSheet(`
win.setWindowIcon(nodeguiLogo);
win.setWindowTitle("NodeGUI Demo");
-win.resize(400, 400);
+win.resize(400, 700);
win.show();
win.setWindowState(WindowState.WindowActive);
From 41d8ddbe23b33f66dde3e17c290d616f5d1cc44c Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sat, 7 Sep 2019 10:49:19 +0200
Subject: [PATCH 15/49] Update issue templates
---
.github/ISSUE_TEMPLATE/bug_report.md | 32 +++++++++++++++++++++++
.github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++++
2 files changed, 52 insertions(+)
create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md
create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..8d38c2255
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,32 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Desktop (please complete the following information):**
+ - OS: [e.g. Mac, Linux, Win]
+ - NodeGUI version
+ - OS Version
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..bbcbbe7d6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
From e5a5425f0b216971715432a2a7d31bde227a98bf Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sat, 7 Sep 2019 11:28:44 +0200
Subject: [PATCH 16/49] brings back nwidget
---
src/cpp/QtWidgets/QWidget/nwidget.h | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/cpp/QtWidgets/QWidget/nwidget.h b/src/cpp/QtWidgets/QWidget/nwidget.h
index a538868af..e1d29cf7b 100644
--- a/src/cpp/QtWidgets/QWidget/nwidget.h
+++ b/src/cpp/QtWidgets/QWidget/nwidget.h
@@ -11,14 +11,14 @@ class NWidget: public QWidget, public NodeWidget
public:
using QWidget::QWidget;
// https://doc.qt.io/qt-5/stylesheet-reference.html
- // void paintEvent(QPaintEvent *e)
- // {
- // QStyleOption opt;
- // opt.init(this);
- // QPainter p(this);
- // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
- // QWidget::paintEvent(e);
- // }
+ void paintEvent(QPaintEvent *e)
+ {
+ QStyleOption opt;
+ opt.init(this);
+ QPainter p(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+ QWidget::paintEvent(e);
+ }
};
From 317bca6c2ec1c98fa019855f4f340aecfe5d5021 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sat, 7 Sep 2019 19:12:17 +0200
Subject: [PATCH 17/49] cleanup
---
src/demo.ts | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/demo.ts b/src/demo.ts
index 13e88495f..aa79bd563 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -51,8 +51,6 @@ button.addEventListener("clicked", () => {
clipboard.setText("yooooo", QClipboardMode.Clipboard);
if (rootView.layout) {
(rootView.layout as FlexLayout).removeWidget(dial);
- rootView.layout.invalidate();
- // rootView.update();
}
});
From 620a85e417e35db12d95f2abd4eb9dcaa28ed58a Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sat, 7 Sep 2019 21:59:52 +0200
Subject: [PATCH 18/49] Bumps version
---
package-lock.json | 2 +-
package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 728fd4be0..b5cbdde3c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@nodegui/nodegui",
- "version": "0.1.7",
+ "version": "0.1.8",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index b9696d890..d6987f3d6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@nodegui/nodegui",
- "version": "0.1.7",
+ "version": "0.1.8",
"description": "A cross platform library to build native desktop apps.",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From 4bfb00d66409c1f678707feca5e5dd79ad6851bf Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sun, 8 Sep 2019 08:19:28 +0200
Subject: [PATCH 19/49] Update README.md
---
README.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 803b81ef7..3138f748f 100644
--- a/README.md
+++ b/README.md
@@ -79,7 +79,11 @@ NodeGUI is an open source project and requires your support. If you like this pr
-### LICENSE
+## THANKS
+
+- [Logo](https://github.com/nodegui/nodegui/blob/master/extras/legal/logo/thanks.md) Thanks to Vishwas Shetty from the Noun Project.
+
+## LICENSE
MIT
From ad969736ec9b3a00a54159394d5fec02975e12d3 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sun, 8 Sep 2019 08:20:26 +0200
Subject: [PATCH 20/49] Update thanks.md
---
extras/legal/logo/thanks.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/extras/legal/logo/thanks.md b/extras/legal/logo/thanks.md
index dd7ccacf7..16b9c9a73 100644
--- a/extras/legal/logo/thanks.md
+++ b/extras/legal/logo/thanks.md
@@ -1,6 +1,6 @@
# Logo
-
+
Special thanks to the Noun Project for the logo.
From 23ca647bcf20bdd4305ea8db45ac70534fb0b87b Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sun, 8 Sep 2019 08:22:54 +0200
Subject: [PATCH 21/49] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 3138f748f..72f6d34a0 100644
--- a/README.md
+++ b/README.md
@@ -79,11 +79,11 @@ NodeGUI is an open source project and requires your support. If you like this pr
-## THANKS
+## Special Thanks
-- [Logo](https://github.com/nodegui/nodegui/blob/master/extras/legal/logo/thanks.md) Thanks to Vishwas Shetty from the Noun Project.
+- [Logo: Thanks to Vishwas Shetty from the Noun Project.](https://github.com/nodegui/nodegui/blob/master/extras/legal/logo/thanks.md)
-## LICENSE
+## License
MIT
From 8924a26c86a485645e6e496acf02072a8af28ab8 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Sun, 8 Sep 2019 22:28:54 +0200
Subject: [PATCH 22/49] upgrade node-gyp to v5.0.3
---
package-lock.json | 40 ++++++++++++++--------------------------
package.json | 2 +-
2 files changed, 15 insertions(+), 27 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index b5cbdde3c..fc14e1d8a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -975,21 +975,28 @@
"integrity": "sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ=="
},
"node-gyp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz",
- "integrity": "sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.0.3.tgz",
+ "integrity": "sha512-z/JdtkFGUm0QaQUusvloyYuGDub3nUbOo5de1Fz57cM++osBTvQatBUSTlF1k/w8vFHPxxXW6zxGvkxXSpaBkQ==",
"requires": {
+ "env-paths": "^1.0.0",
"glob": "^7.0.3",
"graceful-fs": "^4.1.2",
"mkdirp": "^0.5.0",
"nopt": "2 || 3",
"npmlog": "0 || 1 || 2 || 3 || 4",
- "osenv": "0",
"request": "^2.87.0",
"rimraf": "2",
"semver": "~5.3.0",
"tar": "^4.4.8",
"which": "1"
+ },
+ "dependencies": {
+ "env-paths": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
+ "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA="
+ }
}
},
"nopt": {
@@ -1054,25 +1061,6 @@
"wrappy": "1"
}
},
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
@@ -1163,9 +1151,9 @@
"dev": true
},
"psl": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz",
- "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag=="
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.1.tgz",
+ "integrity": "sha512-2KLd5fKOdAfShtY2d/8XDWVRnmp3zp40Qt6ge2zBPFARLXOGUf2fHD5eg+TV/5oxBtQKVhjUaKFsAaE4HnwfSA=="
},
"pump": {
"version": "3.0.0",
diff --git a/package.json b/package.json
index d6987f3d6..4830d142d 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,7 @@
"@nodegui/qode": "^1.0.4",
"cuid": "^2.1.6",
"node-addon-api": "^1.6.3",
- "node-gyp": "^4.0.0",
+ "node-gyp": "^5.0.3",
"postcss-nodegui-autoprefixer": "0.0.7"
},
"devDependencies": {
From 07a2da0278267cb81882f4c8e02a60cb9f39f648 Mon Sep 17 00:00:00 2001
From: soonoo
Date: Mon, 9 Sep 2019 18:44:01 +0900
Subject: [PATCH 23/49] add setPlaceholderText for QPlainTextEdit
---
.../QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp | 11 ++++++++++-
.../QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h | 1 +
src/lib/QtWidgets/QPlainTextEdit/index.ts | 6 ++++++
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp b/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp
index c8b7f6af8..93645f6b5 100644
--- a/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp
+++ b/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp
@@ -12,6 +12,7 @@ Napi::Object QPlainTextEditWrap::init(Napi::Env env, Napi::Object exports) {
char CLASSNAME[] = "QPlainTextEdit";
Napi::Function func = DefineClass(env, CLASSNAME, {
InstanceMethod("setPlainText",&QPlainTextEditWrap::setPlainText),
+ InstanceMethod("setPlaceholderText",&QPlainTextEditWrap::setPlaceholderText),
InstanceMethod("toPlainText",&QPlainTextEditWrap::toPlainText),
InstanceMethod("setReadOnly", &QPlainTextEditWrap::setReadOnly),
InstanceMethod("clear", &QPlainTextEditWrap::clear),
@@ -60,6 +61,14 @@ Napi::Value QPlainTextEditWrap::setPlainText(const Napi::CallbackInfo& info){
return env.Null();
}
+Napi::Value QPlainTextEditWrap::setPlaceholderText(const Napi::CallbackInfo& info){
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ Napi::String text = info[0].As();
+ this->instance->setPlaceholderText(text.Utf8Value().c_str());
+ return env.Null();
+}
+
Napi::Value QPlainTextEditWrap::setReadOnly(const Napi::CallbackInfo &info)
{
Napi::Env env = info.Env();
@@ -110,4 +119,4 @@ Napi::Value QPlainTextEditWrap::lineWrapMode(const Napi::CallbackInfo &info){
Napi::HandleScope scope(env);
int value = static_cast(this->instance->lineWrapMode());
return Napi::Number::From(env, value);
-}
\ No newline at end of file
+}
diff --git a/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h b/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h
index 0081d327f..a451c8318 100644
--- a/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h
+++ b/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.h
@@ -20,6 +20,7 @@ class QPlainTextEditWrap : public Napi::ObjectWrap{
QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION
Napi::Value setPlainText(const Napi::CallbackInfo& info);
+ Napi::Value setPlaceholderText(const Napi::CallbackInfo& info);
Napi::Value toPlainText(const Napi::CallbackInfo &info);
Napi::Value setReadOnly(const Napi::CallbackInfo &info);
Napi::Value clear(const Napi::CallbackInfo &info);
diff --git a/src/lib/QtWidgets/QPlainTextEdit/index.ts b/src/lib/QtWidgets/QPlainTextEdit/index.ts
index a7d8c288c..007cdc515 100644
--- a/src/lib/QtWidgets/QPlainTextEdit/index.ts
+++ b/src/lib/QtWidgets/QPlainTextEdit/index.ts
@@ -23,6 +23,7 @@ export enum LineWrapMode {
}
export class QPlainTextEdit extends QAbstractScrollArea {
native: NativeElement;
+ placeholderText?: string;
constructor(parent?: NodeWidget) {
let native;
if (parent) {
@@ -35,6 +36,7 @@ export class QPlainTextEdit extends QAbstractScrollArea {
this.parent = parent;
// bind member functions
this.setPlainText.bind(this);
+ this.setPlaceholderText.bind(this);
this.toPlainText.bind(this);
this.setReadOnly.bind(this);
this.clear.bind(this);
@@ -47,6 +49,10 @@ export class QPlainTextEdit extends QAbstractScrollArea {
// react:✓
this.native.setPlainText(`${text}`);
}
+ setPlaceholderText(text: string) {
+ this.placeholderText = text;
+ this.native.setPlaceholderText(text);
+ }
toPlainText(): string {
// react:✓
return this.native.toPlainText();
From 90fe3ad33c3e11e32ae351d1bfec964b065a8673 Mon Sep 17 00:00:00 2001
From: soonoo
Date: Mon, 9 Sep 2019 18:46:29 +0900
Subject: [PATCH 24/49] add docs for QPlainTextEdit's setPlaceholderText method
---
docs/api/QPlainTextEdit.md | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/docs/api/QPlainTextEdit.md b/docs/api/QPlainTextEdit.md
index ad38ae488..688bc894a 100644
--- a/docs/api/QPlainTextEdit.md
+++ b/docs/api/QPlainTextEdit.md
@@ -28,6 +28,10 @@ QPlainTextEdit can access all the static methods defined in [NodeWidget](api/Nod
QPlainTextEdit can access all the instance properties defined in [NodeWidget](api/NodeWidget.md).
+#### `plainTextEdit.placeholderText`
+
+The placeholder text set on the plainTextEdit.
+
### Instance Methods
QPlainTextEdit can access all the instance methods defined in [NodeWidget](api/NodeWidget.md).
@@ -38,6 +42,12 @@ Sets the given text to the plainTextEdit. It calls the native method [QPlainText
- `text` string
+#### `plainTextEdit.setPlaceholderText(text)`
+
+Sets the given text to the plainTextEdit's placeholder.
+
+- `text` string
+
#### `plainTextEdit.toPlainText()`
Returns the text of the text edit as plain text. [QPlainTextEdit: toPlainText](https://doc.qt.io/qt-5/qplaintextedit.html#toPlainText).
From 0ffddcba161c8f9b0de381547b4d1316cf069757 Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Mon, 9 Sep 2019 16:20:53 +0000
Subject: [PATCH 25/49] docs: update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 72f6d34a0..a189210cf 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# NodeGUI
[](https://spectrum.chat/nodegui)
-[](#contributors)
+[](#contributors)
Build **performant**, **native** and **cross-platform** desktop applications with **JavaScript** + powerful **CSS like styling**.🚀
@@ -119,6 +119,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
 Átila Camurça Alves 📖 |
 James Hibbard 💻 |
+  Soonwoo Hong 💻 |
From ad8343e0519572f2bb6f342605b3ad1043fb6a7c Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Mon, 9 Sep 2019 16:20:54 +0000
Subject: [PATCH 26/49] docs: update .all-contributorsrc
---
.all-contributorsrc | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 0fba73f12..560c8737b 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -85,6 +85,15 @@
"contributions": [
"code"
]
+ },
+ {
+ "login": "soonoo",
+ "name": "Soonwoo Hong",
+ "avatar_url": "https://avatars2.githubusercontent.com/u/5436405?v=4",
+ "profile": "https://github.com/soonoo",
+ "contributions": [
+ "code"
+ ]
}
],
"contributorsPerLine": 7,
From 4499bf05a7a8be460321e87fade3b6b2dd27436a Mon Sep 17 00:00:00 2001
From: Atul R
Date: Tue, 10 Sep 2019 00:06:08 +0200
Subject: [PATCH 27/49] Adds take widget for scrollarea and adds geometry
getter for widgets
---
src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.cpp | 8 ++++++++
src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.h | 1 +
src/cpp/QtWidgets/QWidget/qwidget_macro.h | 12 ++++++++++++
src/lib/QtWidgets/QScrollArea/index.ts | 13 ++++++++++++-
src/lib/QtWidgets/QWidget/index.ts | 11 ++++++++++-
5 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.cpp b/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.cpp
index 5e7d330ca..2f6e5f910 100644
--- a/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.cpp
+++ b/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.cpp
@@ -46,4 +46,12 @@ Napi::Value QScrollAreaWrap::setWidget(const Napi::CallbackInfo& info) {
QWidgetWrap* contentWidgetWrap = Napi::ObjectWrap::Unwrap(contentWidget);
this->instance->setWidget(contentWidgetWrap->getInternalInstance());
return env.Null();
+}
+
+Napi::Value QScrollAreaWrap::takeWidget(const Napi::CallbackInfo& info) {
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+ this->instance->takeWidget();
+ // We will not return the value here since we are doing it in js side anyway
+ return env.Null();
}
\ No newline at end of file
diff --git a/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.h b/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.h
index a263962dc..26df980f9 100644
--- a/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.h
+++ b/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.h
@@ -17,6 +17,7 @@ class QScrollAreaWrap : public Napi::ObjectWrap{
static Napi::FunctionReference constructor;
//wrapped methods
Napi::Value setWidget(const Napi::CallbackInfo &info);
+ Napi::Value takeWidget(const Napi::CallbackInfo &info);
QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION
};
diff --git a/src/cpp/QtWidgets/QWidget/qwidget_macro.h b/src/cpp/QtWidgets/QWidget/qwidget_macro.h
index f0a8a3729..7e3ae6d7b 100644
--- a/src/cpp/QtWidgets/QWidget/qwidget_macro.h
+++ b/src/cpp/QtWidgets/QWidget/qwidget_macro.h
@@ -154,6 +154,17 @@ Napi::Value setGeometry(const Napi::CallbackInfo& info){ \
this->instance->setGeometry(x, y, width, height); \
return env.Null(); \
} \
+Napi::Value geometry(const Napi::CallbackInfo& info){ \
+ Napi::Env env = info.Env(); \
+ Napi::HandleScope scope(env); \
+ QRect geometry = this->instance->geometry(); \
+ Napi::Object geometryObj = Napi::Object::New(env); \
+ geometryObj.Set("width", geometry.width()); \
+ geometryObj.Set("height", geometry.height()); \
+ geometryObj.Set("x", geometry.x()); \
+ geometryObj.Set("y", geometry.y()); \
+ return geometryObj; \
+} \
Napi::Value setMaximumSize(const Napi::CallbackInfo& info){ \
Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
@@ -263,6 +274,7 @@ Napi::Value setWindowFlag(const Napi::CallbackInfo& info){ \
InstanceMethod("setEnabled",&WidgetWrapName::setEnabled), \
InstanceMethod("setFixedSize",&WidgetWrapName::setFixedSize), \
InstanceMethod("setGeometry",&WidgetWrapName::setGeometry), \
+ InstanceMethod("geometry",&WidgetWrapName::geometry), \
InstanceMethod("setMaximumSize",&WidgetWrapName::setMaximumSize), \
InstanceMethod("setMinimumSize",&WidgetWrapName::setMinimumSize), \
InstanceMethod("repaint",&WidgetWrapName::repaint), \
diff --git a/src/lib/QtWidgets/QScrollArea/index.ts b/src/lib/QtWidgets/QScrollArea/index.ts
index 1324f1caf..8ad3090cc 100644
--- a/src/lib/QtWidgets/QScrollArea/index.ts
+++ b/src/lib/QtWidgets/QScrollArea/index.ts
@@ -9,7 +9,7 @@ export const QScrollAreaEvents = Object.freeze({
});
export class QScrollArea extends QAbstractScrollArea {
native: NativeElement;
- contentWidget?: NodeWidget;
+ contentWidget?: NodeWidget | null;
constructor(parent?: NodeWidget) {
let native;
if (parent) {
@@ -21,9 +21,20 @@ export class QScrollArea extends QAbstractScrollArea {
this.native = native;
this.parent = parent;
// bind member functions
+ this.setWidget.bind(this);
+ this.takeWidget.bind(this);
}
setWidget(widget: NodeWidget) {
this.contentWidget = widget;
this.native.setWidget(widget.native);
}
+ takeWidget(): NodeWidget | null {
+ const contentWidget = this.contentWidget;
+ this.contentWidget = null;
+ if (contentWidget) {
+ this.native.takeWidget();
+ return contentWidget;
+ }
+ return null;
+ }
}
diff --git a/src/lib/QtWidgets/QWidget/index.ts b/src/lib/QtWidgets/QWidget/index.ts
index 7349cea40..f4a75c2f9 100644
--- a/src/lib/QtWidgets/QWidget/index.ts
+++ b/src/lib/QtWidgets/QWidget/index.ts
@@ -45,9 +45,12 @@ export abstract class NodeWidget extends EventWidget {
await applyStyleSheet(this, preparedSheet);
};
setGeometry = (x: number, y: number, w: number, h: number) => {
- // react:✓, //TODO:getter
+ // react:✓
this.native.setGeometry(x, y, w, h);
};
+ geometry = (): Rect => {
+ return this.native.geometry();
+ };
setObjectName = (objectName: string) => {
// react:✓
this.native.setObjectName(objectName);
@@ -148,6 +151,12 @@ export abstract class NodeWidget extends EventWidget {
};
}
+type Rect = {
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+};
type arg = NodeWidget | NativeElement;
export class QWidget extends NodeWidget {
From 4cc0ab1eef37f0c5cc4cad47e6bdb36caa5f819d Mon Sep 17 00:00:00 2001
From: Atul R
Date: Wed, 11 Sep 2019 22:30:10 +0200
Subject: [PATCH 28/49] Adds bootstrap example
---
src/demo.ts | 1 +
src/index.ts | 2 ++
src/lib/core/Style/StyleSheet.ts | 6 ++----
src/lib/core/bootstrap.ts | 26 ++++++++++++++++++++++++++
4 files changed, 31 insertions(+), 4 deletions(-)
create mode 100644 src/lib/core/bootstrap.ts
diff --git a/src/demo.ts b/src/demo.ts
index aa79bd563..6d548407a 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -52,6 +52,7 @@ button.addEventListener("clicked", () => {
if (rootView.layout) {
(rootView.layout as FlexLayout).removeWidget(dial);
}
+ label.setInlineStyle("color:blue;");
});
const nodeguiLogo = new QIcon(
diff --git a/src/index.ts b/src/index.ts
index 2dba519f1..7acd8a56f 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,3 +1,5 @@
+// bootstrap
+import "./lib/core/bootstrap";
// Enums:
export * from "./lib/QtEnums";
// Gui:
diff --git a/src/lib/core/Style/StyleSheet.ts b/src/lib/core/Style/StyleSheet.ts
index 17ee60168..af070849e 100644
--- a/src/lib/core/Style/StyleSheet.ts
+++ b/src/lib/core/Style/StyleSheet.ts
@@ -19,7 +19,7 @@ export const prepareInlineStyleSheet = async (
rawStyle: string
) => {
const inlineStyle = await StyleSheet.create(rawStyle);
- // Make sure to not calculate ObjectName is the same pass of event loop as other props (incase of react) since the order will matter in that case
+ // Make sure to not calculate ObjectName in the same pass of event loop as other props (incase of react) since the order will matter in that case
// So doing it in multiple passes of event loop allows objectName to be set before using it. The above await solves it.
let cssId = widget.objectName();
if (!cssId) {
@@ -38,7 +38,5 @@ export const applyStyleSheet = async (
styleSheet: string
) => {
widget.native.setStyleSheet(styleSheet);
- setTimeout(() => {
- widget.layout ? widget.layout.update() : widget.update();
- }, 20);
+ widget.layout ? widget.layout.update() : widget.update();
};
diff --git a/src/lib/core/bootstrap.ts b/src/lib/core/bootstrap.ts
new file mode 100644
index 000000000..6ce6a9637
--- /dev/null
+++ b/src/lib/core/bootstrap.ts
@@ -0,0 +1,26 @@
+/*
+ From: https://github.com/yue/yode/blob/master/src/bootstrap.js
+ setImmediate and process.nextTick makes use of uv_check and uv_prepare to
+ run the callbacks, however since we only run uv loop on requests, the
+ callbacks wouldn't be called until something else activated the uv loop,
+ which would delay the callbacks for arbitrary long time. So we should
+ initiatively activate the uv loop once setImmediate and process.nextTick is
+ called.
+ This is required inorder to make the timers work nicely due to merger of event loops
+*/
+function wrapWithActivateUvLoop(func: any) {
+ return function() {
+ (process as any).activateUvLoop();
+ //@ts-ignore
+ return func.apply(this, arguments);
+ };
+}
+
+const main = () => {
+ process.nextTick = wrapWithActivateUvLoop(process.nextTick);
+ global.setImmediate = wrapWithActivateUvLoop(global.setImmediate);
+ global.setTimeout = wrapWithActivateUvLoop(global.setTimeout);
+ global.setInterval = wrapWithActivateUvLoop(global.setInterval);
+};
+
+main();
From bc84346bf56f0bb8a7ca0548e5679e56d8febcf2 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Wed, 11 Sep 2019 22:38:59 +0200
Subject: [PATCH 29/49] bumps nodegui and qode version
---
package-lock.json | 8 ++++----
package.json | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index fc14e1d8a..16d2aa1c8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,13 +1,13 @@
{
"name": "@nodegui/nodegui",
- "version": "0.1.8",
+ "version": "0.1.9",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@nodegui/qode": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@nodegui/qode/-/qode-1.0.4.tgz",
- "integrity": "sha512-CEEAI1mJ+4eH6G2OlNtn75vUxTBw/06IcEkXlwkDMI/mU5iE52WHToybYba77gOeoxrGx3uIwkfWRV2LRVyp/Q==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@nodegui/qode/-/qode-1.0.5.tgz",
+ "integrity": "sha512-JKb4JcC03VCdodmiL35VfznsCKHpiKOYbtgf9+KTHhH5p7IXvr+0k/LIq112T6Rpxd5zXa1pbsnfa2F8ReyWEg==",
"requires": {
"env-paths": "^2.2.0",
"extract-zip": "^1.6.7",
diff --git a/package.json b/package.json
index 4830d142d..2a9dc432f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@nodegui/nodegui",
- "version": "0.1.8",
+ "version": "0.1.9",
"description": "A cross platform library to build native desktop apps.",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
@@ -26,7 +26,7 @@
"docs": "serve docs"
},
"dependencies": {
- "@nodegui/qode": "^1.0.4",
+ "@nodegui/qode": "^1.0.5",
"cuid": "^2.1.6",
"node-addon-api": "^1.6.3",
"node-gyp": "^5.0.3",
From e372f750bd9a33b378d99a9ebadc4b2d4f19b71d Mon Sep 17 00:00:00 2001
From: Atul R
Date: Wed, 11 Sep 2019 23:05:54 +0200
Subject: [PATCH 30/49] updated annotations
---
src/lib/QtWidgets/QMainWindow/index.ts | 1 +
src/lib/QtWidgets/QPlainTextEdit/index.ts | 1 +
src/lib/QtWidgets/QPushButton/index.ts | 6 +++---
src/lib/QtWidgets/QScrollArea/index.ts | 2 ++
src/lib/QtWidgets/QWidget/index.ts | 1 +
5 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/lib/QtWidgets/QMainWindow/index.ts b/src/lib/QtWidgets/QMainWindow/index.ts
index fdc9b889f..34e36d51f 100644
--- a/src/lib/QtWidgets/QMainWindow/index.ts
+++ b/src/lib/QtWidgets/QMainWindow/index.ts
@@ -32,6 +32,7 @@ export class QMainWindow extends NodeWidget {
};
}
setCentralWidget(widget: NodeWidget) {
+ // react:✓
this.native.setCentralWidget(widget.native, widget.getFlexNode());
this.centralWidget = widget;
}
diff --git a/src/lib/QtWidgets/QPlainTextEdit/index.ts b/src/lib/QtWidgets/QPlainTextEdit/index.ts
index 007cdc515..65f2d9e57 100644
--- a/src/lib/QtWidgets/QPlainTextEdit/index.ts
+++ b/src/lib/QtWidgets/QPlainTextEdit/index.ts
@@ -50,6 +50,7 @@ export class QPlainTextEdit extends QAbstractScrollArea {
this.native.setPlainText(`${text}`);
}
setPlaceholderText(text: string) {
+ // react:✓, //TODO:getter
this.placeholderText = text;
this.native.setPlaceholderText(text);
}
diff --git a/src/lib/QtWidgets/QPushButton/index.ts b/src/lib/QtWidgets/QPushButton/index.ts
index 4145c70d9..926aeeabd 100644
--- a/src/lib/QtWidgets/QPushButton/index.ts
+++ b/src/lib/QtWidgets/QPushButton/index.ts
@@ -28,16 +28,16 @@ export class QPushButton extends NodeWidget {
this.setText.bind(this);
this.setFlat.bind(this);
}
-
setText(text: string | number) {
+ // react:✓, //TODO:getter
this.native.setText(`${text}`);
}
-
setFlat(isFlat: boolean) {
+ // react:✓, //TODO:getter
this.native.setFlat(isFlat);
}
-
setIcon(icon: QIcon) {
+ // react:✓, //TODO:getter
this.native.setIcon(icon.native);
}
}
diff --git a/src/lib/QtWidgets/QScrollArea/index.ts b/src/lib/QtWidgets/QScrollArea/index.ts
index 8ad3090cc..0859b366c 100644
--- a/src/lib/QtWidgets/QScrollArea/index.ts
+++ b/src/lib/QtWidgets/QScrollArea/index.ts
@@ -25,10 +25,12 @@ export class QScrollArea extends QAbstractScrollArea {
this.takeWidget.bind(this);
}
setWidget(widget: NodeWidget) {
+ // react:✓, //TODO:getter
this.contentWidget = widget;
this.native.setWidget(widget.native);
}
takeWidget(): NodeWidget | null {
+ // react:✓
const contentWidget = this.contentWidget;
this.contentWidget = null;
if (contentWidget) {
diff --git a/src/lib/QtWidgets/QWidget/index.ts b/src/lib/QtWidgets/QWidget/index.ts
index f4a75c2f9..48caf7163 100644
--- a/src/lib/QtWidgets/QWidget/index.ts
+++ b/src/lib/QtWidgets/QWidget/index.ts
@@ -49,6 +49,7 @@ export abstract class NodeWidget extends EventWidget {
this.native.setGeometry(x, y, w, h);
};
geometry = (): Rect => {
+ // react:✓
return this.native.geometry();
};
setObjectName = (objectName: string) => {
From 0444c087e467a1c4fdd6d239e40e8d256727af65 Mon Sep 17 00:00:00 2001
From: Roy Sommer
Date: Thu, 12 Sep 2019 11:47:40 +0300
Subject: [PATCH 31/49] added support for QCheckBoxEvents.toggled
---
src/cpp/QtWidgets/QCheckBox/ncheckbox.h | 9 +++++++++
src/demo.ts | 4 ++++
src/lib/QtWidgets/QCheckBox/index.ts | 3 ++-
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/cpp/QtWidgets/QCheckBox/ncheckbox.h b/src/cpp/QtWidgets/QCheckBox/ncheckbox.h
index e9e660c5b..8ed6054d5 100644
--- a/src/cpp/QtWidgets/QCheckBox/ncheckbox.h
+++ b/src/cpp/QtWidgets/QCheckBox/ncheckbox.h
@@ -2,12 +2,21 @@
#include
#include "src/cpp/core/NodeWidget/nodewidget.h"
+#include "napi.h"
class NCheckBox: public QCheckBox, public NodeWidget
{
NODEWIDGET_IMPLEMENTATIONS(QCheckBox)
public:
using QCheckBox::QCheckBox; //inherit all constructors of QCheckBox
+
+ void connectWidgetSignalsToEventEmitter() {
+ QObject::connect(this, &QCheckBox::toggled, [=](bool checked) {
+ Napi::Env env = this->emitOnNode.Env();
+ Napi::HandleScope scope(env);
+ this->emitOnNode.Call({ Napi::String::New(env, "toggled"), Napi::Value::From(env, checked) });
+ });
+ }
};
diff --git a/src/demo.ts b/src/demo.ts
index 6d548407a..7fdfec7f6 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -19,6 +19,7 @@ import {
QApplication,
QClipboardMode
} from "./index";
+import { QCheckBoxEvents } from './lib/QtWidgets/QCheckBox';
const path = require("path");
@@ -33,6 +34,9 @@ const checkbox = new QCheckBox();
checkbox.setText("Check me out?");
checkbox.setObjectName("check");
checkbox.setChecked(true);
+checkbox.addEventListener(QCheckBoxEvents.toggled, () => {
+ console.log('checkbox was toggled!');
+})
const dial = new QDial();
checkbox.setObjectName("dial");
diff --git a/src/lib/QtWidgets/QCheckBox/index.ts b/src/lib/QtWidgets/QCheckBox/index.ts
index 7d739c06d..29b6b8127 100644
--- a/src/lib/QtWidgets/QCheckBox/index.ts
+++ b/src/lib/QtWidgets/QCheckBox/index.ts
@@ -4,7 +4,8 @@ import { BaseWidgetEvents } from "../../core/EventWidget";
import { NativeElement } from "../../core/Component";
export const QCheckBoxEvents = Object.freeze({
- ...BaseWidgetEvents
+ ...BaseWidgetEvents,
+ toggled: "toggled"
});
export class QCheckBox extends NodeWidget {
native: NativeElement;
From 34753e7c80937cc664d0eeac79fc8b0338f1b7b6 Mon Sep 17 00:00:00 2001
From: Roy Sommer
Date: Thu, 12 Sep 2019 11:51:40 +0300
Subject: [PATCH 32/49] updated imports in demo
---
src/demo.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/demo.ts b/src/demo.ts
index 7fdfec7f6..63d15d4d3 100644
--- a/src/demo.ts
+++ b/src/demo.ts
@@ -17,9 +17,9 @@ import {
WindowState,
QTextOptionWrapMode,
QApplication,
- QClipboardMode
+ QClipboardMode,
+ QCheckBoxEvents
} from "./index";
-import { QCheckBoxEvents } from './lib/QtWidgets/QCheckBox';
const path = require("path");
From 4c4f272d0e520aed5bdd214f11b5d38edb058824 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 12 Sep 2019 11:59:27 +0200
Subject: [PATCH 33/49] Create CNAME
---
docs/CNAME | 1 +
1 file changed, 1 insertion(+)
create mode 100644 docs/CNAME
diff --git a/docs/CNAME b/docs/CNAME
new file mode 100644
index 000000000..334ded21e
--- /dev/null
+++ b/docs/CNAME
@@ -0,0 +1 @@
+docs.nodegui.org
\ No newline at end of file
From 49ad0f765fb163cfc28d4a362c1fb9014f6b2b4f Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 12 Sep 2019 12:29:01 +0200
Subject: [PATCH 34/49] Update CNAME
---
docs/CNAME | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/CNAME b/docs/CNAME
index 334ded21e..063ef9d7d 100644
--- a/docs/CNAME
+++ b/docs/CNAME
@@ -1 +1 @@
-docs.nodegui.org
\ No newline at end of file
+nodegui.org
\ No newline at end of file
From 348fb4fcf0207a8a0488c4c6ee433f9f117b247a Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 12 Sep 2019 12:35:20 +0200
Subject: [PATCH 35/49] Delete CNAME
---
docs/CNAME | 1 -
1 file changed, 1 deletion(-)
delete mode 100644 docs/CNAME
diff --git a/docs/CNAME b/docs/CNAME
deleted file mode 100644
index 063ef9d7d..000000000
--- a/docs/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-nodegui.org
\ No newline at end of file
From c22c95a9639515c37ae314f33283f1a38b6afce3 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 12 Sep 2019 12:35:26 +0200
Subject: [PATCH 36/49] Create CNAME
---
docs/CNAME | 1 +
1 file changed, 1 insertion(+)
create mode 100644 docs/CNAME
diff --git a/docs/CNAME b/docs/CNAME
new file mode 100644
index 000000000..063ef9d7d
--- /dev/null
+++ b/docs/CNAME
@@ -0,0 +1 @@
+nodegui.org
\ No newline at end of file
From 2e7f96099de6561476c551f6f16b5ce710a5dd27 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 12 Sep 2019 12:39:16 +0200
Subject: [PATCH 37/49] Delete CNAME
---
docs/CNAME | 1 -
1 file changed, 1 deletion(-)
delete mode 100644 docs/CNAME
diff --git a/docs/CNAME b/docs/CNAME
deleted file mode 100644
index 063ef9d7d..000000000
--- a/docs/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-nodegui.org
\ No newline at end of file
From ec45eac7b60172d6b053087562ae97ec58d85729 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 12 Sep 2019 12:39:23 +0200
Subject: [PATCH 38/49] Create CNAME
---
docs/CNAME | 1 +
1 file changed, 1 insertion(+)
create mode 100644 docs/CNAME
diff --git a/docs/CNAME b/docs/CNAME
new file mode 100644
index 000000000..063ef9d7d
--- /dev/null
+++ b/docs/CNAME
@@ -0,0 +1 @@
+nodegui.org
\ No newline at end of file
From 494c965e8f5878c6d0a95206ffbc363b267ac480 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Thu, 12 Sep 2019 12:42:00 +0200
Subject: [PATCH 39/49] Update CNAME
---
docs/CNAME | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/CNAME b/docs/CNAME
index 063ef9d7d..334ded21e 100644
--- a/docs/CNAME
+++ b/docs/CNAME
@@ -1 +1 @@
-nodegui.org
\ No newline at end of file
+docs.nodegui.org
\ No newline at end of file
From 57dc25f9aa60d9567df1942c718b5a527c89ecae Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Fri, 13 Sep 2019 20:58:47 +0000
Subject: [PATCH 40/49] docs: update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index a189210cf..86c4d1a0a 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# NodeGUI
[](https://spectrum.chat/nodegui)
-[](#contributors)
+[](#contributors)
Build **performant**, **native** and **cross-platform** desktop applications with **JavaScript** + powerful **CSS like styling**.🚀
@@ -120,6 +120,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
 Átila Camurça Alves 📖 |
 James Hibbard 💻 |
 Soonwoo Hong 💻 |
+  Roy Sommer 💻 |
From 176daf7c6c9de2f0e4c1bcb7289efd274f2063ee Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Fri, 13 Sep 2019 20:58:48 +0000
Subject: [PATCH 41/49] docs: update .all-contributorsrc
---
.all-contributorsrc | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 560c8737b..f1f727440 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -94,6 +94,15 @@
"contributions": [
"code"
]
+ },
+ {
+ "login": "illBeRoy",
+ "name": "Roy Sommer",
+ "avatar_url": "https://avatars2.githubusercontent.com/u/6681893?v=4",
+ "profile": "https://github.com/illBeRoy",
+ "contributions": [
+ "code"
+ ]
}
],
"contributorsPerLine": 7,
From ab965947465bfdc608499285860e61b53a86359f Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Fri, 13 Sep 2019 20:59:27 +0000
Subject: [PATCH 42/49] docs: update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 86c4d1a0a..1c9a99f0f 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# NodeGUI
[](https://spectrum.chat/nodegui)
-[](#contributors)
+[](#contributors)
Build **performant**, **native** and **cross-platform** desktop applications with **JavaScript** + powerful **CSS like styling**.🚀
@@ -121,6 +121,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
 James Hibbard 💻 |
 Soonwoo Hong 💻 |
 Roy Sommer 💻 |
+  Paulo Coghi 🤔 |
From 10fe87e1af14d115a5c9931cfa37cabf09f48da8 Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Fri, 13 Sep 2019 20:59:28 +0000
Subject: [PATCH 43/49] docs: update .all-contributorsrc
---
.all-contributorsrc | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/.all-contributorsrc b/.all-contributorsrc
index f1f727440..801d7b0b9 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -103,6 +103,15 @@
"contributions": [
"code"
]
+ },
+ {
+ "login": "paulocoghi",
+ "name": "Paulo Coghi",
+ "avatar_url": "https://avatars1.githubusercontent.com/u/378397?v=4",
+ "profile": "https://github.com/paulocoghi",
+ "contributions": [
+ "ideas"
+ ]
}
],
"contributorsPerLine": 7,
From ec82a760edf56ac0677bacd39148cf04fceee52b Mon Sep 17 00:00:00 2001
From: Balthild
Date: Tue, 17 Sep 2019 11:34:08 +0800
Subject: [PATCH 44/49] Converting QIcon ot QPixmap
---
src/cpp/QtGui/QIcon/qicon_wrap.cpp | 29 +++++++++++++++++++++++++++++
src/cpp/QtGui/QIcon/qicon_wrap.h | 1 +
src/lib/QtGui/QIcon/index.ts | 20 ++++++++++++++++++++
3 files changed, 50 insertions(+)
diff --git a/src/cpp/QtGui/QIcon/qicon_wrap.cpp b/src/cpp/QtGui/QIcon/qicon_wrap.cpp
index 218a744de..10e7d614e 100644
--- a/src/cpp/QtGui/QIcon/qicon_wrap.cpp
+++ b/src/cpp/QtGui/QIcon/qicon_wrap.cpp
@@ -1,4 +1,5 @@
#include "qicon_wrap.h"
+#include "src/cpp/QtGui/QPixmap/qpixmap_wrap.h"
#include "src/cpp/Extras/Utils/nutils.h"
#include "deps/spdlog/spdlog.h"
@@ -9,6 +10,7 @@ Napi::Object QIconWrap::init(Napi::Env env, Napi::Object exports)
Napi::HandleScope scope(env);
char CLASSNAME[] = "QIcon";
Napi::Function func = DefineClass(env, CLASSNAME, {
+ InstanceMethod("pixmap", &QIconWrap::pixmap),
COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE
});
constructor = Napi::Persistent(func);
@@ -45,3 +47,30 @@ QIcon *QIconWrap::getInternalInstance()
{
return this->instance.get();
}
+
+Napi::Value QIconWrap::pixmap(const Napi::CallbackInfo& info)
+{
+ Napi::Env env = info.Env();
+ Napi::HandleScope scope(env);
+
+ Napi::Number widthValue = info[0].As();
+ Napi::Number heightValue = info[1].As();
+ int width = widthValue.Int32Value();
+ int height = heightValue.Int32Value();
+
+ QIcon::Mode mode = QIcon::Normal;
+ if (info.Length() > 2){
+ int modeInt = info[2].As().Int32Value();
+ mode = static_cast(modeInt);
+ }
+
+ QIcon::State state = QIcon::Off;
+ if (info.Length() > 3){
+ int stateInt = info[3].As().Int32Value();
+ state = static_cast(stateInt);
+ }
+
+ QPixmap* pixmap = new QPixmap(this->instance->pixmap(width, height, mode));
+ auto instance = QPixmapWrap::constructor.New({ Napi::External::New(env, pixmap) });
+ return instance;
+}
diff --git a/src/cpp/QtGui/QIcon/qicon_wrap.h b/src/cpp/QtGui/QIcon/qicon_wrap.h
index a4e9dd953..549a0e60c 100644
--- a/src/cpp/QtGui/QIcon/qicon_wrap.h
+++ b/src/cpp/QtGui/QIcon/qicon_wrap.h
@@ -17,4 +17,5 @@ public:
~QIconWrap();
QIcon *getInternalInstance();
// Wrapped methods
+ Napi::Value pixmap(const Napi::CallbackInfo& info);
};
diff --git a/src/lib/QtGui/QIcon/index.ts b/src/lib/QtGui/QIcon/index.ts
index 70c1de6a2..4405ec5dd 100644
--- a/src/lib/QtGui/QIcon/index.ts
+++ b/src/lib/QtGui/QIcon/index.ts
@@ -1,5 +1,9 @@
import addon from "../../core/addon";
import { Component, NativeElement } from "../../core/Component";
+import { QPixmap } from "../../QtGui/QPixmap";
+
+export enum QIconMode { Normal, Disabled, Active, Selected }
+export enum QIconState { Off, On }
type arg = string | NativeElement;
export class QIcon extends Component {
@@ -13,4 +17,20 @@ export class QIcon extends Component {
this.native = new addon.QIcon();
}
}
+ 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);
+ };
}
From ec5c560ca1396859f440f0cc009d0e808d891b2a Mon Sep 17 00:00:00 2001
From: Balthild
Date: Tue, 17 Sep 2019 11:37:36 +0800
Subject: [PATCH 45/49] Fix code format
---
src/cpp/QtGui/QIcon/qicon_wrap.cpp | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/cpp/QtGui/QIcon/qicon_wrap.cpp b/src/cpp/QtGui/QIcon/qicon_wrap.cpp
index 10e7d614e..d2a7642c5 100644
--- a/src/cpp/QtGui/QIcon/qicon_wrap.cpp
+++ b/src/cpp/QtGui/QIcon/qicon_wrap.cpp
@@ -59,15 +59,15 @@ Napi::Value QIconWrap::pixmap(const Napi::CallbackInfo& info)
int height = heightValue.Int32Value();
QIcon::Mode mode = QIcon::Normal;
- if (info.Length() > 2){
- int modeInt = info[2].As().Int32Value();
- mode = static_cast(modeInt);
+ if (info.Length() > 2) {
+ int modeInt = info[2].As().Int32Value();
+ mode = static_cast(modeInt);
}
QIcon::State state = QIcon::Off;
- if (info.Length() > 3){
- int stateInt = info[3].As().Int32Value();
- state = static_cast(stateInt);
+ if (info.Length() > 3) {
+ int stateInt = info[3].As().Int32Value();
+ state = static_cast(stateInt);
}
QPixmap* pixmap = new QPixmap(this->instance->pixmap(width, height, mode));
From fbb2b12d85aba4c43775b8cc6cedcb36a2b43276 Mon Sep 17 00:00:00 2001
From: Balthild
Date: Tue, 17 Sep 2019 14:58:16 +0800
Subject: [PATCH 46/49] Fix mode arg
---
src/cpp/QtGui/QIcon/qicon_wrap.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/cpp/QtGui/QIcon/qicon_wrap.cpp b/src/cpp/QtGui/QIcon/qicon_wrap.cpp
index d2a7642c5..5185c6768 100644
--- a/src/cpp/QtGui/QIcon/qicon_wrap.cpp
+++ b/src/cpp/QtGui/QIcon/qicon_wrap.cpp
@@ -70,7 +70,7 @@ Napi::Value QIconWrap::pixmap(const Napi::CallbackInfo& info)
state = static_cast(stateInt);
}
- QPixmap* pixmap = new QPixmap(this->instance->pixmap(width, height, mode));
+ QPixmap* pixmap = new QPixmap(this->instance->pixmap(width, height, mode, state));
auto instance = QPixmapWrap::constructor.New({ Napi::External::New(env, pixmap) });
return instance;
}
From 2795a5e9c46a9119b029d887349387740d26b40b Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Fri, 20 Sep 2019 21:04:39 +0000
Subject: [PATCH 47/49] docs: update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 1c9a99f0f..0ca4bb90e 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# NodeGUI
[](https://spectrum.chat/nodegui)
-[](#contributors)
+[](#contributors)
Build **performant**, **native** and **cross-platform** desktop applications with **JavaScript** + powerful **CSS like styling**.🚀
@@ -122,6 +122,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
 Soonwoo Hong 💻 |
 Roy Sommer 💻 |
 Paulo Coghi 🤔 |
+  Balthild Ires 💻 |
From 73b2f2d7cbc131d30e2e901b69aa88af5d848b94 Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Fri, 20 Sep 2019 21:04:40 +0000
Subject: [PATCH 48/49] docs: update .all-contributorsrc
---
.all-contributorsrc | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 801d7b0b9..fcb6d6c2e 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -112,6 +112,15 @@
"contributions": [
"ideas"
]
+ },
+ {
+ "login": "balthild",
+ "name": "Balthild Ires",
+ "avatar_url": "https://avatars2.githubusercontent.com/u/2662758?v=4",
+ "profile": "https://balthild.com",
+ "contributions": [
+ "code"
+ ]
}
],
"contributorsPerLine": 7,
From 2bcbb387787f9d41a99ec64a7ca6ddcb5993f009 Mon Sep 17 00:00:00 2001
From: Atul R
Date: Fri, 20 Sep 2019 23:18:02 +0200
Subject: [PATCH 49/49] Adds documentation and exports
---
docs/api/QIcon.md | 11 +++++++++++
src/index.ts | 2 +-
src/lib/QtGui/QIcon/index.ts | 14 +++++++++++---
3 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/docs/api/QIcon.md b/docs/api/QIcon.md
index 2a6cd1e08..11a88e226 100644
--- a/docs/api/QIcon.md
+++ b/docs/api/QIcon.md
@@ -30,3 +30,14 @@ QIcon can access all the instance properties defined in [Component](api/Componen
### Instance Methods
QIcon can access all the instance methods defined in [Component](api/Component.md)
+Additionally it also has the following instance methods:
+
+#### `icon.pixmap(width, height, mode?, state?)`
+
+Returns a pixmap with the requested size, mode, and state, generating one if necessary. The pixmap might be smaller than requested, but never larger.
+. It calls the native method [QIcon: pixmap](https://doc.qt.io/qt-5/qicon.html#pixmap-3).
+
+- `width`: number,
+- `height`: number
+- `mode?`: QIconMode
+- `state?`: QIconState
diff --git a/src/index.ts b/src/index.ts
index 7acd8a56f..a07bd0783 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -5,7 +5,7 @@ export * from "./lib/QtEnums";
// Gui:
export { QApplication } from "./lib/QtGui/QApplication";
export { QPixmap } from "./lib/QtGui/QPixmap";
-export { QIcon } from "./lib/QtGui/QIcon";
+export { QIcon, QIconMode, QIconState } from "./lib/QtGui/QIcon";
export { QCursor } from "./lib/QtGui/QCursor";
export { QTextOptionWrapMode } from "./lib/QtGui/QTextOption";
export { QClipboard, QClipboardMode } from "./lib/QtGui/QClipboard";
diff --git a/src/lib/QtGui/QIcon/index.ts b/src/lib/QtGui/QIcon/index.ts
index 4405ec5dd..b35fe6351 100644
--- a/src/lib/QtGui/QIcon/index.ts
+++ b/src/lib/QtGui/QIcon/index.ts
@@ -2,8 +2,16 @@ import addon from "../../core/addon";
import { Component, NativeElement } from "../../core/Component";
import { QPixmap } from "../../QtGui/QPixmap";
-export enum QIconMode { Normal, Disabled, Active, Selected }
-export enum QIconState { Off, On }
+export enum QIconMode {
+ Normal,
+ Disabled,
+ Active,
+ Selected
+}
+export enum QIconState {
+ Off,
+ On
+}
type arg = string | NativeElement;
export class QIcon extends Component {
@@ -21,7 +29,7 @@ export class QIcon extends Component {
width: number,
height: number,
mode?: QIconMode,
- state?: QIconState,
+ state?: QIconState
): QPixmap => {
let nativePixmap;
if (mode && state) {