From 6ddc6167e2979918714305dff569dbcefdcec956 Mon Sep 17 00:00:00 2001 From: Atul R Date: Sat, 8 Jun 2019 18:14:19 +0200 Subject: [PATCH] Abstracted away the logic for event listeners from JS side --- src/lib/QtGui/QWidget/index.ts | 2 +- src/lib/QtWidgets/QLayout/index.ts | 2 +- src/lib/QtWidgets/QPushButton/index.ts | 21 ++++++++------------- src/lib/core/Component/index.ts | 2 +- src/lib/core/EventNodeWidget/index.ts | 19 +++++++++++++++++++ 5 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 src/lib/core/EventNodeWidget/index.ts diff --git a/src/lib/QtGui/QWidget/index.ts b/src/lib/QtGui/QWidget/index.ts index 4033c339a..e5e856fc5 100644 --- a/src/lib/QtGui/QWidget/index.ts +++ b/src/lib/QtGui/QWidget/index.ts @@ -2,8 +2,8 @@ import addon from "../../core/addon"; import { YogaWidget } from "../../core/YogaWidget"; import { NodeLayout } from "../../QtWidgets/QLayout"; -// Implement all native QWidget methods here so that all widgets get access to those aswell // All Widgets should extend from NodeWidget +// Implement all native QWidget methods here so that all widgets get access to those aswell export abstract class NodeWidget extends YogaWidget { type = "widget"; layout?: NodeLayout; diff --git a/src/lib/QtWidgets/QLayout/index.ts b/src/lib/QtWidgets/QLayout/index.ts index bc00f9d12..bb13efe92 100644 --- a/src/lib/QtWidgets/QLayout/index.ts +++ b/src/lib/QtWidgets/QLayout/index.ts @@ -2,7 +2,7 @@ import { Component } from "../../core/Component"; // All Layouts should extend this abstract class. export abstract class NodeLayout extends Component { - type: string = "Layout"; + type: string = "layout"; } // export class QLayout extends NodeLayout { //Dont need QLayout for now diff --git a/src/lib/QtWidgets/QPushButton/index.ts b/src/lib/QtWidgets/QPushButton/index.ts index e206752ec..0605fefee 100644 --- a/src/lib/QtWidgets/QPushButton/index.ts +++ b/src/lib/QtWidgets/QPushButton/index.ts @@ -1,6 +1,6 @@ import addon from "../../core/addon"; import { NodeWidget } from "../../QtGui/QWidget"; -import { EventEmitter } from "events"; +import { EventNodeWidget } from "../../core/EventNodeWidget"; export enum QPushButtonEvents { clicked = "clicked", @@ -9,26 +9,21 @@ export enum QPushButtonEvents { toggled = "toggled" } -type EventCallback = (payload?: any) => void; -export class QPushButton extends NodeWidget { +export class QPushButton extends EventNodeWidget { native: any; - private emitter: EventEmitter; constructor(parent?: NodeWidget) { - super(); + let native; if (parent) { - this.native = new addon.QPushButton(parent.native); - this.parent = parent; + native = new addon.QPushButton(parent.native); } else { - this.native = new addon.QPushButton(); + native = new addon.QPushButton(); } - this.emitter = new EventEmitter(); - this.native.setupEventListeners(this.emitter.emit.bind(this.emitter)); + super(native); + this.parent = parent; + this.native = native; } setText(text: string) { this.native.setText(text); } - setEventListener(eventType: QPushButtonEvents, callback: EventCallback) { - this.emitter.on(eventType, callback); - } } diff --git a/src/lib/core/Component/index.ts b/src/lib/core/Component/index.ts index 918bc8698..ff6543e29 100644 --- a/src/lib/core/Component/index.ts +++ b/src/lib/core/Component/index.ts @@ -1,5 +1,5 @@ export abstract class Component { protected children = new Set(); //TODO if react stub these as react will manage the instances from beings gc'ed better. - protected parent: Component | null = null; + protected parent?: Component; abstract native: any; } diff --git a/src/lib/core/EventNodeWidget/index.ts b/src/lib/core/EventNodeWidget/index.ts new file mode 100644 index 000000000..7a6d38b0b --- /dev/null +++ b/src/lib/core/EventNodeWidget/index.ts @@ -0,0 +1,19 @@ +import { NodeWidget } from "../../QtGui/QWidget"; +import { EventEmitter } from "events"; + +export abstract class EventNodeWidget extends NodeWidget { + private emitter: EventEmitter; + constructor(native: any) { + super(); + if (native.setupEventListeners) { + this.emitter = new EventEmitter(); + native.setupEventListeners(this.emitter.emit.bind(this.emitter)); + } else { + throw new Error("Event Listeners not implemented on native side"); + } + } + + setEventListener(eventType: string, callback: (payload?: any) => void) { + this.emitter.on(eventType, callback); + } +}