diff --git a/config/application.gypi b/config/application.gypi index ad39581d0..5f7f9003d 100644 --- a/config/application.gypi +++ b/config/application.gypi @@ -13,6 +13,7 @@ "../src/cpp/core/FlexLayout/flexlayout.cpp", "../src/cpp/core/FlexLayout/flexitem.cpp", "../src/cpp/core/YogaWidget/nodestyle.cpp", + "../src/cpp/core/Events/eventsmap.cpp", "../src/cpp/core/YogaWidget/yogawidget.cpp", # wrapped cpps "../src/cpp/QtGui/QApplication/qapplication_wrap.cpp", diff --git a/demo.ts b/demo.ts index 26af97119..fa904e6ae 100644 --- a/demo.ts +++ b/demo.ts @@ -71,7 +71,7 @@ const testFlexLayout = () => { const win = new QMainWindow(); win.setObjectName("win"); - win.resize(300,300); + win.resize(300, 300); const rootView = new QWidget(); rootView.setStyleSheet(` * { @@ -127,6 +127,10 @@ const testFlexLayout = () => { const button = new QPushButton(view2); button.setObjectName("button"); button.setText("Hululu"); + button.native.subscribeToEvent("MouseButtonPress"); + button.setSignalListener("MouseButtonPress", () => { + console.log("MouseButtonPress"); + }); flayout2.addWidget(button, button.getFlexNode()); rootLayout.addWidget(view, view.getFlexNode()); diff --git a/src/cpp/QtWidgets/QPushButton/npushbutton.h b/src/cpp/QtWidgets/QPushButton/npushbutton.h index 21af214c3..f1effddd9 100644 --- a/src/cpp/QtWidgets/QPushButton/npushbutton.h +++ b/src/cpp/QtWidgets/QPushButton/npushbutton.h @@ -4,13 +4,42 @@ #include #include "src/cpp/core/YogaWidget/yogawidget.h" #include "napi.h" +#include +#include +#include "src/cpp/core/Events/eventsmap.h" +#include class NPushButton: public QPushButton, public YogaWidget { public: + std::unique_ptr emitOnNode; SET_YOGA_WIDGET_Q_PROPERTIES using QPushButton::QPushButton; //inherit all constructors of QPushButton Q_OBJECT +public: + std::unordered_map subscribedEvents; + + void subscribeToEvent(std::string evtString){ + try { + int evtType = EventsMap::events.at(evtString); + this->subscribedEvents.insert({static_cast(evtType), evtString}); + } catch (...) { + qDebug()<< "Coudn't subscribe to event "<< evtString.c_str(); + } + } + bool event(QEvent* event){ + try { + QEvent::Type e = event->type(); + std::string eventTypeString = subscribedEvents.at(e); + this->emitOnNode->call([=](Napi::Env env, std::vector& args) { + args = { Napi::String::New(env, eventTypeString) }; + }); + } catch (...) {} + return QWidget::event(event); + } + ~NPushButton(){ + this->emitOnNode.release(); //cleanup instance->emitOnNode + } }; diff --git a/src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.cpp b/src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.cpp index 2f588d6d4..eb862934c 100644 --- a/src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.cpp +++ b/src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.cpp @@ -10,6 +10,7 @@ Napi::Object QPushButtonWrap::init(Napi::Env env, Napi::Object exports) { Napi::Function func = DefineClass(env, CLASSNAME, { InstanceMethod("setText", &QPushButtonWrap::setText), InstanceMethod("setupSignalListeners",&QPushButtonWrap::setupSignalListeners), + InstanceMethod("subscribeToEvent",&QPushButtonWrap::subscribeToEvent), QWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(QPushButtonWrap) }); constructor = Napi::Persistent(func); @@ -39,37 +40,42 @@ QPushButtonWrap::QPushButtonWrap(const Napi::CallbackInfo& info): Napi::ObjectWr } QPushButtonWrap::~QPushButtonWrap() { - this->emitOnNode.release(); //cleanup emitOnNode delete this->instance; } Napi::Value QPushButtonWrap::setupSignalListeners(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); - this->emitOnNode = std::make_unique(info[0].As()); + this->instance->emitOnNode = std::make_unique(info[0].As()); // Qt Connects: Implement all signal connects here QObject::connect(this->instance, &QPushButton::clicked, [=](bool checked) { - this->emitOnNode->call([=](Napi::Env env, std::vector& args) { + this->instance->emitOnNode->call([=](Napi::Env env, std::vector& args) { args = { Napi::String::New(env, "clicked"), Napi::Value::From(env, checked) }; }); }); QObject::connect(this->instance, &QPushButton::released, [=]() { - this->emitOnNode->call([=](Napi::Env env, std::vector& args) { + this->instance->emitOnNode->call([=](Napi::Env env, std::vector& args) { args = { Napi::String::New(env, "released") }; }); }); QObject::connect(this->instance, &QPushButton::pressed, [=]() { - this->emitOnNode->call([=](Napi::Env env, std::vector& args) { + this->instance->emitOnNode->call([=](Napi::Env env, std::vector& args) { args = { Napi::String::New(env, "pressed") }; }); }); QObject::connect(this->instance, &QPushButton::toggled, [=](bool checked) { - this->emitOnNode->call([=](Napi::Env env, std::vector& args) { + this->instance->emitOnNode->call([=](Napi::Env env, std::vector& args) { args = { Napi::String::New(env, "toggled"), Napi::Value::From(env, checked) }; }); }); return env.Null(); } +Napi::Value QPushButtonWrap::subscribeToEvent(const Napi::CallbackInfo& info){ + Napi::Env env = info.Env(); + Napi::String eventString = info[0].As(); + this->instance->subscribeToEvent(eventString.Utf8Value()); + return env.Null(); +} Napi::Value QPushButtonWrap::setText(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); diff --git a/src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.h b/src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.h index 3f164706b..866e5e0ae 100644 --- a/src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.h +++ b/src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include "npushbutton.h" #include "src/cpp/QtGui/QWidget/qwidget_macro.h" @@ -10,7 +9,7 @@ class QPushButtonWrap : public Napi::ObjectWrap { private: NPushButton* instance; - std::unique_ptr emitOnNode; + // std::unique_ptr emitOnNode; public: static Napi::Object init(Napi::Env env, Napi::Object exports); QPushButtonWrap(const Napi::CallbackInfo& info); @@ -21,6 +20,7 @@ class QPushButtonWrap : public Napi::ObjectWrap { static Napi::FunctionReference constructor; //wrapped methods Napi::Value setText(const Napi::CallbackInfo& info); + Napi::Value subscribeToEvent(const Napi::CallbackInfo& info); QWIDGET_WRAPPED_METHODS_DECLARATION diff --git a/src/cpp/core/Events/eventsmap.cpp b/src/cpp/core/Events/eventsmap.cpp new file mode 100644 index 000000000..564838f8d --- /dev/null +++ b/src/cpp/core/Events/eventsmap.cpp @@ -0,0 +1,149 @@ +#include "eventsmap.h" + +std::unordered_map EventsMap::events { + { "None", QEvent::None }, + { "ActionAdded", QEvent::ActionAdded }, + { "ActionChanged", QEvent::ActionChanged }, + { "ActionRemoved", QEvent::ActionRemoved }, + { "ActivationChange", QEvent::ActivationChange }, + { "ApplicationActivate", QEvent::ApplicationActivate }, + { "ApplicationActivated", QEvent::ApplicationActivated }, + { "ApplicationDeactivate", QEvent::ApplicationDeactivate }, + { "ApplicationFontChange", QEvent::ApplicationFontChange }, + { "ApplicationLayoutDirectionChange", QEvent::ApplicationLayoutDirectionChange }, + { "ApplicationPaletteChange", QEvent::ApplicationPaletteChange }, + { "ApplicationStateChange", QEvent::ApplicationStateChange }, + { "ApplicationWindowIconChange", QEvent::ApplicationWindowIconChange }, + { "ChildAdded", QEvent::ChildAdded }, + { "ChildPolished", QEvent::ChildPolished }, + { "ChildRemoved", QEvent::ChildRemoved }, + { "Clipboard", QEvent::Clipboard }, + { "Close", QEvent::Close }, + { "CloseSoftwareInputPanel", QEvent::CloseSoftwareInputPanel }, + { "ContentsRectChange", QEvent::ContentsRectChange }, + { "ContextMenu", QEvent::ContextMenu }, + { "CursorChange", QEvent::CursorChange }, + { "DeferredDelete", QEvent::DeferredDelete }, + { "DragEnter", QEvent::DragEnter }, + { "DragLeave", QEvent::DragLeave }, + { "DragMove", QEvent::DragMove }, + { "Drop", QEvent::Drop }, + { "DynamicPropertyChange", QEvent::DynamicPropertyChange }, + { "EnabledChange", QEvent::EnabledChange }, + { "Enter", QEvent::Enter }, + { "EnterWhatsThisMode", QEvent::EnterWhatsThisMode }, + { "Expose", QEvent::Expose }, + { "FileOpen", QEvent::FileOpen }, + { "FocusIn", QEvent::FocusIn }, + { "FocusOut", QEvent::FocusOut }, + { "FocusAboutToChange", QEvent::FocusAboutToChange }, + { "FontChange", QEvent::FontChange }, + { "Gesture", QEvent::Gesture }, + { "GestureOverride", QEvent::GestureOverride }, + { "GrabKeyboard", QEvent::GrabKeyboard }, + { "GrabMouse", QEvent::GrabMouse }, + { "GraphicsSceneContextMenu", QEvent::GraphicsSceneContextMenu }, + { "GraphicsSceneDragEnter", QEvent::GraphicsSceneDragEnter }, + { "GraphicsSceneDragLeave", QEvent::GraphicsSceneDragLeave }, + { "GraphicsSceneDragMove", QEvent::GraphicsSceneDragMove }, + { "GraphicsSceneDrop", QEvent::GraphicsSceneDrop }, + { "GraphicsSceneHelp", QEvent::GraphicsSceneHelp }, + { "GraphicsSceneHoverEnter", QEvent::GraphicsSceneHoverEnter }, + { "GraphicsSceneHoverLeave", QEvent::GraphicsSceneHoverLeave }, + { "GraphicsSceneHoverMove", QEvent::GraphicsSceneHoverMove }, + { "GraphicsSceneMouseDoubleClick", QEvent::GraphicsSceneMouseDoubleClick }, + { "GraphicsSceneMouseMove", QEvent::GraphicsSceneMouseMove }, + { "GraphicsSceneMousePress", QEvent::GraphicsSceneMousePress }, + { "GraphicsSceneMouseRelease", QEvent::GraphicsSceneMouseRelease }, + { "GraphicsSceneMove", QEvent::GraphicsSceneMove }, + { "GraphicsSceneResize", QEvent::GraphicsSceneResize }, + { "GraphicsSceneWheel", QEvent::GraphicsSceneWheel }, + { "Hide", QEvent::Hide }, + { "HideToParent", QEvent::HideToParent }, + { "HoverEnter", QEvent::HoverEnter }, + { "HoverLeave", QEvent::HoverLeave }, + { "HoverMove", QEvent::HoverMove }, + { "IconDrag", QEvent::IconDrag }, + { "IconTextChange", QEvent::IconTextChange }, + { "InputMethod", QEvent::InputMethod }, + { "InputMethodQuery", QEvent::InputMethodQuery }, + { "KeyboardLayoutChange", QEvent::KeyboardLayoutChange }, + { "KeyPress", QEvent::KeyPress }, + { "KeyRelease", QEvent::KeyRelease }, + { "LanguageChange", QEvent::LanguageChange }, + { "LayoutDirectionChange", QEvent::LayoutDirectionChange }, + { "LayoutRequest", QEvent::LayoutRequest }, + { "Leave", QEvent::Leave }, + { "LeaveWhatsThisMode", QEvent::LeaveWhatsThisMode }, + { "LocaleChange", QEvent::LocaleChange }, + { "NonClientAreaMouseButtonDblClick", QEvent::NonClientAreaMouseButtonDblClick }, + { "NonClientAreaMouseButtonPress", QEvent::NonClientAreaMouseButtonPress }, + { "NonClientAreaMouseButtonRelease", QEvent::NonClientAreaMouseButtonRelease }, + { "NonClientAreaMouseMove", QEvent::NonClientAreaMouseMove }, + { "MacSizeChange", QEvent::MacSizeChange }, + { "MetaCall", QEvent::MetaCall }, + { "ModifiedChange", QEvent::ModifiedChange }, + { "MouseButtonDblClick", QEvent::MouseButtonDblClick }, + { "MouseButtonPress", QEvent::MouseButtonPress }, + { "MouseButtonRelease", QEvent::MouseButtonRelease }, + { "MouseMove", QEvent::MouseMove }, + { "MouseTrackingChange", QEvent::MouseTrackingChange }, + { "Move", QEvent::Move }, + { "NativeGesture", QEvent::NativeGesture }, + { "OrientationChange", QEvent::OrientationChange }, + { "Paint", QEvent::Paint }, + { "PaletteChange", QEvent::PaletteChange }, + { "ParentAboutToChange", QEvent::ParentAboutToChange }, + { "ParentChange", QEvent::ParentChange }, + { "PlatformPanel", QEvent::PlatformPanel }, + { "PlatformSurface", QEvent::PlatformSurface }, + { "Polish", QEvent::Polish }, + { "PolishRequest", QEvent::PolishRequest }, + { "QueryWhatsThis", QEvent::QueryWhatsThis }, + { "ReadOnlyChange", QEvent::ReadOnlyChange }, + { "RequestSoftwareInputPanel", QEvent::RequestSoftwareInputPanel }, + { "Resize", QEvent::Resize }, + { "ScrollPrepare", QEvent::ScrollPrepare }, + { "Scroll", QEvent::Scroll }, + { "Shortcut", QEvent::Shortcut }, + { "ShortcutOverride", QEvent::ShortcutOverride }, + { "Show", QEvent::Show }, + { "ShowToParent", QEvent::ShowToParent }, + { "SockAct", QEvent::SockAct }, + { "StateMachineSignal", QEvent::StateMachineSignal }, + { "StateMachineWrapped", QEvent::StateMachineWrapped }, + { "StatusTip", QEvent::StatusTip }, + { "StyleChange", QEvent::StyleChange }, + { "TabletMove", QEvent::TabletMove }, + { "TabletPress", QEvent::TabletPress }, + { "TabletRelease", QEvent::TabletRelease }, + { "TabletEnterProximity", QEvent::TabletEnterProximity }, + { "TabletLeaveProximity", QEvent::TabletLeaveProximity }, + { "TabletTrackingChange", QEvent::TabletTrackingChange }, + { "ThreadChange", QEvent::ThreadChange }, + { "Timer", QEvent::Timer }, + { "ToolBarChange", QEvent::ToolBarChange }, + { "ToolTip", QEvent::ToolTip }, + { "ToolTipChange", QEvent::ToolTipChange }, + { "TouchBegin", QEvent::TouchBegin }, + { "TouchCancel", QEvent::TouchCancel }, + { "TouchEnd", QEvent::TouchEnd }, + { "TouchUpdate", QEvent::TouchUpdate }, + { "UngrabKeyboard", QEvent::UngrabKeyboard }, + { "UngrabMouse", QEvent::UngrabMouse }, + { "UpdateLater", QEvent::UpdateLater }, + { "UpdateRequest", QEvent::UpdateRequest }, + { "WhatsThis", QEvent::WhatsThis }, + { "WhatsThisClicked", QEvent::WhatsThisClicked }, + { "Wheel", QEvent::Wheel }, + { "WinEventAct", QEvent::WinEventAct }, + { "WindowActivate", QEvent::WindowActivate }, + { "WindowBlocked", QEvent::WindowBlocked }, + { "WindowDeactivate", QEvent::WindowDeactivate }, + { "WindowIconChange", QEvent::WindowIconChange }, + { "WindowStateChange", QEvent::WindowStateChange }, + { "WindowTitleChange", QEvent::WindowTitleChange }, + { "WindowUnblocked", QEvent::WindowUnblocked }, + { "WinIdChange", QEvent::WinIdChange }, + { "ZOrderChange", QEvent::ZOrderChange }, + }; \ No newline at end of file diff --git a/src/cpp/core/Events/eventsmap.h b/src/cpp/core/Events/eventsmap.h index e69de29bb..7ab67dd7e 100644 --- a/src/cpp/core/Events/eventsmap.h +++ b/src/cpp/core/Events/eventsmap.h @@ -0,0 +1,8 @@ +#pragma once +#include +#include + +class EventsMap { + public: + static std::unordered_map events; +}; \ No newline at end of file diff --git a/src/cpp/core/YogaWidget/nodestyle.h b/src/cpp/core/YogaWidget/nodestyle.h index 39437bb68..fe34cc000 100644 --- a/src/cpp/core/YogaWidget/nodestyle.h +++ b/src/cpp/core/YogaWidget/nodestyle.h @@ -11,7 +11,6 @@ */ - struct NodeValueUnit{ YGUnit unit; float value;