From 5b74a725068b42668d8adfe852defed53031e14c Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Mon, 19 May 2014 00:25:34 +0200 Subject: [PATCH] Canvas: support for custom events and event dispatching. --- src/GUI/CanvasWidget.cxx | 2 +- src/Scripting/NasalCanvas.cxx | 79 ++++++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/GUI/CanvasWidget.cxx b/src/GUI/CanvasWidget.cxx index 160a3590b..f68fe22e4 100644 --- a/src/GUI/CanvasWidget.cxx +++ b/src/GUI/CanvasWidget.cxx @@ -27,7 +27,7 @@ #include #include -#include +#include //------------------------------------------------------------------------------ CanvasWidget::CanvasWidget( int x, int y, diff --git a/src/Scripting/NasalCanvas.cxx b/src/Scripting/NasalCanvas.cxx index 8e7ec5fe8..0c705e230 100644 --- a/src/Scripting/NasalCanvas.cxx +++ b/src/Scripting/NasalCanvas.cxx @@ -36,7 +36,8 @@ #include #include #include -#include +#include +#include #include #include @@ -54,7 +55,13 @@ naRef elementGetNode(Element& element, naContext c) } typedef nasal::Ghost NasalEvent; +typedef nasal::Ghost NasalCustomEvent; typedef nasal::Ghost NasalMouseEvent; + +struct CustomEventDetailWrapper; +typedef SGSharedPtr CustomEventDetailPtr; +typedef nasal::Ghost NasalCustomEventDetail; + typedef nasal::Ghost NasalCanvas; typedef nasal::Ghost NasalElement; typedef nasal::Ghost NasalGroup; @@ -201,6 +208,64 @@ naRef f_eventGetModifier(sc::MouseEvent& event, naContext) return naNum((event.getModifiers() & Mask) != 0); } +static naRef f_createCustomEvent(const nasal::CallContext& ctx) +{ + std::string const& type = ctx.requireArg(0); + if( type.empty() ) + return naNil(); + + simgear::StringMap data = ctx.getArg(1); + return NasalCustomEvent::create( + ctx.c, + sc::CustomEventPtr(new sc::CustomEvent(type, data)) + ); +} + +struct CustomEventDetailWrapper: + public SGReferenced +{ + sc::CustomEventPtr _event; + + CustomEventDetailWrapper(const sc::CustomEventPtr& event): + _event(event) + { + + } + + bool _get( const std::string& key, + std::string& value_out ) const + { + if( !_event ) + return false; + + simgear::StringMap::const_iterator it = _event->detail.find(key); + if( it == _event->detail.end() ) + return false; + + value_out = it->second; + return true; + } + + bool _set( const std::string& key, + const std::string& value ) + { + if( !_event ) + return false; + + _event->detail[ key ] = value; + return true; + } +}; + +static naRef f_customEventGetDetail( sc::CustomEvent& event, + naContext c ) +{ + return nasal::to_nasal( + c, + CustomEventDetailPtr(new CustomEventDetailWrapper(&event)) + ); +} + naRef to_nasal_helper(naContext c, const sc::ElementWeakPtr& el) { return NasalElement::create(c, el.lock()); @@ -214,6 +279,14 @@ naRef initNasalCanvas(naRef globals, naContext c) .member("target", &sc::Event::getTarget) .member("currentTarget", &sc::Event::getCurrentTarget) .method("stopPropagation", &sc::Event::stopPropagation); + + NasalCustomEvent::init("canvas.CustomEvent") + .bases() + .member("detail", &f_customEventGetDetail, &sc::CustomEvent::setDetail); + NasalCustomEventDetail::init("canvas.CustomEventDetail") + ._get(&CustomEventDetailWrapper::_get) + ._set(&CustomEventDetailWrapper::_set); + NasalMouseEvent::init("canvas.MouseEvent") .bases() .member("screenX", &sc::MouseEvent::getScreenX) @@ -232,6 +305,7 @@ naRef initNasalCanvas(naRef globals, naContext c) .member("altKey", &f_eventGetModifier) .member("metaKey", &f_eventGetModifier) .member("click_count", &sc::MouseEvent::getCurrentClickCount); + NasalCanvas::init("Canvas") .member("_node_ghost", &elementGetNode) .member("size_x", &sc::Canvas::getSizeX) @@ -243,6 +317,7 @@ naRef initNasalCanvas(naRef globals, naContext c) .member("_node_ghost", &elementGetNode) .method("_getParent", &sc::Element::getParent) .method("addEventListener", &sc::Element::addEventListener) + .method("dispatchEvent", &sc::Element::dispatchEvent) .method("getBoundingBox", &sc::Element::getBoundingBox) .method("getTightBoundingBox", &sc::Element::getTightBoundingBox); NasalGroup::init("canvas.Group") @@ -267,5 +342,7 @@ naRef initNasalCanvas(naRef globals, naContext c) canvas_module.set("_getCanvasGhost", f_getCanvas); canvas_module.set("_getDesktopGhost", f_getDesktop); + canvas_module.createHash("CustomEvent") + .set("new", &f_createCustomEvent); return naNil(); } -- 2.39.5