From f6270ec395d84946e97d17aed09dae5b02ccff05 Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Sun, 16 Dec 2012 18:52:20 +0100 Subject: [PATCH] Canvas: create mouseover/mouseout events --- simgear/canvas/CanvasEventManager.cxx | 32 ++++++++++++++++++++++++++- simgear/canvas/CanvasEventManager.hxx | 13 ++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/simgear/canvas/CanvasEventManager.cxx b/simgear/canvas/CanvasEventManager.cxx index 53da08d1..89f25719 100644 --- a/simgear/canvas/CanvasEventManager.cxx +++ b/simgear/canvas/CanvasEventManager.cxx @@ -98,8 +98,14 @@ namespace canvas return false; else return propagateEvent(event, _last_mouse_down.path); - case Event::WHEEL: case Event::MOUSE_MOVE: + handleMove(event, path); + break; + case Event::MOUSE_LEAVE: + // Mouse leaves window and therefore also current mouseover element + handleMove(event, EventPropagationPath()); + return true; + case Event::WHEEL: break; default: return false; @@ -147,6 +153,30 @@ namespace canvas _last_click = StampedPropagationPath(path, event->getTime()); } + //---------------------------------------------------------------------------- + void EventManager::handleMove( const MouseEventPtr& event, + const EventPropagationPath& path ) + { + if( _last_mouse_over.path == path ) + return; + + if( !_last_mouse_over.path.empty() ) + { + MouseEventPtr mouseout(new MouseEvent(*event)); + mouseout->type = Event::MOUSE_OUT; + propagateEvent(mouseout, _last_mouse_over.path); + } + + if( !path.empty() ) + { + MouseEventPtr mouseover(new MouseEvent(*event)); + mouseover->type = Event::MOUSE_OVER; + propagateEvent(mouseover, path); + } + + _last_mouse_over.path = path; + } + //---------------------------------------------------------------------------- bool EventManager::propagateEvent( const EventPtr& event, const EventPropagationPath& path ) diff --git a/simgear/canvas/CanvasEventManager.hxx b/simgear/canvas/CanvasEventManager.hxx index 8ec3cf7e..d0504c10 100644 --- a/simgear/canvas/CanvasEventManager.hxx +++ b/simgear/canvas/CanvasEventManager.hxx @@ -34,6 +34,10 @@ namespace canvas local_delta; }; typedef std::deque EventPropagationPath; + inline bool operator==(const EventTarget& t1, const EventTarget& t2) + { + return t1.element.lock() == t2.element.lock(); + } class EventManager { @@ -59,7 +63,8 @@ namespace canvas // TODO if we really need the paths modify to not copy around the paths // that much. StampedPropagationPath _last_mouse_down, - _last_click; + _last_click, + _last_mouse_over; size_t _current_click_count; /** @@ -68,6 +73,12 @@ namespace canvas void handleClick( const MouseEventPtr& event, const EventPropagationPath& path ); + /** + * Handle mouseover/enter/out/leave + */ + void handleMove( const MouseEventPtr& event, + const EventPropagationPath& path ); + bool propagateEvent( const EventPtr& event, const EventPropagationPath& path ); -- 2.39.5