From 4dfe36cdc160a6cac6a7bfd01f4e68cb6d35aeeb Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Fri, 7 Dec 2012 18:34:43 +0100 Subject: [PATCH] Canvas: Fix handling drag events and some cleanup. --- simgear/canvas/CanvasEventManager.cxx | 57 +++++++++++++++++++++++++-- simgear/canvas/CanvasEventManager.hxx | 11 ++---- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/simgear/canvas/CanvasEventManager.cxx b/simgear/canvas/CanvasEventManager.cxx index da10ba5f..d7135f80 100644 --- a/simgear/canvas/CanvasEventManager.cxx +++ b/simgear/canvas/CanvasEventManager.cxx @@ -28,6 +28,38 @@ namespace canvas const unsigned int drag_threshold = 8; const double multi_click_timeout = 0.4; + //---------------------------------------------------------------------------- + EventManager::StampedPropagationPath::StampedPropagationPath(): + time(0) + { + + } + + //---------------------------------------------------------------------------- + + EventManager::StampedPropagationPath::StampedPropagationPath( + const EventPropagationPath& path, + double time + ): + path(path), + time(time) + { + + } + + //---------------------------------------------------------------------------- + void EventManager::StampedPropagationPath::clear() + { + path.clear(); + time = 0; + } + + //---------------------------------------------------------------------------- + bool EventManager::StampedPropagationPath::valid() const + { + return !path.empty() && time > 0; + } + //---------------------------------------------------------------------------- EventManager::EventManager(): _current_click_count(0) @@ -39,7 +71,6 @@ namespace canvas bool EventManager::handleEvent( const MouseEventPtr& event, const EventPropagationPath& path ) { - propagateEvent(event, path); switch( event->type ) { case Event::MOUSE_DOWN: @@ -51,16 +82,30 @@ namespace canvas // Ignore mouse up without any previous mouse down return false; + // normal mouseup + propagateEvent(event, path); + + // now handle click/dblclick if( checkClickDistance(path, _last_mouse_down.path) ) handleClick(event, getCommonAncestor(_last_mouse_down.path, path)); - break; + _last_mouse_down.clear(); + + return true; } + case Event::DRAG: + if( !_last_mouse_down.valid() ) + return false; + else + return propagateEvent(event, _last_mouse_down.path); + case Event::WHEEL: + case Event::MOUSE_MOVE: + break; default: return false; } - return true; + return propagateEvent(event, path); } //---------------------------------------------------------------------------- @@ -135,8 +180,12 @@ namespace canvas // (eg. removed by another event handler) continue; - if( mouse_event ) + if( mouse_event && event->type != Event::DRAG ) { + // TODO transform pos and delta for drag events. Maybe we should just + // store the global coordinates and convert to local coordinates + // on demand. + // Position and delta are specified in local coordinate system of // current element mouse_event->pos = it->local_pos; diff --git a/simgear/canvas/CanvasEventManager.hxx b/simgear/canvas/CanvasEventManager.hxx index f8e80571..8ec3cf7e 100644 --- a/simgear/canvas/CanvasEventManager.hxx +++ b/simgear/canvas/CanvasEventManager.hxx @@ -46,14 +46,11 @@ namespace canvas protected: struct StampedPropagationPath { - StampedPropagationPath(): - time(0) - {} + StampedPropagationPath(); + StampedPropagationPath(const EventPropagationPath& path, double time); - StampedPropagationPath(const EventPropagationPath& path, double time): - path(path), - time(time) - {} + void clear(); + bool valid() const; EventPropagationPath path; double time;