From 790fec5fd6ed8cb7572a833e59d29287632b4387 Mon Sep 17 00:00:00 2001 From: Atul R Date: Thu, 11 Jul 2019 00:29:55 +0200 Subject: [PATCH] adds removeEventListener and cleanup --- src/cpp/core/Events/eventwidget.cpp | 14 ++++++++++++-- src/cpp/core/Events/eventwidget.h | 1 + src/cpp/core/Events/eventwidget_macro.h | 7 +++++++ src/lib/QtGui/QWidget/index.ts | 4 +++- src/lib/core/EventWidget/index.ts | 16 +++++++++++++++- src/lib/index.ts | 14 +++++++------- 6 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/cpp/core/Events/eventwidget.cpp b/src/cpp/core/Events/eventwidget.cpp index 654647e99..d2318cda2 100644 --- a/src/cpp/core/Events/eventwidget.cpp +++ b/src/cpp/core/Events/eventwidget.cpp @@ -6,18 +6,28 @@ void EventWidget::subscribeToQtEvent(std::string evtString){ try { int evtType = EventsMap::eventTypes.at(evtString); this->subscribedEvents.insert({static_cast(evtType), evtString}); - spdlog::info("EventWidget: subscribed to {}", evtString.c_str()); + spdlog::info("EventWidget: subscribed to {} : {}, size: {}", evtString.c_str(), evtType, subscribedEvents.size()); } catch (...) { spdlog::info("EventWidget: Couldn't subscribe to qt event {}. If this is a signal you can safely ignore this warning", evtString.c_str()); } } +void EventWidget::unSubscribeToQtEvent(std::string evtString){ + try { + int evtType = EventsMap::eventTypes.at(evtString); + this->subscribedEvents.erase(static_cast(evtType)); // erasing by key + spdlog::info("EventWidget: unsubscribed to {} : {}", evtString.c_str(), evtType); + } catch (...) { + spdlog::info("EventWidget: Couldn't unsubscribe to qt event {}. If this is a signal you can safely ignore this warning", evtString.c_str()); + } +} + void EventWidget::event(QEvent* event){ if(this->emitOnNode){ try { QEvent::Type evtType = event->type(); std::string eventTypeString = subscribedEvents.at(evtType); - + spdlog::info("event: {}", eventTypeString); Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); diff --git a/src/cpp/core/Events/eventwidget.h b/src/cpp/core/Events/eventwidget.h index 6c63b0ab9..419b97640 100644 --- a/src/cpp/core/Events/eventwidget.h +++ b/src/cpp/core/Events/eventwidget.h @@ -10,6 +10,7 @@ public: std::unordered_map subscribedEvents; void subscribeToQtEvent(std::string evtString); + void unSubscribeToQtEvent(std::string evtString); void event(QEvent* event); diff --git a/src/cpp/core/Events/eventwidget_macro.h b/src/cpp/core/Events/eventwidget_macro.h index b8eceb97b..a5bc323e8 100644 --- a/src/cpp/core/Events/eventwidget_macro.h +++ b/src/cpp/core/Events/eventwidget_macro.h @@ -25,6 +25,12 @@ Napi::Value subscribeToQtEvent(const Napi::CallbackInfo& info){ \ this->instance->subscribeToQtEvent(eventString.Utf8Value()); \ return env.Null(); \ } \ +Napi::Value unSubscribeToQtEvent(const Napi::CallbackInfo& info){ \ + Napi::Env env = info.Env(); \ + Napi::String eventString = info[0].As(); \ + this->instance->unSubscribeToQtEvent(eventString.Utf8Value()); \ + return env.Null(); \ +} \ #endif //EVENTWIDGET_WRAPPED_METHODS_DECLARATION @@ -33,6 +39,7 @@ Napi::Value subscribeToQtEvent(const Napi::CallbackInfo& info){ \ \ InstanceMethod("initNodeEventEmitter",&WidgetWrapName::initNodeEventEmitter), \ InstanceMethod("subscribeToQtEvent",&WidgetWrapName::subscribeToQtEvent), \ + InstanceMethod("unSubscribeToQtEvent",&WidgetWrapName::unSubscribeToQtEvent), \ #endif // EVENTWIDGET_WRAPPED_METHODS_EXPORT_DEFINE diff --git a/src/lib/QtGui/QWidget/index.ts b/src/lib/QtGui/QWidget/index.ts index f1a567d11..361d9b614 100644 --- a/src/lib/QtGui/QWidget/index.ts +++ b/src/lib/QtGui/QWidget/index.ts @@ -1,6 +1,6 @@ import addon from "../../core/addon"; import { NodeLayout } from "../../QtWidgets/QLayout"; -import { EventWidget } from "../../core/EventWidget"; +import { EventWidget, BaseWidgetEvents } from "../../core/EventWidget"; import { NativeElement } from "../../core/Component"; // All Widgets should extend from NodeWidget @@ -46,3 +46,5 @@ export class QWidget extends NodeWidget { this.native = native; } } + +export const QWidgetEvents = BaseWidgetEvents; diff --git a/src/lib/core/EventWidget/index.ts b/src/lib/core/EventWidget/index.ts index 55899dfc6..66fdeaafe 100644 --- a/src/lib/core/EventWidget/index.ts +++ b/src/lib/core/EventWidget/index.ts @@ -20,7 +20,21 @@ export abstract class EventWidget extends YogaWidget { callback: (payload?: NativeEvent | any) => void ) => { this.native.subscribeToQtEvent(eventType); - this.emitter.on(eventType, callback); + this.emitter.addListener(eventType, callback); + }; + + removeEventListener = ( + eventType: string, + callback?: (payload?: NativeEvent | any) => void + ) => { + if (callback) { + this.emitter.removeListener(eventType, callback); + } else { + this.emitter.removeAllListeners(eventType); + } + if (this.emitter.listenerCount(eventType) < 1) { + this.native.unSubscribeToQtEvent(eventType); + } }; } diff --git a/src/lib/index.ts b/src/lib/index.ts index 835d1668a..cc5b630bc 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1,16 +1,16 @@ export { QApplication } from "./QtGui/QApplication"; -export { QWidget } from "./QtGui/QWidget"; +export { QWidget, QWidgetEvents } from "./QtGui/QWidget"; // Abstract: export { NodeWidget } from "./QtGui/QWidget"; export { NodeLayout } from "./QtWidgets/QLayout"; // Widgets: -export { QCheckBox } from "./QtWidgets/QCheckBox"; -export { QLabel } from "./QtWidgets/QLabel"; -export { QLineEdit } from "./QtWidgets/QLineEdit"; +export { QCheckBox, QCheckBoxEvents } from "./QtWidgets/QCheckBox"; +export { QLabel, QLabelEvents } from "./QtWidgets/QLabel"; +export { QLineEdit, QLineEditEvents } from "./QtWidgets/QLineEdit"; export { QMainWindow } from "./QtWidgets/QMainWindow"; -export { QProgressBar } from "./QtWidgets/QProgressBar"; -export { QPushButton } from "./QtWidgets/QPushButton"; -export { QRadioButton } from "./QtWidgets/QRadioButton"; +export { QProgressBar, QProgressBarEvents } from "./QtWidgets/QProgressBar"; +export { QPushButton, QPushButtonEvents } from "./QtWidgets/QPushButton"; +export { QRadioButton, QRadioButtonEvents } from "./QtWidgets/QRadioButton"; // Layouts: export { QGridLayout } from "./QtWidgets/QGridLayout"; export { FlexLayout } from "./core/FlexLayout";