Add QButtonGroup (#336)
* Added QButtonGroup * Update * Update * Update demo.ts * Updates Changed buttonClicked for QButtonGroup to return the id of the button and updated the demo. * Update QButtonGroup.ts * Format main.cpp * Fixes button qgroups Co-authored-by: Atul R <atulanand94@gmail.com>
This commit is contained in:
parent
616b5fd19b
commit
6b92bc5676
@ -98,6 +98,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTreeWidget/qtreewidget_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QMessageBox/qmessagebox_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QButtonGroup/qbuttongroup_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/core/FlexLayout/flexlayout_wrap.cpp"
|
||||
# Custom widgets (include them for automoc since they contain Q_OBJECT)
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtCore/QObject/nobject.hpp"
|
||||
@ -138,6 +139,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QGroupBox/ngroupbox.hpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTimeEdit/ntimeedit.hpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTreeWidget/ntreewidget.hpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QButtonGroup/nbuttongroup.hpp"
|
||||
|
||||
)
|
||||
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#include <QAbstractButton>
|
||||
#include <QButtonGroup>
|
||||
|
||||
#include "QtCore/QObject/qobject_macro.h"
|
||||
#include "core/NodeWidget/nodewidget.h"
|
||||
#include "napi.h"
|
||||
|
||||
class NButtonGroup : public QButtonGroup, public EventWidget {
|
||||
Q_OBJECT
|
||||
EVENTWIDGET_IMPLEMENTATIONS(QButtonGroup)
|
||||
public:
|
||||
using QButtonGroup::QButtonGroup; // inherit all constructors of QButtonGroup
|
||||
void connectSignalsToEventEmitter() {
|
||||
QOBJECT_SIGNALS
|
||||
// Qt Connects: Implement all signal connects here
|
||||
connect(this, QOverload<int>::of(&QButtonGroup::buttonClicked),
|
||||
[=](int id) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call({Napi::String::New(env, "buttonClicked"),
|
||||
Napi::Number::New(env, id)});
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
|
||||
#include <napi.h>
|
||||
|
||||
#include <QPointer>
|
||||
|
||||
#include "Extras/Utils/nutils.h"
|
||||
#include "QtCore/QObject/qobject_macro.h"
|
||||
#include "nbuttongroup.hpp"
|
||||
class QButtonGroupWrap : public Napi::ObjectWrap<QButtonGroupWrap> {
|
||||
private:
|
||||
QPointer<NButtonGroup> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QButtonGroupWrap(const Napi::CallbackInfo& info);
|
||||
~QButtonGroupWrap();
|
||||
NButtonGroup* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
Napi::Value addButton(const Napi::CallbackInfo& info);
|
||||
Napi::Value checkedId(const Napi::CallbackInfo& info);
|
||||
Napi::Value id(const Napi::CallbackInfo& info);
|
||||
Napi::Value button(const Napi::CallbackInfo& info);
|
||||
Napi::Value removeButton(const Napi::CallbackInfo& info);
|
||||
Napi::Value buttons(const Napi::CallbackInfo& info);
|
||||
Napi::Value setId(const Napi::CallbackInfo& info);
|
||||
Napi::Value checkedButton(const Napi::CallbackInfo& info);
|
||||
QOBJECT_WRAPPED_METHODS_DECLARATION
|
||||
};
|
||||
139
src/cpp/lib/QtWidgets/QButtonGroup/qbuttongroup_wrap.cpp
Normal file
139
src/cpp/lib/QtWidgets/QButtonGroup/qbuttongroup_wrap.cpp
Normal file
@ -0,0 +1,139 @@
|
||||
#include "QtWidgets/QButtonGroup/qbuttongroup_wrap.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QWidget>
|
||||
|
||||
#include "Extras/Utils/nutils.h"
|
||||
#include "QtCore/QObject/qobject_wrap.h"
|
||||
#include "QtGui/QIcon/qicon_wrap.h"
|
||||
#include "QtWidgets/QMenu/qmenu_wrap.h"
|
||||
#include "QtWidgets/QWidget/qwidget_wrap.h"
|
||||
|
||||
Napi::FunctionReference QButtonGroupWrap::constructor;
|
||||
|
||||
Napi::Object QButtonGroupWrap::init(Napi::Env env, Napi::Object exports) {
|
||||
Napi::HandleScope scope(env);
|
||||
char CLASSNAME[] = "QButtonGroup";
|
||||
Napi::Function func = DefineClass(
|
||||
env, CLASSNAME,
|
||||
{InstanceMethod("addButton", &QButtonGroupWrap::addButton),
|
||||
InstanceMethod("checkedId", &QButtonGroupWrap::checkedId),
|
||||
InstanceMethod("setId", &QButtonGroupWrap::setId),
|
||||
InstanceMethod("removeButton", &QButtonGroupWrap::removeButton),
|
||||
InstanceMethod("id", &QButtonGroupWrap::id),
|
||||
InstanceMethod("checkedButton", &QButtonGroupWrap::checkedButton),
|
||||
InstanceMethod("buttons", &QButtonGroupWrap::buttons),
|
||||
InstanceMethod("button", &QButtonGroupWrap::button),
|
||||
QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE(QButtonGroupWrap)});
|
||||
constructor = Napi::Persistent(func);
|
||||
exports.Set(CLASSNAME, func);
|
||||
return exports;
|
||||
}
|
||||
|
||||
NButtonGroup* QButtonGroupWrap::getInternalInstance() { return this->instance; }
|
||||
|
||||
QButtonGroupWrap::QButtonGroupWrap(const Napi::CallbackInfo& info)
|
||||
: Napi::ObjectWrap<QButtonGroupWrap>(info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
|
||||
if (info.Length() == 1) {
|
||||
Napi::Object parentObject = info[0].As<Napi::Object>();
|
||||
QWidgetWrap* parentWidgetWrap =
|
||||
Napi::ObjectWrap<QWidgetWrap>::Unwrap(parentObject);
|
||||
this->instance = new NButtonGroup(
|
||||
parentWidgetWrap
|
||||
->getInternalInstance()); // this sets the parent to current widget
|
||||
} else if (info.Length() == 0) {
|
||||
this->instance = new NButtonGroup();
|
||||
} else {
|
||||
Napi::TypeError::New(env, "Wrong number of arguments")
|
||||
.ThrowAsJavaScriptException();
|
||||
}
|
||||
this->rawData = extrautils::configureQObject(this->getInternalInstance());
|
||||
}
|
||||
|
||||
QButtonGroupWrap::~QButtonGroupWrap() {
|
||||
extrautils::safeDelete(this->instance);
|
||||
}
|
||||
|
||||
Napi::Value QButtonGroupWrap::addButton(const Napi::CallbackInfo& info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
Napi::Object buttonObject = info[0].As<Napi::Object>();
|
||||
QObjectWrap* objectWrap = Napi::ObjectWrap<QObjectWrap>::Unwrap(buttonObject);
|
||||
QAbstractButton* button =
|
||||
qobject_cast<QAbstractButton*>(objectWrap->getInternalInstance());
|
||||
Napi::Number id = info[1].As<Napi::Number>();
|
||||
|
||||
this->instance->addButton(button, id.Int32Value());
|
||||
return env.Null();
|
||||
}
|
||||
Napi::Value QButtonGroupWrap::removeButton(const Napi::CallbackInfo& info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
Napi::Object buttonObject = info[0].As<Napi::Object>();
|
||||
QObjectWrap* objectWrap = Napi::ObjectWrap<QObjectWrap>::Unwrap(buttonObject);
|
||||
QAbstractButton* button =
|
||||
qobject_cast<QAbstractButton*>(objectWrap->getInternalInstance());
|
||||
this->instance->removeButton(button);
|
||||
return env.Null();
|
||||
}
|
||||
Napi::Value QButtonGroupWrap::checkedId(const Napi::CallbackInfo& info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
int value = static_cast<int>(this->instance->checkedId());
|
||||
return Napi::Number::From(env, value);
|
||||
}
|
||||
Napi::Value QButtonGroupWrap::checkedButton(const Napi::CallbackInfo& info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
auto value = Napi::External<QAbstractButton>::New(
|
||||
env, this->instance->checkedButton());
|
||||
return Napi::Value::From(env, value);
|
||||
}
|
||||
Napi::Value QButtonGroupWrap::id(const Napi::CallbackInfo& info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
Napi::Object buttonObject = info[0].As<Napi::Object>();
|
||||
QObjectWrap* objectWrap = Napi::ObjectWrap<QObjectWrap>::Unwrap(buttonObject);
|
||||
QAbstractButton* button =
|
||||
qobject_cast<QAbstractButton*>(objectWrap->getInternalInstance());
|
||||
int value = static_cast<int>(this->instance->id(button));
|
||||
return Napi::Number::From(env, value);
|
||||
}
|
||||
Napi::Value QButtonGroupWrap::setId(const Napi::CallbackInfo& info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
Napi::Object buttonObject = info[0].As<Napi::Object>();
|
||||
QObjectWrap* objectWrap = Napi::ObjectWrap<QObjectWrap>::Unwrap(buttonObject);
|
||||
QAbstractButton* button =
|
||||
qobject_cast<QAbstractButton*>(objectWrap->getInternalInstance());
|
||||
Napi::Number id = info[1].As<Napi::Number>();
|
||||
|
||||
this->instance->setId(button, id.Int32Value());
|
||||
return env.Null();
|
||||
}
|
||||
Napi::Value QButtonGroupWrap::buttons(const Napi::CallbackInfo& info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
|
||||
QList<QAbstractButton*> items = this->instance->buttons();
|
||||
Napi::Array napiItems = Napi::Array::New(env, items.size());
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
QAbstractButton* item = items[i];
|
||||
auto value = Napi::External<QAbstractButton>::New(env, item);
|
||||
napiItems[i] = value;
|
||||
}
|
||||
|
||||
return napiItems;
|
||||
}
|
||||
Napi::Value QButtonGroupWrap::button(const Napi::CallbackInfo& info) {
|
||||
Napi::Env env = info.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
Napi::Number id = info[0].As<Napi::Number>();
|
||||
|
||||
auto value =
|
||||
Napi::External<QAbstractButton>::New(env, this->instance->button(id));
|
||||
return Napi::Value::From(env, value);
|
||||
}
|
||||
@ -26,6 +26,7 @@
|
||||
#include "QtGui/QStyle/qstyle_wrap.h"
|
||||
#include "QtWidgets/QAction/qaction_wrap.h"
|
||||
#include "QtWidgets/QBoxLayout/qboxlayout_wrap.h"
|
||||
#include "QtWidgets/QButtonGroup/qbuttongroup_wrap.h"
|
||||
#include "QtWidgets/QCalendarWidget/qcalendarwidget_wrap.h"
|
||||
#include "QtWidgets/QCheckBox/qcheckbox_wrap.h"
|
||||
#include "QtWidgets/QComboBox/qcombobox_wrap.h"
|
||||
@ -135,6 +136,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) {
|
||||
QMenuBarWrap::init(env, exports);
|
||||
QMessageBoxWrap::init(env, exports);
|
||||
QTimeEditWrap::init(env, exports);
|
||||
QButtonGroupWrap::init(env, exports);
|
||||
return exports;
|
||||
}
|
||||
|
||||
|
||||
61
src/demo.ts
61
src/demo.ts
@ -1,54 +1,25 @@
|
||||
import { FlexLayout, QMainWindow, QWidget } from './index';
|
||||
import { QLabel } from './lib/QtWidgets/QLabel';
|
||||
import { QFont, QFontCapitalization } from './lib/QtGui/QFont';
|
||||
import { QPushButton } from './lib/QtWidgets/QPushButton';
|
||||
import { QDateTimeEdit } from './lib/QtWidgets/QDateTimeEdit';
|
||||
import { QCalendarWidget } from './lib/QtWidgets/QCalendarWidget';
|
||||
import { QDate } from './lib/QtCore/QDate';
|
||||
import { QDateTime } from './lib/QtCore/QDateTime';
|
||||
import { QTime } from './lib/QtCore/QTime';
|
||||
import { QWidget, QMainWindow, FlexLayout, QRadioButton, QButtonGroup } from './index';
|
||||
|
||||
const win = new QMainWindow();
|
||||
const center = new QWidget();
|
||||
const layout = new FlexLayout();
|
||||
center.setLayout(layout);
|
||||
const label = new QLabel();
|
||||
const font = new QFont('Mono', 14);
|
||||
label.setFont(font);
|
||||
label.setText('label 1');
|
||||
const btn = new QPushButton();
|
||||
btn.setText('Change font');
|
||||
btn.setFont(new QFont('Helvetica', 20));
|
||||
btn.addEventListener('clicked', () => {
|
||||
const font2 = label.font();
|
||||
font2.setCapitalization(QFontCapitalization.AllUppercase);
|
||||
font2.setItalic(true);
|
||||
font2.setFamily('Times');
|
||||
console.log('point', font2.pointSize());
|
||||
label.setFont(font2);
|
||||
});
|
||||
const dtEdit = new QDateTimeEdit();
|
||||
const calendar = new QCalendarWidget();
|
||||
const date = QDate.currentDate();
|
||||
const time = QTime.currentTime();
|
||||
const datetime = QDateTime.currentDateTime();
|
||||
const strDate = date.toString('dd.MM.yyyy');
|
||||
const strTime = time.toString('hh:mm:ss.zzz');
|
||||
const strDt = datetime.toString('dd.MM.yyyy hh:mm:ss.zzz');
|
||||
console.log(strDate);
|
||||
console.log(strTime);
|
||||
console.log(strDt);
|
||||
dtEdit.setDate(date);
|
||||
dtEdit.setTime(time);
|
||||
dtEdit.setCalendarPopup(true);
|
||||
dtEdit.setCalendarWidget(calendar);
|
||||
|
||||
layout.addWidget(label);
|
||||
layout.addWidget(btn);
|
||||
layout.addWidget(dtEdit);
|
||||
|
||||
win.setCentralWidget(center);
|
||||
win.resize(400, 400);
|
||||
|
||||
const buttonGroup = new QButtonGroup(center);
|
||||
const t: any[] = [];
|
||||
for (let i = 0; i < 4; i++) {
|
||||
const radioButton = new QRadioButton();
|
||||
radioButton.setText('Button #' + (i + 1));
|
||||
center.layout?.addWidget(radioButton);
|
||||
t.push(radioButton);
|
||||
buttonGroup.addButton(radioButton, i);
|
||||
}
|
||||
win.show();
|
||||
buttonGroup.addEventListener('buttonClicked', (id: number) => {
|
||||
console.log('Button #' + (id + 1) + ' clicked!');
|
||||
buttonGroup.removeButton(t[0]);
|
||||
});
|
||||
(global as any).win = win;
|
||||
|
||||
setInterval(() => null, 1000);
|
||||
|
||||
@ -58,6 +58,7 @@ export { QTreeWidgetItem } from './lib/QtWidgets/QTreeWidgetItem';
|
||||
export { QPainter, RenderHint } from './lib/QtWidgets/QPainter';
|
||||
export { QDialog, QDialogSignals } from './lib/QtWidgets/QDialog';
|
||||
export { QMessageBox, StandardButton, Icon, ButtonRole } from './lib/QtWidgets/QMessageBox';
|
||||
export { QButtonGroup, QButtonGroupSignals } from './lib/QtWidgets/QButtonGroup';
|
||||
|
||||
export {
|
||||
QSystemTrayIcon,
|
||||
|
||||
58
src/lib/QtWidgets/QButtonGroup.ts
Normal file
58
src/lib/QtWidgets/QButtonGroup.ts
Normal file
@ -0,0 +1,58 @@
|
||||
import addon from '../utils/addon';
|
||||
import { NodeWidget } from './QWidget';
|
||||
import { NativeElement, NativeRawPointer } from '../core/Component';
|
||||
import { NodeObject, QObjectSignals } from '../QtCore/QObject';
|
||||
import { QAbstractButton, QAbstractButtonSignals } from './QAbstractButton';
|
||||
|
||||
export interface QButtonGroupSignals extends QObjectSignals {
|
||||
buttonClicked: (id?: number) => void;
|
||||
}
|
||||
|
||||
export class QButtonGroup extends NodeObject<any> {
|
||||
native: NativeElement;
|
||||
constructor();
|
||||
constructor(parent: NodeWidget<any>);
|
||||
constructor(parent?: NodeWidget<any>) {
|
||||
let native;
|
||||
if (parent) {
|
||||
native = new addon.QButtonGroup(parent.native);
|
||||
} else {
|
||||
native = new addon.QButtonGroup();
|
||||
}
|
||||
super(native);
|
||||
this.native = native;
|
||||
parent && parent.nodeChildren.add(this);
|
||||
}
|
||||
addButton(button: QAbstractButton<QAbstractButtonSignals>, id = -1): void {
|
||||
this.native.addButton(button.native, id);
|
||||
this.nodeChildren.add(button);
|
||||
}
|
||||
removeButton(button: QAbstractButton<QAbstractButtonSignals>): void {
|
||||
this.native.removeButton(button.native);
|
||||
this.nodeChildren.delete(button);
|
||||
}
|
||||
setExclusive(exculsive: boolean): void {
|
||||
this.native.setProperty('exclusive', exculsive);
|
||||
}
|
||||
checkedId(): number {
|
||||
return this.native.checkedId();
|
||||
}
|
||||
exclusive(): boolean {
|
||||
return this.property('exclusive').toBool();
|
||||
}
|
||||
setId(button: QAbstractButton<QAbstractButtonSignals>, id: number): void {
|
||||
this.native.setId(button.native, id);
|
||||
}
|
||||
id(button: QAbstractButton<QAbstractButtonSignals>): number {
|
||||
return this.native.id(button.native);
|
||||
}
|
||||
buttons(): QAbstractButton<QAbstractButtonSignals>[] {
|
||||
return this.native.buttons();
|
||||
}
|
||||
checkedButton(): NativeRawPointer<'QAbstractButton*'> {
|
||||
return this.native.checkedButton();
|
||||
}
|
||||
button(id: number): NativeRawPointer<'QAbstractButton*'> {
|
||||
return this.native.button(id);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user