From 0b21181f1ae64f637faf3546556db43f8708e0b8 Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Thu, 29 May 2014 16:34:33 +0200 Subject: [PATCH] Canvas: allow dispatching events to Canavs itself --- simgear/canvas/Canvas.cxx | 11 +++++++++- simgear/canvas/Canvas.hxx | 1 + simgear/canvas/elements/CanvasElement.cxx | 25 +++++++++++++++++++---- simgear/canvas/elements/CanvasElement.hxx | 7 ++++--- simgear/canvas/elements/CanvasImage.cxx | 3 +-- simgear/canvas/elements/CanvasImage.hxx | 2 +- 6 files changed, 38 insertions(+), 11 deletions(-) diff --git a/simgear/canvas/Canvas.cxx b/simgear/canvas/Canvas.cxx index 8b02f49c..46f2e27f 100644 --- a/simgear/canvas/Canvas.cxx +++ b/simgear/canvas/Canvas.cxx @@ -326,11 +326,20 @@ namespace canvas const EventListener& cb ) { if( !_root_group.get() ) - throw std::runtime_error("Canvas::AddEventListener: no root group!"); + throw std::runtime_error("Canvas::addEventListener: no root group!"); return _root_group->addEventListener(type, cb); } + //---------------------------------------------------------------------------- + bool Canvas::dispatchEvent(const EventPtr& event) + { + if( !_root_group.get() ) + throw std::runtime_error("Canvas::dispatchEvent: no root group!"); + + return _root_group->dispatchEvent(event); + } + //---------------------------------------------------------------------------- void Canvas::setSizeX(int sx) { diff --git a/simgear/canvas/Canvas.hxx b/simgear/canvas/Canvas.hxx index 335b297d..10872f22 100644 --- a/simgear/canvas/Canvas.hxx +++ b/simgear/canvas/Canvas.hxx @@ -132,6 +132,7 @@ namespace canvas void update(double delta_time_sec); bool addEventListener(const std::string& type, const EventListener& cb); + bool dispatchEvent(const EventPtr& event); void setSizeX(int sx); void setSizeY(int sy); diff --git a/simgear/canvas/elements/CanvasElement.cxx b/simgear/canvas/elements/CanvasElement.cxx index 61239d4d..af378e28 100644 --- a/simgear/canvas/elements/CanvasElement.cxx +++ b/simgear/canvas/elements/CanvasElement.cxx @@ -159,11 +159,17 @@ namespace canvas } //---------------------------------------------------------------------------- - ElementPtr Element::getParent() + ElementPtr Element::getParent() const { return _parent; } + //---------------------------------------------------------------------------- + CanvasWeakPtr Element::getCanvas() const + { + return _canvas; + } + //---------------------------------------------------------------------------- void Element::update(double dt) { @@ -246,20 +252,31 @@ namespace canvas } //---------------------------------------------------------------------------- - bool Element::handleEvent(EventPtr event) + bool Element::handleEvent(const EventPtr& event) { ListenerMap::iterator listeners = _listener.find(event->getType()); if( listeners == _listener.end() ) return false; BOOST_FOREACH(EventListener const& listener, listeners->second) - listener(event); + try + { + listener(event); + } + catch( std::exception const& ex ) + { + SG_LOG( + SG_GENERAL, + SG_WARN, + "canvas::Element: event handler error: '" << ex.what() << "'" + ); + } return true; } //---------------------------------------------------------------------------- - bool Element::dispatchEvent(EventPtr event) + bool Element::dispatchEvent(const EventPtr& event) { EventPropagationPath path; path.push_back( EventTarget(this) ); diff --git a/simgear/canvas/elements/CanvasElement.hxx b/simgear/canvas/elements/CanvasElement.hxx index 87548c68..01858f4b 100644 --- a/simgear/canvas/elements/CanvasElement.hxx +++ b/simgear/canvas/elements/CanvasElement.hxx @@ -95,7 +95,8 @@ namespace canvas virtual ~Element() = 0; virtual void onDestroy(); - ElementPtr getParent(); + ElementPtr getParent() const; + CanvasWeakPtr getCanvas() const; /** * Called every frame to update internal state @@ -111,8 +112,8 @@ namespace canvas virtual bool ascend(EventVisitor& visitor); virtual bool traverse(EventVisitor& visitor); - virtual bool handleEvent(EventPtr event); - bool dispatchEvent(EventPtr event); + virtual bool handleEvent(const EventPtr& event); + bool dispatchEvent(const EventPtr& event); /** * diff --git a/simgear/canvas/elements/CanvasImage.cxx b/simgear/canvas/elements/CanvasImage.cxx index 8577459f..03079f11 100644 --- a/simgear/canvas/elements/CanvasImage.cxx +++ b/simgear/canvas/elements/CanvasImage.cxx @@ -441,7 +441,7 @@ namespace canvas } //---------------------------------------------------------------------------- - bool Image::handleEvent(EventPtr event) + bool Image::handleEvent(const EventPtr& event) { bool handled = Element::handleEvent(event); @@ -453,7 +453,6 @@ namespace canvas if( mouse_event ) { mouse_event.reset( new MouseEvent(*mouse_event) ); - event = mouse_event; mouse_event->client_pos = mouse_event->local_pos - toOsg(_region.getMin()); diff --git a/simgear/canvas/elements/CanvasImage.hxx b/simgear/canvas/elements/CanvasImage.hxx index c9e3c081..eb730fc5 100644 --- a/simgear/canvas/elements/CanvasImage.hxx +++ b/simgear/canvas/elements/CanvasImage.hxx @@ -85,7 +85,7 @@ namespace canvas const SGRect& getRegion() const; - bool handleEvent(EventPtr event); + bool handleEvent(const EventPtr& event); protected: -- 2.39.5